# info.description
REST API for programmatic configuration management. Authenticated with Ours Privacy API keys.

# paths./rest/v1/destinations.get.description
List all destinations. Requires scope: destination:list

# paths./rest/v1/destinations.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/destinations.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/destinations.get.parameters[].schema.description
Filter destinations by destination type.

# paths./rest/v1/destinations.get.responses.200.content.application/json.schema.properties.entities.items.properties.type.description
Destination type. Read responses may include warehouse, cloud-storage, and audience-sync types that are not creatable through POST /rest/v1/destinations.

# paths./rest/v1/destinations.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/destinations.post.description
Create a new destination. Requires scope: destination:create

# paths./rest/v1/destinations.post.requestBody.content.application/json.schema.properties.type.description
Event-dispatch destination type to create. Warehouse, cloud-storage, and audience-sync destination types may appear on read responses but are not creatable through POST. Audience destinations receive audience membership from Audience Builder on a daily schedule and are configured in the dashboard.

# paths./rest/v1/destinations.post.requestBody.content.application/json.schema.properties.settings.description
Per-type configuration keys and values. Call GET /rest/v1/destinations/types to get the valid keys for your destination type.

# paths./rest/v1/destinations.post.responses.200.content.application/json.schema.properties.type.description
Destination type. Read responses may include warehouse, cloud-storage, and audience-sync types that are not creatable through POST /rest/v1/destinations.

# paths./rest/v1/destinations.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/destinations/{id}.get.description
Find a single destination by ID. Requires scope: destination:find

# paths./rest/v1/destinations/{id}.get.responses.200.content.application/json.schema.properties.type.description
Destination type. Read responses may include warehouse, cloud-storage, and audience-sync types that are not creatable through POST /rest/v1/destinations.

# paths./rest/v1/destinations/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/destinations/{id}.patch.description
Partially update a destination. Only the fields you send are changed; omitted fields are unchanged. The `settings` object is patch-only: omitted keys keep their current value, and send `null` to clear a specific setting. Requires scope: destination:update

# paths./rest/v1/destinations/{id}.patch.requestBody.content.application/json.schema.properties.id.description
Server-assigned read-only field. Accepted on PATCH and ignored to support GET -> PATCH round-trips.

# paths./rest/v1/destinations/{id}.patch.requestBody.content.application/json.schema.properties.createdAt.description
Server-assigned read-only field. Accepted on PATCH and ignored to support GET -> PATCH round-trips.

# paths./rest/v1/destinations/{id}.patch.requestBody.content.application/json.schema.properties.updatedAt.description
Server-assigned read-only field. Accepted on PATCH and ignored to support GET -> PATCH round-trips.

# paths./rest/v1/destinations/{id}.patch.requestBody.content.application/json.schema.properties.type.description
Server-assigned read-only field. Accepted on PATCH and ignored to support GET -> PATCH round-trips.

# paths./rest/v1/destinations/{id}.patch.requestBody.content.application/json.schema.properties.settings.description
Per-type configuration keys and values. Call GET /rest/v1/destinations/types to get the valid keys for your destination type.

# paths./rest/v1/destinations/{id}.patch.responses.200.content.application/json.schema.properties.type.description
Destination type. Read responses may include warehouse, cloud-storage, and audience-sync types that are not creatable through POST /rest/v1/destinations.

# paths./rest/v1/destinations/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/destinations/{id}.delete.description
Delete a destination. Requires scope: destination:delete

# paths./rest/v1/destinations/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/destinations/types.get.description
Lists every destination type the platform supports, with its human-readable label, capability flags (oauth, listsAccounts, supportsRenamedEvents), and the settings descriptor used to configure a destination of that type. Account-agnostic — the response is the same for every API key. Filter client-side to find a specific type (e.g. `Klaviyo`, `Facebook`). Requires scope: destination:list

# paths./rest/v1/destinations/types.get.responses.200.description
Destination types with settings descriptors and capabilities

# paths./rest/v1/destinations/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.settings.items.anyOf[].properties.label.description
Informational display message only. Do not send this key in POST or PATCH settings.

# paths./rest/v1/destinations/types.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations/types.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/destinations/{id}/health.get.description
Snapshot of dispatch health for this destination over the trailing 24 hours: counts of succeeded, failed, and intentionally stopped/blocked dispatches, plus a derived `status`. Requires scope: destination:find

# paths./rest/v1/destinations/{id}/health.get.responses.200.description
Dispatch health snapshot for the destination

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.status.description
HEALTHY (>=95% of decisive dispatches succeeded), DEGRADED (50-95%), UNHEALTHY (<50%), or NO_DATA (no succeeded/failed dispatches in the window).

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.windowStart.description
Start of the snapshot window (ISO 8601).

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.totalDispatches.description
All dispatch attempts in the window, including stopped/blocked ones.

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.stoppedCount.description
Dispatches intentionally stopped before send (not a failure).

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.globalStopCount.description
Dispatches blocked by an account-wide dispatch rule (not a failure).

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.successRate.description
successCount / (successCount + failureCount). Null when there were no succeeded/failed dispatches in the window.

# paths./rest/v1/destinations/{id}/health.get.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
Timestamp of the most recent dispatch attempt to this destination, if any.

# paths./rest/v1/destinations/{id}/health.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/destinations/{id}/health.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/sources.get.description
List all sources for this account. Supports cursor pagination and optional filters for `type`, `status`, and `nameContains`. Results are sorted by creation date descending. Requires scope: source:list

# paths./rest/v1/sources.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/sources.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/sources.get.parameters[].schema.description
Case-insensitive substring filter on the source name.

# paths./rest/v1/sources.get.responses.200.content.application/json.schema.properties.entities.items.properties.isPublished.description
Whether this source exists in the currently published version. A source that is not published will not accept events.

# paths./rest/v1/sources.get.responses.200.content.application/json.schema.properties.entities.items.properties.lastTriggeredAt.description
ISO-8601 timestamp of the most recent inbound request received by this source. Useful for debugging "is my webhook even reaching us?"

# paths./rest/v1/sources.get.responses.200.content.application/json.schema.properties.entities.items.properties.lastDispatchedAt.description
ISO-8601 timestamp of the most recent event from this source successfully dispatched to a destination.

# paths./rest/v1/sources.get.responses.200.content.application/json.schema.properties.entities.items.properties.whitelistDomains.description
Limits which domains can send events to the CDP. When set, only requests from these domains are accepted for this source. Separate from experiment settings `whitelistDomains`, which limits which domains can load your experiments.

# paths./rest/v1/sources.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/sources.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/sources.post.description
Create a new source. Returns the full source entity (same shape as GET /sources/{id}) so callers can read all server-assigned fields without a follow-up GET. Requires scope: source:create

# paths./rest/v1/sources.post.requestBody.content.application/json.schema.properties.redirectUrl.description
Destination URL for a RedirectSource (short link). Ignored by other source types. Must be a valid http(s) URL.

# paths./rest/v1/sources.post.responses.200.content.application/json.schema.properties.isPublished.description
Whether this source exists in the currently published version. A source that is not published will not accept events.

# paths./rest/v1/sources.post.responses.200.content.application/json.schema.properties.lastTriggeredAt.description
ISO-8601 timestamp of the most recent inbound request received by this source. Useful for debugging "is my webhook even reaching us?"

# paths./rest/v1/sources.post.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
ISO-8601 timestamp of the most recent event from this source successfully dispatched to a destination.

# paths./rest/v1/sources.post.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can send events to the CDP. When set, only requests from these domains are accepted for this source. Separate from experiment settings `whitelistDomains`, which limits which domains can load your experiments.

# paths./rest/v1/sources.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/sources.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/sources/{id}.get.description
Find a single source by ID. Requires scope: source:view

# paths./rest/v1/sources/{id}.get.responses.200.content.application/json.schema.properties.isPublished.description
Whether this source exists in the currently published version. A source that is not published will not accept events.

# paths./rest/v1/sources/{id}.get.responses.200.content.application/json.schema.properties.lastTriggeredAt.description
ISO-8601 timestamp of the most recent inbound request received by this source. Useful for debugging "is my webhook even reaching us?"

# paths./rest/v1/sources/{id}.get.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
ISO-8601 timestamp of the most recent event from this source successfully dispatched to a destination.

# paths./rest/v1/sources/{id}.get.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can send events to the CDP. When set, only requests from these domains are accepted for this source. Separate from experiment settings `whitelistDomains`, which limits which domains can load your experiments.

# paths./rest/v1/sources/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/sources/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/sources/{id}.patch.description
Partially update a source. Only the fields you send are changed; omitted fields are unchanged. Send explicit `null` to clear a nullable field. Returns the full source entity after the update. Requires scope: source:update

# paths./rest/v1/sources/{id}.patch.responses.200.content.application/json.schema.properties.isPublished.description
Whether this source exists in the currently published version. A source that is not published will not accept events.

# paths./rest/v1/sources/{id}.patch.responses.200.content.application/json.schema.properties.lastTriggeredAt.description
ISO-8601 timestamp of the most recent inbound request received by this source. Useful for debugging "is my webhook even reaching us?"

# paths./rest/v1/sources/{id}.patch.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
ISO-8601 timestamp of the most recent event from this source successfully dispatched to a destination.

# paths./rest/v1/sources/{id}.patch.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can send events to the CDP. When set, only requests from these domains are accepted for this source. Separate from experiment settings `whitelistDomains`, which limits which domains can load your experiments.

# paths./rest/v1/sources/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/sources/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/sources/{id}.delete.description
Delete a source. Requires scope: source:delete

# paths./rest/v1/sources/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/sources/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/sources/{id}/tokens.get.description
Returns the install or ingest tokens for a source. The response is a discriminated union on `sourceType`: pixel sources return `{ sourceType: "pixel", token, testToken, installScript, testInstallScript }`, and webhook sources return `{ sourceType: "webhook", token, testToken, ingestUrl, testIngestUrl, sampleCurl }`. Inspect the source's `type` field (`GET /rest/v1/sources/{id}`) to know which variant to expect. Requires scope: source:view

# paths./rest/v1/sources/{id}/tokens.get.responses.200.description
Source tokens. The shape depends on the source — pixel/web sources return an `installScript`; webhook sources return an `ingestUrl` and `sampleCurl`. The `sourceType` field discriminates between the two variants.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.sourceType.description
Discriminator: this is a pixel/web source.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.installScript.description
Ready-to-paste install snippet for the production token, including linked runtime tokens for supported modules.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.testInstallScript.description
Ready-to-paste install snippet for the test token, suitable for validation before a live install.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.sourceType.description
Discriminator: this is a webhook source.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.ingestUrl.description
Production ingest URL for the webhook source.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.token.description
Ingest token embedded in the webhook URL path.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.testToken.description
Test-mode ingest token derived from `token`.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.anyOf[].properties.sampleCurl.description
Example curl command showing how to POST a sample event to the ingest URL. Copy and run to verify connectivity.

# paths./rest/v1/sources/{id}/tokens.get.responses.200.content.application/json.schema.description
Token data for the source. The `sourceType` field discriminates between pixel sources (web / PixelImage) which return an `installScript`, and webhook sources which return an `ingestUrl` and `sampleCurl` instead. Pixel sources use `installScript` / `testInstallScript` to add the tracking pixel to a website. Webhook sources POST JSON to `ingestUrl` directly.

# paths./rest/v1/sources/{id}/tokens.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/sources/{id}/tokens.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/allowed-events.get.description
List every allowed event for this account. Allowed events sit between sources and destinations in the dispatch flow — only inbound events whose `event` field matches the `name` of an allowed event (case-insensitive) can be routed to that event's `destinationIds`. Events without a matching allowed event are dropped. The list is not paginated; the per-account count is bounded. System events (names beginning with `$`, e.g. `$heatmap_click`) are hidden from the response — only `$identify` is creatable as an allowed event. Requires scope: allowedEvent:list

# paths./rest/v1/allowed-events.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Server-assigned UUID for this allowed event.

# paths./rest/v1/allowed-events.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Case-insensitive event name. Inbound events whose `event` field matches this value are gated through this allowed event. Reserved: names starting with `$` are system events and cannot be created (except `$identify`).

# paths./rest/v1/allowed-events.get.responses.200.content.application/json.schema.properties.entities.items.properties.destinationIds.description
Destinations that receive this event. Empty array means the event is allowed but routed nowhere (effectively dropped). PATCH replaces this list wholesale.

# paths./rest/v1/allowed-events.get.responses.200.content.application/json.schema.properties.entities.items.properties.trigger.description
Optional free-form trigger description. Not used by the dispatch pipeline — surfaced in the dashboard so teams can record where each event fires.

# paths./rest/v1/allowed-events.get.responses.200.content.application/json.schema.properties.entities.items.properties.createdAt.description
ISO 8601 timestamp when the allowed event was created.

# paths./rest/v1/allowed-events.get.responses.200.content.application/json.schema.properties.entities.items.properties.updatedAt.description
ISO 8601 timestamp of the last PATCH. Equal to createdAt on a freshly created event.

# paths./rest/v1/allowed-events.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/allowed-events.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/allowed-events.post.description
Create a new allowed event for this account.

- `name` is required, trimmed, case-insensitively unique within the account, and rejected if it exceeds the platform event-name length limit.
- Names starting with `$` are reserved for system events. Only `$identify` is accepted.
- `destinationIds` is optional. Unknown ids and ids belonging to other accounts are silently filtered out at write time (the destination must exist on this account to be saved).

Returns the full entity so callers can read the server-assigned `id`, `createdAt`, and the filtered `destinationIds` without a follow-up GET. Known input failures (duplicate name, name length, `$`-prefix reservation, empty name) are returned as HTTP 409 with the reason in the response `error` field. Requires scope: allowedEvent:create

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this allowed event.

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.name.description
Case-insensitive event name. Inbound events whose `event` field matches this value are gated through this allowed event. Reserved: names starting with `$` are system events and cannot be created (except `$identify`).

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.destinationIds.description
Destinations that receive this event. Empty array means the event is allowed but routed nowhere (effectively dropped). PATCH replaces this list wholesale.

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.trigger.description
Optional free-form trigger description. Not used by the dispatch pipeline — surfaced in the dashboard so teams can record where each event fires.

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the allowed event was created.

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last PATCH. Equal to createdAt on a freshly created event.

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.lastTriggeredAt.description
ISO 8601 timestamp of the most recent inbound event observed for this name. Useful for spotting events that were configured but never fired. Null when never observed.

# paths./rest/v1/allowed-events.post.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
ISO 8601 timestamp of the most recent successful dispatch to any destination on `destinationIds`. Lags `lastTriggeredAt` when consent or governance rules drop the event before dispatch.

# paths./rest/v1/allowed-events.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/allowed-events.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/allowed-events.post.responses.409.description
Conflict — duplicate event name on this account, name too long, name starts with `$` (other than `$identify`), or empty name. Reason is in the response `error` field.

# paths./rest/v1/allowed-events/{id}.get.description
Fetch a single allowed event by id. Returns 404 when no record matches the supplied id or it belongs to a different account. Requires scope: allowedEvent:find

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this allowed event.

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.name.description
Case-insensitive event name. Inbound events whose `event` field matches this value are gated through this allowed event. Reserved: names starting with `$` are system events and cannot be created (except `$identify`).

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.destinationIds.description
Destinations that receive this event. Empty array means the event is allowed but routed nowhere (effectively dropped). PATCH replaces this list wholesale.

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.trigger.description
Optional free-form trigger description. Not used by the dispatch pipeline — surfaced in the dashboard so teams can record where each event fires.

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the allowed event was created.

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last PATCH. Equal to createdAt on a freshly created event.

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.lastTriggeredAt.description
ISO 8601 timestamp of the most recent inbound event observed for this name. Useful for spotting events that were configured but never fired. Null when never observed.

# paths./rest/v1/allowed-events/{id}.get.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
ISO 8601 timestamp of the most recent successful dispatch to any destination on `destinationIds`. Lags `lastTriggeredAt` when consent or governance rules drop the event before dispatch.

# paths./rest/v1/allowed-events/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/allowed-events/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/allowed-events/{id}.patch.description
Partially update an allowed event. Only the fields you send are changed; omitted fields keep their current value.

- `destinationIds` is replaced wholesale when sent — the canonical way to add or remove a destination is to fetch, modify the array, and PATCH it back. Stale ids (deleted destinations or destinations on another account) are silently filtered out at write time.
- `name` is subject to the same rules as create: case-insensitive uniqueness, length cap, `$`-prefix reservation.
- `trigger` accepts `null` to clear the existing value.

Returns the full entity. Known input failures (duplicate name, length, `$`-prefix, empty name) are returned as HTTP 409 with the reason in the response `error` field. Requires scope: allowedEvent:update

# paths./rest/v1/allowed-events/{id}.patch.requestBody.content.application/json.schema.properties.name.description
New event name. Subject to the same rules as create: case-insensitive uniqueness within the account, max length enforced by the platform, and the `$`-prefix reservation (only `$identify` is allowed). Omit to leave the name unchanged.

# paths./rest/v1/allowed-events/{id}.patch.requestBody.content.application/json.schema.properties.destinationIds.description
Destinations that should receive this event. Wholesale replacement — the sent list becomes the new value. Stale IDs (destinations from another account or deleted destinations) are silently filtered out at write time. Send `[]` to gate the event from every destination.

# paths./rest/v1/allowed-events/{id}.patch.requestBody.content.application/json.schema.properties.trigger.description
Free-form trigger description shown in the dashboard. Send `null` to clear. Not used by the dispatch pipeline.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this allowed event.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.name.description
Case-insensitive event name. Inbound events whose `event` field matches this value are gated through this allowed event. Reserved: names starting with `$` are system events and cannot be created (except `$identify`).

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.destinationIds.description
Destinations that receive this event. Empty array means the event is allowed but routed nowhere (effectively dropped). PATCH replaces this list wholesale.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.trigger.description
Optional free-form trigger description. Not used by the dispatch pipeline — surfaced in the dashboard so teams can record where each event fires.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the allowed event was created.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last PATCH. Equal to createdAt on a freshly created event.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.lastTriggeredAt.description
ISO 8601 timestamp of the most recent inbound event observed for this name. Useful for spotting events that were configured but never fired. Null when never observed.

# paths./rest/v1/allowed-events/{id}.patch.responses.200.content.application/json.schema.properties.lastDispatchedAt.description
ISO 8601 timestamp of the most recent successful dispatch to any destination on `destinationIds`. Lags `lastTriggeredAt` when consent or governance rules drop the event before dispatch.

# paths./rest/v1/allowed-events/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/allowed-events/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/allowed-events/{id}.patch.responses.409.description
Conflict — name change collides with an existing allowed event on this account, name too long, name starts with `$` (other than `$identify`), or empty name. Reason is in the response `error` field.

# paths./rest/v1/allowed-events/{id}.delete.description
Delete an allowed event. After deletion, inbound events whose `event` field matches the deleted name are no longer routed and are dropped at the allow-list stage of the dispatch flow. Requires scope: allowedEvent:delete

# paths./rest/v1/allowed-events/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/allowed-events/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings.get.description
List all consent settings. Requires scope: consentSettings:list

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Server-assigned UUID for this consent settings record.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.kind.description
Discriminator for the entity type. Always "consentSettings".

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.status.description
Enabled means the CMP serves on whitelisted domains; Disabled means it does not.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.updatedAt.description
ISO 8601 timestamp of the last write. Null on a freshly created record.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.whitelistDomains.description
Allowlist of domains where this CMP configuration may run. Used at runtime to derive the broadest matching base domain so consent can persist across matching subdomains.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.consentCookieName.description
Name of the cookie that stores the user's consent state. Defaults to "op_consent".

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id") so consent and SDK events resolve to the same visitor.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.webSDKToken.description
Pixel of the WebSource that this CMP is wired into. Setting this to a token that is not a valid WebSource of yours is rejected; use null to clear the link.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.customDomain.description
Optional custom CDN domain for serving the CMP script (e.g. consent.example.com).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.revision.description
Revision counter. Bump this to force users who already consented to see the modal again (the SDK compares the persisted revision against this value).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each entry must be a single class token (no whitespace).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.description
Top-level consent categories (e.g. necessary / analytics / advertising). Server re-stamps `priority` to 0..N on write.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.regions.description
Per-region rule overrides. The first rule whose `regionCode`/`additionalRegions` includes the user's region wins; otherwise `default` applies.

# paths./rest/v1/consent-settings.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings.post.description
Create a new consent settings record. POST takes no request body — the server initializes the record with defaults (Disabled status, opt-out default rule, English translations, necessary/analytics/advertising categories, no regions, no whitelisted domains). Configure the record afterward with PATCH (partial update) or PUT (full replacement). Returns the same shape as GET so you can read the server-assigned `id`, default rule, and categories without a follow-up fetch. Requires scope: consentSettings:create

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this consent settings record.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "consentSettings".

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.status.description
Enabled means the CMP serves on whitelisted domains; Disabled means it does not.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Null on a freshly created record.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.whitelistDomains.description
Allowlist of domains where this CMP configuration may run. Used at runtime to derive the broadest matching base domain so consent can persist across matching subdomains.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.consentCookieName.description
Name of the cookie that stores the user's consent state. Defaults to "op_consent".

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id") so consent and SDK events resolve to the same visitor.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.webSDKToken.description
Pixel of the WebSource that this CMP is wired into. Setting this to a token that is not a valid WebSource of yours is rejected; use null to clear the link.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.customDomain.description
Optional custom CDN domain for serving the CMP script (e.g. consent.example.com).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.revision.description
Revision counter. Bump this to force users who already consented to see the modal again (the SDK compares the persisted revision against this value).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each entry must be a single class token (no whitespace).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.categories.description
Top-level consent categories (e.g. necessary / analytics / advertising). Server re-stamps `priority` to 0..N on write.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings.post.responses.200.content.application/json.schema.properties.regions.description
Per-region rule overrides. The first rule whose `regionCode`/`additionalRegions` includes the user's region wins; otherwise `default` applies.

# paths./rest/v1/consent-settings.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}.get.description
Find a single consent setting by ID. Requires scope: consentSettings:find

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this consent settings record.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "consentSettings".

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.status.description
Enabled means the CMP serves on whitelisted domains; Disabled means it does not.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Null on a freshly created record.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.whitelistDomains.description
Allowlist of domains where this CMP configuration may run. Used at runtime to derive the broadest matching base domain so consent can persist across matching subdomains.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.consentCookieName.description
Name of the cookie that stores the user's consent state. Defaults to "op_consent".

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id") so consent and SDK events resolve to the same visitor.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.webSDKToken.description
Pixel of the WebSource that this CMP is wired into. Setting this to a token that is not a valid WebSource of yours is rejected; use null to clear the link.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.customDomain.description
Optional custom CDN domain for serving the CMP script (e.g. consent.example.com).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.revision.description
Revision counter. Bump this to force users who already consented to see the modal again (the SDK compares the persisted revision against this value).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each entry must be a single class token (no whitespace).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.categories.description
Top-level consent categories (e.g. necessary / analytics / advertising). Server re-stamps `priority` to 0..N on write.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.get.responses.200.content.application/json.schema.properties.regions.description
Per-region rule overrides. The first rule whose `regionCode`/`additionalRegions` includes the user's region wins; otherwise `default` applies.

# paths./rest/v1/consent-settings/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}.patch.description
Partially update a consent setting. Send only the fields you want to change — every field is optional and unspecified fields are preserved. List-valued fields (services, categories, regions) are replaced wholesale when sent. Requires scope: consentSettings:update

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.status.description
Toggle Enabled/Disabled without re-sending the rest of the config.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.whitelistDomains.description
Replace the allowlist. Pass null/[] to clear.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id"). Pass null to clear.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.webSDKToken.description
Set or clear the WebSource pixel link. A non-null token must be a valid WebSource of yours.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.revision.description
Bump the revision counter to re-prompt users.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.services.description
Replace the entire services list. Omit to leave existing services untouched.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.categories.description
Replace the entire categories list. Omit to leave existing categories untouched.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.default.description
Replace the default rule wholesale. Omit to leave it untouched.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.regions.description
Replace the entire regions list. Omit to leave it untouched. To change one region, send the full regions array with that region's rule modified.

# paths./rest/v1/consent-settings/{id}.patch.requestBody.content.application/json.schema.properties.skipBlockingClassNames.description
Replace the skipBlockingClassNames list. Pass null/[] to clear.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this consent settings record.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "consentSettings".

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.status.description
Enabled means the CMP serves on whitelisted domains; Disabled means it does not.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Null on a freshly created record.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.whitelistDomains.description
Allowlist of domains where this CMP configuration may run. Used at runtime to derive the broadest matching base domain so consent can persist across matching subdomains.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.consentCookieName.description
Name of the cookie that stores the user's consent state. Defaults to "op_consent".

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id") so consent and SDK events resolve to the same visitor.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.webSDKToken.description
Pixel of the WebSource that this CMP is wired into. Setting this to a token that is not a valid WebSource of yours is rejected; use null to clear the link.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.customDomain.description
Optional custom CDN domain for serving the CMP script (e.g. consent.example.com).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.revision.description
Revision counter. Bump this to force users who already consented to see the modal again (the SDK compares the persisted revision against this value).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each entry must be a single class token (no whitespace).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.categories.description
Top-level consent categories (e.g. necessary / analytics / advertising). Server re-stamps `priority` to 0..N on write.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.patch.responses.200.content.application/json.schema.properties.regions.description
Per-region rule overrides. The first rule whose `regionCode`/`additionalRegions` includes the user's region wins; otherwise `default` applies.

# paths./rest/v1/consent-settings/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}.put.description
Replace a consent setting. Send the full ConsentSettingsInput body — omitted optional fields are reset. Use PATCH for partial updates. Requires scope: consentSettings:update

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.categories.description
Top-level consent categories. Server re-stamps `priority` to 0..N.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.consentCookieName.description
Name of the cookie that stores consent state. Pass null to clear (defaults to "op_consent").

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id"). Pass null to clear.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.customDomain.description
Custom CDN domain for serving the CMP script. Pass null to clear.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.regions.description
Per-region rule overrides. Each `regionCode` must be unique across rules and must not appear in any other rule's `additionalRegions`.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.revision.description
Revision counter. Bump to re-prompt users who already consented.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking. Empty array clears the list.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each must be a single class token.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.status.description
Enabled to serve the CMP, Disabled to take it offline.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.webSDKToken.description
Pixel of the WebSource this CMP is wired into. Pass null to clear the link.

# paths./rest/v1/consent-settings/{id}.put.requestBody.content.application/json.schema.properties.whitelistDomains.description
Allowlist of domains where this CMP runs. Pass null/[] to clear.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this consent settings record.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "consentSettings".

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.status.description
Enabled means the CMP serves on whitelisted domains; Disabled means it does not.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Null on a freshly created record.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.whitelistDomains.description
Allowlist of domains where this CMP configuration may run. Used at runtime to derive the broadest matching base domain so consent can persist across matching subdomains.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.consentCookieName.description
Name of the cookie that stores the user's consent state. Defaults to "op_consent".

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id") so consent and SDK events resolve to the same visitor.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.webSDKToken.description
Pixel of the WebSource that this CMP is wired into. Setting this to a token that is not a valid WebSource of yours is rejected; use null to clear the link.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.customDomain.description
Optional custom CDN domain for serving the CMP script (e.g. consent.example.com).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.revision.description
Revision counter. Bump this to force users who already consented to see the modal again (the SDK compares the persisted revision against this value).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each entry must be a single class token (no whitespace).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.categories.description
Top-level consent categories (e.g. necessary / analytics / advertising). Server re-stamps `priority` to 0..N on write.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.put.responses.200.content.application/json.schema.properties.regions.description
Per-region rule overrides. The first rule whose `regionCode`/`additionalRegions` includes the user's region wins; otherwise `default` applies.

# paths./rest/v1/consent-settings/{id}.put.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}.put.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}.delete.description
Delete a consent setting. Requires scope: consentSettings:delete

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this consent settings record.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "consentSettings".

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.status.description
Enabled means the CMP serves on whitelisted domains; Disabled means it does not.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Null on a freshly created record.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.whitelistDomains.description
Allowlist of domains where this CMP configuration may run. Used at runtime to derive the broadest matching base domain so consent can persist across matching subdomains.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.consentCookieName.description
Name of the cookie that stores the user's consent state. Defaults to "op_consent".

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.deviceIdCookieName.description
Cookie/localStorage key for the visitor (device) ID. Must exactly match the web SDK's cookie_names.device_id (default "ours_device_id") so consent and SDK events resolve to the same visitor.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.webSDKToken.description
Pixel of the WebSource that this CMP is wired into. Setting this to a token that is not a valid WebSource of yours is rejected; use null to clear the link.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.customDomain.description
Optional custom CDN domain for serving the CMP script (e.g. consent.example.com).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.revision.description
Revision counter. Bump this to force users who already consented to see the modal again (the SDK compares the persisted revision against this value).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.skipBlockingClassNames.description
CSS class names that opt scripts out of consent blocking. Each entry must be a single class token (no whitespace).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.services.items.properties.additionalCategories.description
Extra category values this service belongs to. Each must match a `categories[].value`.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.services.items.properties.category.description
Primary category value this service belongs to. Must match one of the top-level `categories[].value` entries.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.services.items.properties.domainPatterns.description
Domains/paths this service matches. Patterns matching the CMP's own scripts (e.g. cdn.oursprivacy.com/cmp-init) are rejected to prevent the CMP blocking itself — use a more specific path like cdn.oursprivacy.com/main.js to block a specific script.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.services.items.properties.internalNotes.description
Internal notes shown to admins in the dashboard. Not user-facing.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.services.items.properties.label.description
Display name for this service in the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.services.description
Per-service entries powering "show vendors" and category-aware blocking.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.categories.items.properties.label.description
Human-readable label shown next to the toggle in the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
Sort key. Lower numbers render first. Server re-stamps to 0..N on write — send any integer, gaps and duplicates are ironed out.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.categories.items.properties.value.description
Stable identifier referenced by services and translation sections. Conventionally lowercase (e.g. "necessary", "analytics", "advertising").

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.categories.description
Top-level consent categories (e.g. necessary / analytics / advertising). Server re-stamps `priority` to 0..N on write.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.default.description
Default rule used when the user is not in any region listed in `regions[]`.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.additionalRegions.description
Other region codes that should reuse this rule. Same code-format rules as `regionCode`. Cannot include `regionCode` itself, cannot duplicate, cannot overlap with another rule's regions.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.name.description
Optional label for this override group, e.g. "CCPA States". Shown in the dashboard instead of the region codes. Pass null to clear it and fall back to the codes.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.regionCode.description
Region this rule applies to. Use ISO 3166-1 alpha-2 country code ("US", "DE", "BR") or country-subdivision code ("US-CA", "GB-ENG", "CA-ON"). Each region code may appear in only one rule across `regions[]`.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShow.description
When true, the consent modal auto-opens on page load.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissConfig.description
Threshold config for autoShowDismissMode (page count or seconds).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoShowDismissMode.description
How the modal is treated as dismissed (never, after_pages, after_seconds).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.autoblockUnknown.description
When true, scripts not classified by services[] are blocked until the user opts in.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.key.description
Category value (matches `categories[].value`) this entry configures.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.autoDisableOnGPC.description
When true, this category defaults off if the browser sends Sec-GPC: 1.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.enabled.description
Whether this category is on by default before the user interacts.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.readOnly.description
When true, the user cannot toggle this category in the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.items.properties.value.properties.reloadPage.description
When true, the page reloads after this category is toggled so newly-allowed scripts can run.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.categories.description
Per-category default config for this rule. Every category defined in the top-level `categories[].value` should have an entry here.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.disablePageInteraction.description
When true, the rest of the page is locked behind a backdrop until the user chooses.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.guiOptions.description
Visual options for the modals (layout/position/colors).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.hideFromBots.description
When true, the modal is suppressed for known bot user agents.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.language.description
BCP 47 default language for this rule. Must have a matching entry in `translations`. Examples: "en", "en-US", "es", "de".

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.mode.description
opt_in: scripts blocked until user accepts (GDPR style). opt_out: scripts run by default until user rejects (CCPA style).

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.showVendorsInPreferences.description
When true, the per-service list (services[]) is rendered inside the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.language.description
BCP 47 language tag identifying which translation this entry provides. Examples: "en", "en-US", "es", "fr-CA". The default rule's `language` must appear here.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.consentModal.description
Translated copy for the initial consent modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.items.properties.value.properties.preferencesModal.description
Translated copy for the preferences modal.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.items.properties.rule.properties.translations.description
All UI copy, keyed by language. Must include an entry whose `language` matches the rule's `language` field.

# paths./rest/v1/consent-settings/{id}.delete.responses.200.content.application/json.schema.properties.regions.description
Per-region rule overrides. The first rule whose `regionCode`/`additionalRegions` includes the user's region wins; otherwise `default` applies.

# paths./rest/v1/consent-settings/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}/analytics.get.description
Time-series consent analytics for a single consent settings record: banner views, opt-ins, opt-outs, close-icon clicks, and derived opt-in/out rates per UTC day (or per UTC hour with `granularity=HOURLY`). The window is zero-filled so callers get a contiguous series, and rates are person-level (`COUNT(DISTINCT visitor_id)`). Use the optional `pagePath` and `region` filters to scope to one page or one visitor region; use `compareWithPreviousPeriod=true` to also receive the matching prior window. `DAILY` allows a 90-day window; `HOURLY` is capped at 14 days. Requires the API-key scope `report:consent-analytics` (this endpoint returns consent analytics report data, which is PHI-bearing and gated separately from consent-settings management). Requires scope: report:consent-analytics

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 90 days or fewer (14 for `HOURLY` granularity).

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 90 days or fewer (14 for `HOURLY` granularity).

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Bucket size for the time-series rollup. `DAILY` (default) buckets per UTC day; `HOURLY` buckets per UTC hour and limits the window to 14 days.

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Filter to events whose `default_properties.pathname` equals this value (exact match, case-sensitive). Use this to drill into a single page.

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Filter results to events whose `request_context.country_region_name` is in this set. Pass a single region (e.g. `California`) or a comma-separated list (`California,Texas`). Case-sensitive. Use `GET /rest/v1/consent-settings/{id}/analytics-by-region` to discover the region names available for an account.

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
When `true`, each bucket also returns the matching bucket from the immediately preceding window of equal length (in `previous*` and `percentageChange*` fields). Defaults to `false`.

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Optional custom comparison-window lower bound, as a UTC calendar day in `YYYY-MM-DD` format. Provide together with `comparisonTo`; the window between them must be the same length as `from`–`to` (a mismatch returns `400`). When omitted (with `compareWithPreviousPeriod=true`), the immediately preceding equal-length period is used.

# paths./rest/v1/consent-settings/{id}/analytics.get.parameters[].schema.description
Optional custom comparison-window upper bound, as a UTC calendar day in `YYYY-MM-DD` format. Provide together with `comparisonFrom`; the window must match the `from`–`to` length. Ignored unless both comparison bounds are supplied.

# paths./rest/v1/consent-settings/{id}/analytics.get.responses.200.description
Time-series consent analytics for one consent setting

# paths./rest/v1/consent-settings/{id}/analytics.get.responses.200.content.application/json.schema.properties.items.description
One entry per time bucket (day or hour, depending on `granularity`) covering the full window — empty windows are zero-filled so callers can render contiguous time series without gap-handling logic.

# paths./rest/v1/consent-settings/{id}/analytics.get.responses.400.description
Bad request — malformed `from`/`to`, window longer than the granularity allows, or filter values out of bounds.

# paths./rest/v1/consent-settings/{id}/analytics.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}/analytics.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}/analytics.get.responses.404.description
Not found — no consent setting exists with this `id`.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.description
Per-page consent breakdown for one consent settings record, ranked by opt-outs (descending). Each row bundles banner views, opt-outs, close-icon clicks, and the derived opt-out rate. Documented exception to the cursor-pagination standard: this endpoint paginates with `limit` and `offset` rather than `cursor`. `search` is a substring match against `pathname`; `region` filters to one visitor region. Requires the API-key scope `report:consent-page-analysis` (PHI-bearing report data). Requires scope: report:consent-page-analysis

# paths./rest/v1/consent-settings/{id}/page-analysis.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 90 days or fewer (14 for `HOURLY` granularity).

# paths./rest/v1/consent-settings/{id}/page-analysis.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 90 days or fewer (14 for `HOURLY` granularity).

# paths./rest/v1/consent-settings/{id}/page-analysis.get.parameters[].schema.description
Filter results to events whose `request_context.country_region_name` is in this set. Pass a single region (e.g. `California`) or a comma-separated list (`California,Texas`). Case-sensitive. Use `GET /rest/v1/consent-settings/{id}/analytics-by-region` to discover the region names available for an account.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.parameters[].schema.description
Maximum number of pages to return. Defaults to 50.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.parameters[].schema.description
Skip this many top-ranked pages before returning. Use together with `limit` for load-more pagination.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.200.description
Per-page consent breakdown for one consent setting

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.200.content.application/json.schema.properties.items.description
Pages with consent activity in the window, ranked by opt-outs (descending). Each page bundles banner views, opt-outs, close-icon clicks, and the derived opt-out rate.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.200.content.application/json.schema.properties.total.description
Running count of pages loaded so far (`offset + items.length`). Approximate for load-more flows; query without `offset` to get the exact size of the first page.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.200.content.application/json.schema.properties.hasMore.description
True when at least one more page is available beyond the current window.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.400.description
Bad request — malformed `from`/`to`, window longer than 90 days, or `limit`/`offset` out of range.

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}/page-analysis.get.responses.404.description
Not found — no consent setting exists with this `id`.

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.description
Region-grouped consent totals for the window: banner views, opt-ins, opt-outs, close-icon clicks, and derived rates per visitor `country_region_name`, ranked by banner views (descending). Visitors whose region cannot be resolved (e.g. bot traffic, IP geo failure) are bucketed under the literal `Unknown` so per-region counts always sum to the global totals. Use this to discover the region names you can later pass to the `region` filter on `GET /rest/v1/consent-settings/{id}/analytics`. Requires the API-key scope `report:consent-analytics` (PHI-bearing report data). Requires scope: report:consent-analytics

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 90 days or fewer (14 for `HOURLY` granularity).

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 90 days or fewer (14 for `HOURLY` granularity).

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.responses.200.description
Region-grouped consent totals for one consent setting

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.responses.200.content.application/json.schema.properties.regions.description
Per-region totals for the window, ranked by banner views (descending). Visitors whose region cannot be resolved (e.g. bot traffic, IP geo failure) are bucketed under the literal `Unknown`, so the per-region counts always sum to the global totals.

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.responses.400.description
Bad request — malformed `from`/`to` or window longer than 90 days.

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/consent-settings/{id}/analytics-by-region.get.responses.404.description
Not found — no consent setting exists with this `id`.

# paths./rest/v1/consent-analytics.get.description
Account-wide blocking stats from the Global Consent Center for the window: how many dispatches were attempted, how many were blocked, and a per-category breakdown of the blocks (with `percentageBlocked` = share of `totalDispatches`). Not scoped to a single consent settings record — this aggregates across every destination in the account. The endpoint is identified by query params rather than a path id because the report is account-scoped; this is a documented derived-read exception. Requires the API-key scope `report:global-consent-center-analytics` (this is the account-wide consent analytics report and is gated separately from consent-settings list). Requires scope: report:global-consent-center-analytics

# paths./rest/v1/consent-analytics.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/consent-analytics.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/consent-analytics.get.responses.200.description
Account-wide blocking stats from the Global Consent Center

# paths./rest/v1/consent-analytics.get.responses.200.content.application/json.schema.properties.totalDispatches.description
Total dispatches attempted across all destinations for the window.

# paths./rest/v1/consent-analytics.get.responses.200.content.application/json.schema.properties.totalBlocked.description
Total dispatches blocked by the Global Consent Center across all categories.

# paths./rest/v1/consent-analytics.get.responses.200.content.application/json.schema.properties.items.description
Per-category breakdown of blocked dispatches. `categoryName` is `Unknown` when the upstream block message could not be parsed; `percentageBlocked` is the share of `totalDispatches` blocked under that category.

# paths./rest/v1/consent-analytics.get.responses.400.description
Bad request — malformed `from`/`to` or window longer than 60 days.

# paths./rest/v1/consent-analytics.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/consent-analytics.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/data-governance.get.description
List the data-governance record(s) on this account. Each account has at most one record, so this list returns either an empty array or a single entity. Cursor pagination is exposed for consistency with other list endpoints but is rarely meaningful here. Data governance is the second stage of the dispatch flow (Source → Allowed Events → Data Governance → Mappings → Destination) — it evaluates each event against the configured category logic and stops dispatch to the destinations on any matching category. Requires scope: globalDispatch:list

# paths./rest/v1/data-governance.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/data-governance.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Server-assigned UUID for this data-governance record.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.kind.description
Discriminator for the entity type. Always "dataGovernance" on the REST surface. The underlying storage discriminator is "globalDispatchCenter" — REST translates it on the way out.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.isEnabled.description
When false, data governance is configured but does not gate dispatch — inbound events flow through to destinations regardless of category logic.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.updatedAt.description
ISO 8601 timestamp of the last write. Equal to createdAt on a freshly created record; advances on every PATCH.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.priority.description
1-indexed sort position. Always equals (sorted index + 1) — see PATCH for details.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.destinationIds.description
Destinations gated by this category when its logic evaluates to TRUE.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.items.properties.logic.description
Condition tree evaluated against each inbound event. Write conditions that evaluate **TRUE for events you want to STOP**. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`); combinator children are themselves logic nodes, so trees nest arbitrarily.

Discovery: `GET /rest/v1/mappings/default-variables` lists the canonical platform-provided `property` paths (visitor consent arrays, event fields, request context, identity fields). Custom `event.event_properties.*` paths are caller-defined.

Example leaf (stop dispatch when the visitor rejected the `advertising` consent category): `{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }`.

Example combinator: `{ "AND": [{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }, { "OR": [/* nested logic nodes */] }] }`.

# paths./rest/v1/data-governance.get.responses.200.content.application/json.schema.properties.entities.items.properties.categories.description
Governance categories in priority order (1..N).

# paths./rest/v1/data-governance.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/data-governance.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/data-governance.post.description
Create the data-governance record for this account. Each account may have at most one — a second POST returns 409. Body is optional; defaults are `isEnabled: false` and no categories. Categories are added later via PATCH. Requires scope: globalDispatch:create

# paths./rest/v1/data-governance.post.requestBody.content.application/json.schema.properties.name.description
Display name for the new record. Defaults to "Data Governance".

# paths./rest/v1/data-governance.post.requestBody.content.application/json.schema.properties.notes.description
Free-form notes shown in the dashboard. Not used for routing.

# paths./rest/v1/data-governance.post.requestBody.content.application/json.schema.properties.isEnabled.description
Whether the record starts enabled. Defaults to false — opt in by setting true here or via PATCH later. When disabled, every category is bypassed and inbound events flow through to destinations regardless of consent state.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this data-governance record.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "dataGovernance" on the REST surface. The underlying storage discriminator is "globalDispatchCenter" — REST translates it on the way out.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.isEnabled.description
When false, data governance is configured but does not gate dispatch — inbound events flow through to destinations regardless of category logic.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Equal to createdAt on a freshly created record; advances on every PATCH.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
1-indexed sort position. Always equals (sorted index + 1) — see PATCH for details.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.destinationIds.description
Destinations gated by this category when its logic evaluates to TRUE.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.items.properties.logic.description
Condition tree evaluated against each inbound event. Write conditions that evaluate **TRUE for events you want to STOP**. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`); combinator children are themselves logic nodes, so trees nest arbitrarily.

Discovery: `GET /rest/v1/mappings/default-variables` lists the canonical platform-provided `property` paths (visitor consent arrays, event fields, request context, identity fields). Custom `event.event_properties.*` paths are caller-defined.

Example leaf (stop dispatch when the visitor rejected the `advertising` consent category): `{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }`.

Example combinator: `{ "AND": [{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }, { "OR": [/* nested logic nodes */] }] }`.

# paths./rest/v1/data-governance.post.responses.200.content.application/json.schema.properties.categories.description
Governance categories in priority order (1..N).

# paths./rest/v1/data-governance.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/data-governance.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/data-governance.post.responses.409.description
Conflict — an account may have at most one data-governance record, and one already exists. Reason is in the response `error` field.

# paths./rest/v1/data-governance/{id}.get.description
Fetch the data-governance record by id, including its categories (logic, destinations, priority). Returns 404 when no record matches. Requires scope: globalDispatch:find

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this data-governance record.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "dataGovernance" on the REST surface. The underlying storage discriminator is "globalDispatchCenter" — REST translates it on the way out.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.isEnabled.description
When false, data governance is configured but does not gate dispatch — inbound events flow through to destinations regardless of category logic.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Equal to createdAt on a freshly created record; advances on every PATCH.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
1-indexed sort position. Always equals (sorted index + 1) — see PATCH for details.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.destinationIds.description
Destinations gated by this category when its logic evaluates to TRUE.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.items.properties.logic.description
Condition tree evaluated against each inbound event. Write conditions that evaluate **TRUE for events you want to STOP**. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`); combinator children are themselves logic nodes, so trees nest arbitrarily.

Discovery: `GET /rest/v1/mappings/default-variables` lists the canonical platform-provided `property` paths (visitor consent arrays, event fields, request context, identity fields). Custom `event.event_properties.*` paths are caller-defined.

Example leaf (stop dispatch when the visitor rejected the `advertising` consent category): `{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }`.

Example combinator: `{ "AND": [{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }, { "OR": [/* nested logic nodes */] }] }`.

# paths./rest/v1/data-governance/{id}.get.responses.200.content.application/json.schema.properties.categories.description
Governance categories in priority order (1..N).

# paths./rest/v1/data-governance/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/data-governance/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/data-governance/{id}.patch.description
Partially update the data-governance record. Top-level fields (`name`, `notes`, `isEnabled`) follow the standard PATCH semantic — only the fields you send are changed.

`categories` is the documented exception: when sent, it is **replaced wholesale**. There is no partial-merge for individual categories. To change one category, fetch the current record, modify the array, and PATCH it back.

Categories are sorted ascending by the `priority` you supplied and then renumbered `1..N` in the response, so the returned `priority` values are always sequential with no gaps. Stale `destinationIds` (deleted destinations or destinations on another account) are silently filtered out — the response echoes the filtered list, so a follow-up GET is not required to see what was saved. Requires scope: globalDispatch:update

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.name.description
Display name for the category. Auto-generated if omitted.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.description.description
Optional human-readable description shown in the dashboard.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.destinationIds.description
Destinations gated by this category. When the category logic evaluates to TRUE for an inbound event, dispatch to every destination on this list is stopped. Stale IDs (deleted destinations or destinations on another account) are silently filtered out at write time.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.logic.description
Condition tree evaluated against each inbound event. Write conditions that evaluate **TRUE for events you want to STOP**. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`); combinator children are themselves logic nodes, so trees nest arbitrarily.

Discovery: `GET /rest/v1/mappings/default-variables` lists the canonical platform-provided `property` paths (visitor consent arrays, event fields, request context, identity fields). Custom `event.event_properties.*` paths are caller-defined.

Example leaf (stop dispatch when the visitor rejected the `advertising` consent category): `{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }`.

Example combinator: `{ "AND": [{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }, { "OR": [/* nested logic nodes */] }] }`.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.items.properties.priority.description
Used as a sort key on write. The server sorts categories by this value (ascending), then re-stamps priority as (sorted index + 1) on persist. Send any positive number — gaps are ironed out, duplicate values keep input order via stable sort. Omit to fall to the end.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.categories.description
Full replacement of the categories list. The sent array becomes the new state — there is no partial-merge semantic for categories. Categories are sorted by priority on write and re-stamped 1..N. Omit to leave existing categories untouched.

# paths./rest/v1/data-governance/{id}.patch.requestBody.content.application/json.schema.properties.isEnabled.description
Toggle data governance on/off without changing any other config.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this data-governance record.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.name.description
Human-readable name shown in the dashboard.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.kind.description
Discriminator for the entity type. Always "dataGovernance" on the REST surface. The underlying storage discriminator is "globalDispatchCenter" — REST translates it on the way out.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.isEnabled.description
When false, data governance is configured but does not gate dispatch — inbound events flow through to destinations regardless of category logic.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the record was created.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.updatedAt.description
ISO 8601 timestamp of the last write. Equal to createdAt on a freshly created record; advances on every PATCH.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.priority.description
1-indexed sort position. Always equals (sorted index + 1) — see PATCH for details.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.destinationIds.description
Destinations gated by this category when its logic evaluates to TRUE.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.items.properties.logic.description
Condition tree evaluated against each inbound event. Write conditions that evaluate **TRUE for events you want to STOP**. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`); combinator children are themselves logic nodes, so trees nest arbitrarily.

Discovery: `GET /rest/v1/mappings/default-variables` lists the canonical platform-provided `property` paths (visitor consent arrays, event fields, request context, identity fields). Custom `event.event_properties.*` paths are caller-defined.

Example leaf (stop dispatch when the visitor rejected the `advertising` consent category): `{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }`.

Example combinator: `{ "AND": [{ "condition": { "property": "visitor.consent.rejected_categories", "operator": "Contains", "value": "advertising" } }, { "OR": [/* nested logic nodes */] }] }`.

# paths./rest/v1/data-governance/{id}.patch.responses.200.content.application/json.schema.properties.categories.description
Governance categories in priority order (1..N).

# paths./rest/v1/data-governance/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/data-governance/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/data-governance/{id}.delete.description
Delete the data-governance record. After deletion, inbound events flow through to destinations without category-level gating. Create a new record with POST to reinstate governance. Requires scope: globalDispatch:delete

# paths./rest/v1/data-governance/{id}.delete.responses.200.content.application/json.schema.properties.id.description
The id of the data-governance record that was deleted.

# paths./rest/v1/data-governance/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/data-governance/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/replay-settings.get.description
List the replay configurations on this account. Supports cursor pagination via `limit` and `cursor`. Replay settings control which domains may capture session replays and where the capture script is hosted. Requires scope: replaySettings:list

# paths./rest/v1/replay-settings.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/replay-settings.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Stable identifier (UUID) for this replay configuration.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Human-readable label for this replay configuration. Shown in the dashboard. May be empty.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.status.description
Whether session replay capture is currently active. Set to "Enabled" to start capturing replays from whitelisted domains, or "Disabled" to pause capture without losing the configuration.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.createdAt.description
ISO-8601 timestamp when this configuration was created.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.updatedAt.description
ISO-8601 timestamp of the most recent update, or null if never updated.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.whitelistDomains.description
Hostnames where session replay capture is permitted. Replays initiated from any host not in this list are dropped. PATCH replaces the list — partial updates are not merged.

# paths./rest/v1/replay-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.customDomain.description
Optional custom domain (CNAME) for hosting the replay capture script. Leave null to use the default Ours Privacy domain.

# paths./rest/v1/replay-settings.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/replay-settings.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/replay-settings.post.description
Create the replay configuration for this account. Each account is limited to one replay configuration — calls made when one already exists return HTTP 409 with the reason in the response `error` field. Requires scope: replaySettings:create

# paths./rest/v1/replay-settings.post.requestBody.content.application/json.schema.properties.customDomain.description
Optional custom domain (CNAME) for hosting the replay capture script. Leave null to use the default Ours Privacy domain.

# paths./rest/v1/replay-settings.post.requestBody.content.application/json.schema.properties.name.description
Human-readable label for this replay configuration. Shown in the dashboard. May be empty.

# paths./rest/v1/replay-settings.post.requestBody.content.application/json.schema.properties.status.description
Whether session replay capture is currently active. Set to "Enabled" to start capturing replays from whitelisted domains, or "Disabled" to pause capture without losing the configuration.

# paths./rest/v1/replay-settings.post.requestBody.content.application/json.schema.properties.whitelistDomains.description
Hostnames where session replay capture is permitted. Replays initiated from any host not in this list are dropped. PATCH replaces the list — partial updates are not merged.

# paths./rest/v1/replay-settings.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/replay-settings.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/replay-settings.post.responses.409.description
Conflict — account already has a replay configuration. Each account is limited to one. Reason is in the response `error` field.

# paths./rest/v1/replay-settings/{id}.get.description
Fetch a single replay configuration by ID, including its whitelisted domains and custom domain. Requires scope: replaySettings:find

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.id.description
Stable identifier (UUID) for this replay configuration.

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.name.description
Human-readable label for this replay configuration. Shown in the dashboard. May be empty.

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.status.description
Whether session replay capture is currently active. Set to "Enabled" to start capturing replays from whitelisted domains, or "Disabled" to pause capture without losing the configuration.

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.createdAt.description
ISO-8601 timestamp when this configuration was created.

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.updatedAt.description
ISO-8601 timestamp of the most recent update, or null if never updated.

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.whitelistDomains.description
Hostnames where session replay capture is permitted. Replays initiated from any host not in this list are dropped. PATCH replaces the list — partial updates are not merged.

# paths./rest/v1/replay-settings/{id}.get.responses.200.content.application/json.schema.properties.customDomain.description
Optional custom domain (CNAME) for hosting the replay capture script. Leave null to use the default Ours Privacy domain.

# paths./rest/v1/replay-settings/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/replay-settings/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/replay-settings/{id}.patch.description
Update one or more fields on an existing replay configuration. Only the fields you send are changed; omitted fields keep their current value. Note that `whitelistDomains` is replaced wholesale (not merged with the existing list). Requires scope: replaySettings:update

# paths./rest/v1/replay-settings/{id}.patch.requestBody.content.application/json.schema.properties.customDomain.description
Optional custom domain (CNAME) for hosting the replay capture script. Leave null to use the default Ours Privacy domain.

# paths./rest/v1/replay-settings/{id}.patch.requestBody.content.application/json.schema.properties.name.description
Human-readable label for this replay configuration. Shown in the dashboard. May be empty.

# paths./rest/v1/replay-settings/{id}.patch.requestBody.content.application/json.schema.properties.status.description
Whether session replay capture is currently active. Set to "Enabled" to start capturing replays from whitelisted domains, or "Disabled" to pause capture without losing the configuration.

# paths./rest/v1/replay-settings/{id}.patch.requestBody.content.application/json.schema.properties.whitelistDomains.description
Hostnames where session replay capture is permitted. Replays initiated from any host not in this list are dropped. PATCH replaces the list — partial updates are not merged.

# paths./rest/v1/replay-settings/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/replay-settings/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/replay-settings/{id}.delete.description
Delete the replay configuration. Capture stops immediately for all whitelisted domains. Requires scope: replaySettings:delete

# paths./rest/v1/replay-settings/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/replay-settings/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions.get.description
List versions for this account, newest first. Supports cursor pagination and filtering by `isPublished`, `nameContains`, and `notesContains`. Combine filters with AND semantics. Requires scope: version:list

# paths./rest/v1/versions.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/versions.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/versions.get.parameters[].schema.description
Filter to only published or unpublished versions.

# paths./rest/v1/versions.get.parameters[].schema.description
Case-insensitive substring match on the version name.

# paths./rest/v1/versions.get.parameters[].schema.description
Case-insensitive substring match on the version notes.

# paths./rest/v1/versions.get.responses.200.content.application/json.schema.properties.entities.items.properties.publishedAt.description
When this version was most recently published. NOT cleared when a newer version is published — `publishedAt` reflects the most recent successful publish of this row, regardless of whether `isPublished` is currently true. Use `isPublished` to determine the current live version.

# paths./rest/v1/versions.get.responses.200.content.application/json.schema.properties.entities.items.properties.publishedByUserId.description
Identifier of the user who most recently published this version.

# paths./rest/v1/versions.get.responses.200.content.application/json.schema.properties.entities.items.properties.publishedByUserName.description
Display name of the user who most recently published this version.

# paths./rest/v1/versions.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions.post.description
Publish the current draft of non-experiment entities (destinations, mappings, experiment settings, governance rules, etc.) as a new version. Newly created or modified DRAFT experiments and experiment variants are NOT shipped here — call `POST /rest/v1/experiments/{id}/start` instead, which atomically publishes the experiment and its variants by default (`publishAfterStart: true`). Returns the full Version on success. Returns HTTP 409 with the reason in the response `error` field when there are no draft changes to publish, when another publish is already in flight, or when the action otherwise conflicts with current state. To re-publish an existing version, use POST /rest/v1/versions/{id}/publish instead.

Supports cherry-picking via the `include*` body fields. Each `include*` field is an entity-id allowlist for one collection — omit (or send `[]`) to include every draft change in that collection, or send a non-empty array to whitelist only those ids. Unlisted collections inherit wholesale from the latest published version. Requires scope: version:publish

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeAllowedEvents.description
Cherry-pick: allowed event ids (slug-like strings) to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeConsentSettings.description
Cherry-pick: consent settings ids to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeDestinations.description
Cherry-pick: destination UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeExternalAllowedEventData.description
Cherry-pick: external allowed event data ids to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeGlobalDispatchCenters.description
Cherry-pick: global dispatch center ids to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeMappings.description
Cherry-pick: mapping ids to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeReplaySettings.description
Cherry-pick: replay settings ids to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeSources.description
Cherry-pick: source UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeTagManagerTags.description
Cherry-pick: tag manager tag UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeTagManagerTriggers.description
Cherry-pick: tag manager trigger UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeTagManagerVariables.description
Cherry-pick: tag manager variable UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeDataGovernanceRules.description
Cherry-pick: data governance rule UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeDataGovernanceEvents.description
Cherry-pick: data governance event UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeExperimentSettings.description
Cherry-pick: experiment settings UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeExperiments.description
Cherry-pick: experiment UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.requestBody.content.application/json.schema.properties.includeExperimentVariants.description
Cherry-pick: experiment variant UUIDs to include from the draft. Omit or send `[]` to include all draft changes in this collection.

# paths./rest/v1/versions.post.responses.200.content.application/json.schema.properties.publishedAt.description
When this version was most recently published. NOT cleared when a newer version is published — `publishedAt` reflects the most recent successful publish of this row, regardless of whether `isPublished` is currently true. Use `isPublished` to determine the current live version.

# paths./rest/v1/versions.post.responses.200.content.application/json.schema.properties.publishedByUserId.description
Identifier of the user who most recently published this version.

# paths./rest/v1/versions.post.responses.200.content.application/json.schema.properties.publishedByUserName.description
Display name of the user who most recently published this version.

# paths./rest/v1/versions.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions.post.responses.409.description
Conflict — no draft changes to publish, another publish is in flight, or otherwise cannot publish. Reason is in the response `error` field.

# paths./rest/v1/versions/{id}.get.description
Find a single version by ID. Requires scope: version:find

# paths./rest/v1/versions/{id}.get.responses.200.content.application/json.schema.properties.publishedAt.description
When this version was most recently published. NOT cleared when a newer version is published — `publishedAt` reflects the most recent successful publish of this row, regardless of whether `isPublished` is currently true. Use `isPublished` to determine the current live version.

# paths./rest/v1/versions/{id}.get.responses.200.content.application/json.schema.properties.publishedByUserId.description
Identifier of the user who most recently published this version.

# paths./rest/v1/versions/{id}.get.responses.200.content.application/json.schema.properties.publishedByUserName.description
Display name of the user who most recently published this version.

# paths./rest/v1/versions/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}.patch.description
Partially update a version. Only the fields you send are changed. Requires scope: version:update

# paths./rest/v1/versions/{id}.patch.responses.200.content.application/json.schema.properties.publishedAt.description
When this version was most recently published. NOT cleared when a newer version is published — `publishedAt` reflects the most recent successful publish of this row, regardless of whether `isPublished` is currently true. Use `isPublished` to determine the current live version.

# paths./rest/v1/versions/{id}.patch.responses.200.content.application/json.schema.properties.publishedByUserId.description
Identifier of the user who most recently published this version.

# paths./rest/v1/versions/{id}.patch.responses.200.content.application/json.schema.properties.publishedByUserName.description
Display name of the user who most recently published this version.

# paths./rest/v1/versions/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}/publish.post.description
Re-publish an existing (previously created) version by ID. Use this to roll back to an older snapshot. Returns 409 if the version is already published, was created more than 45 days ago, or another publish is already in flight. To create-and-publish from current draft state, use POST /rest/v1/versions instead. Requires scope: version:publish

# paths./rest/v1/versions/{id}/publish.post.responses.200.content.application/json.schema.properties.publishedAt.description
When this version was most recently published. NOT cleared when a newer version is published — `publishedAt` reflects the most recent successful publish of this row, regardless of whether `isPublished` is currently true. Use `isPublished` to determine the current live version.

# paths./rest/v1/versions/{id}/publish.post.responses.200.content.application/json.schema.properties.publishedByUserId.description
Identifier of the user who most recently published this version.

# paths./rest/v1/versions/{id}/publish.post.responses.200.content.application/json.schema.properties.publishedByUserName.description
Display name of the user who most recently published this version.

# paths./rest/v1/versions/{id}/publish.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}/publish.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}/publish.post.responses.409.description
Conflict — version already published, older than 45 days, or another publish is in flight. Reason is in the response `error` field.

# paths./rest/v1/versions/{id}/snapshot.get.description
Retrieve the full JSON snapshot captured by a version — every entity (destinations, sources, mappings, consent settings, etc.) as it existed when this version was published. Sensitive fields (API keys, tokens, secrets) are redacted. Useful for IaC export, audit, and backup workflows. Requires scope: version:find

# paths./rest/v1/versions/{id}/snapshot.get.responses.200.content.application/json.schema.properties.jsonContent.description
The full entity snapshot captured by this version. Keys are entity collection names (destinations, sources, allowedEvents, mappings, consentSettings, replaySettings, globalDispatchCenters, etc.) and values are arrays of the entities as they existed at publish time. Sensitive fields (API keys, tokens, secrets) are redacted. Returns null when the version snapshot has been pruned.

# paths./rest/v1/versions/{id}/snapshot.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}/snapshot.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}/diff.get.description
Compare two versions of the account configuration. Returns added/removed/modified entities grouped by collection, plus a total `count`.

Draft experiments and experiment variants do NOT appear in any diff — only experiments that are already running (or paused/completed) snapshot into versions. Use the experiment lifecycle endpoints (`/start`, `/stop`, etc.) to ship experiment changes; use these diff endpoints only for non-experiment entities (destinations, mappings, experiment settings, governance rules, etc.).

- `GET /rest/v1/versions/draft/diff` — compare the current draft of non-experiment entities against the latest published version. Use this to preview what would be included in a `POST /rest/v1/versions` call. (`draft` is a literal path segment — there is no version with that ID; it identifies the comparison target.)
- `GET /rest/v1/versions/{id}/diff` — compare that specific version against the latest published version.
- `GET /rest/v1/versions/{id}/diff?against={otherId}` — compare two specific versions. `otherId` may also be `draft` to diff a published snapshot against the live draft state. Requires scope: version:find

# paths./rest/v1/versions/{id}/diff.get.parameters[].schema.description
Baseline version id to compare the path version against. Omit for the latest published version. Pass a version UUID to compute a version-vs-version diff.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.count.description
Total number of differences across all entity collections. Equals the sum of `added + removed + modified` across every collection in `differences`.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.destinations.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.sources.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.allowedEvents.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.externalAllowedEventData.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.mappings.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.consentSettings.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.globalDispatchCenters.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.replaySettings.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagers.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTags.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerTriggers.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.tagManagerVariables.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceRules.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.dataGovernanceEvents.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentSettings.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experiments.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.added.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.added.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.added.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.added.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.removed.items.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.removed.items.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.removed.items.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.removed.items.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.old.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.old.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.old.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.old.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.new.properties.name.description
Human-readable label for the entity at the snapshot it was captured in. For most collections this is the entity's `name` field; for `allowedEvents` it is a computed summary of the event's key fields. Two `modified` items can therefore have identical `old.name` and `new.name` even though their underlying records differ — the change is in fields not surfaced by the summary. Use the `id` to fetch full detail.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.new.properties.type.description
Entity subtype when the collection has one — for `sources` it matches the source's `type` field, letting clients distinguish kinds of source. `null` for collections without a subtype.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.new.properties.summary.description
Optional change-classifier. Currently set to `'Reordered'` on `mappings` modifications when the only change is priority reordering — this lets clients de-emphasize them in change-review UI. `null` for every other diff item.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.items.properties.new.properties.tagManagerId.description
Parent tag-manager id for `tagManagerTags`, `tagManagerTriggers`, and `tagManagerVariables`. `null` for every other collection.

# paths./rest/v1/versions/{id}/diff.get.responses.200.content.application/json.schema.properties.differences.properties.experimentVariants.properties.modified.description
Entities present in both snapshots but with at least one field changed. `old` is the snapshot of the entity in the baseline (latest published); `new` is the snapshot in the comparison target (the draft).

# paths./rest/v1/versions/{id}/diff.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}/diff.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}/revert.post.description
Revert one or more pending draft changes back to the latest published version (the "abandon a change" action). Send a body listing the entities to revert; each is handled independently — a modified entity is restored to its published values, a deleted entity is recreated, and a newly-added entity is discarded. An entity that already matches the published version is left untouched and is not counted (a no-op). An entity present in neither the draft nor the published version is reported in `notFoundCount`. `remainingChanges` is the total number of pending draft changes left after this call, which may stay above zero when other unreverted changes remain.

The `experiments` and `experimentVariants` collections are not supported here — use the experiment lifecycle endpoints (`/start`, `/stop`) for those — but `experimentSettings` is supported. To discard every pending change at once, use `POST /rest/v1/versions/draft/abandon`. (`draft` is a literal path segment identifying the live draft as the target.) Requires scope: version:publish

# paths./rest/v1/versions/{id}/revert.post.requestBody.content.application/json.schema.properties.entities.items.properties.collection.description
Entity collection the id belongs to. `experiments` and `experimentVariants` are not supported — use the experiment lifecycle endpoints for those — but `experimentSettings` is.

# paths./rest/v1/versions/{id}/revert.post.requestBody.content.application/json.schema.properties.entities.description
Draft entities to revert back to the latest published version. Each entry is processed independently: a modified entity is restored to its published values, a deleted entity is recreated, and a newly-added entity is discarded. Pass a single entry to revert one change.

# paths./rest/v1/versions/{id}/revert.post.responses.200.description
Counts of reverted, restored, discarded, and not-found entities

# paths./rest/v1/versions/{id}/revert.post.responses.200.content.application/json.schema.properties.revertedCount.description
Entities overwritten back to their published values.

# paths./rest/v1/versions/{id}/revert.post.responses.200.content.application/json.schema.properties.restoredCount.description
Entities recreated because they had been deleted from the draft.

# paths./rest/v1/versions/{id}/revert.post.responses.200.content.application/json.schema.properties.discardedCount.description
Newly-added draft entities that were deleted.

# paths./rest/v1/versions/{id}/revert.post.responses.200.content.application/json.schema.properties.notFoundCount.description
Requested entities present in neither the draft nor the latest published version.

# paths./rest/v1/versions/{id}/revert.post.responses.200.content.application/json.schema.properties.remainingChanges.description
Total pending draft changes remaining after this operation.

# paths./rest/v1/versions/{id}/revert.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}/revert.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}/abandon.post.description
Abandon ALL pending draft changes, resetting every supported entity collection back to the latest published version. Running experiments and experiment variants are not affected (ship those via the experiment lifecycle endpoints), but experiment settings are reset. Returns HTTP 409 when there is no published version to revert to, or when another publish or abandon is already in flight. To revert only specific changes, use `POST /rest/v1/versions/draft/revert`. (`draft` is a literal path segment identifying the live draft as the target.) Requires scope: version:publish

# paths./rest/v1/versions/{id}/abandon.post.responses.200.description
Counts of reverted, restored, and discarded entities, plus `remainingChanges` (pending draft changes left afterward, normally 0). `notFoundCount` is always 0 for this action — it reverts the changes it discovers rather than a caller-supplied id list.

# paths./rest/v1/versions/{id}/abandon.post.responses.200.content.application/json.schema.properties.revertedCount.description
Entities overwritten back to their published values.

# paths./rest/v1/versions/{id}/abandon.post.responses.200.content.application/json.schema.properties.restoredCount.description
Entities recreated because they had been deleted from the draft.

# paths./rest/v1/versions/{id}/abandon.post.responses.200.content.application/json.schema.properties.discardedCount.description
Newly-added draft entities that were deleted.

# paths./rest/v1/versions/{id}/abandon.post.responses.200.content.application/json.schema.properties.notFoundCount.description
Requested entities present in neither the draft nor the latest published version.

# paths./rest/v1/versions/{id}/abandon.post.responses.200.content.application/json.schema.properties.remainingChanges.description
Total pending draft changes remaining after this operation.

# paths./rest/v1/versions/{id}/abandon.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/versions/{id}/abandon.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/versions/{id}/abandon.post.responses.409.description
Conflict — there is no published version to revert to, or another publish/abandon is in flight. Reason is in the response `error`/`details` field.

# paths./rest/v1/experiments.get.description
List experiments for this account. Each experiment includes its full `variants` array (redirect URLs and DOM modifications), so a single paginated call returns a complete client-side experiment config. Supports cursor pagination and filtering by `status`, `type`, and free-text `search` matched against experiment id, name, and description. Combine filters with AND semantics. Requires scope: experiment:list

# paths./rest/v1/experiments.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/experiments.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/experiments.get.parameters[].schema.description
Optional case-insensitive text search matched against experiment ID, name, and description.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.items.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.items.properties.variants.description
All persisted variants for this experiment, including the control variant. A non-personalization experiment needs at least two variants before it can be started. Reading variants is gated by the `experiment:find` permission: a key holding the `experiment:find` scope always receives them, and a key created by an org admin/member receives them too (that role satisfies the check). A key that holds neither the scope nor a qualifying creator role receives an empty array here.

# paths./rest/v1/experiments.get.responses.200.content.application/json.schema.properties.entities.description
Experiments ordered by most recently updated first, then most recently created. Each experiment includes its full `variants` array (redirect URLs and DOM modifications), so a single paginated call returns a complete client-side experiment config.

# paths./rest/v1/experiments.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments.post.description
Create a new experiment. Requires scope: experiment:create

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.experimentSettingsId.description
ID of the experiment settings record that owns this experiment. Call `GET /rest/v1/experiment-settings` first if you need to discover the correct ID for the current account.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.key.description
Optional stable code-facing key. When omitted, the API slugifies the name automatically.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.type.description
Experiment mode to create. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting. Omit to create a standard `ab` experiment.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.trafficAllocation.description
Initial traffic allocation percentage from 0 to 100.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.includeQueryString.description
Whether redirect variants in this experiment should preserve the original request query string.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.controlWeight.description
Weight of the auto-created control variant, as a percentage (1–100). Defaults to 100 (a new experiment is all control until treatments are added). The control must keep at least 1% — a 0% control leaves visitors with no bucket to assign at runtime. As treatments are added the control is reconciled to the remainder (100 − Σ treatment weights), so it normally does not need to be set explicitly.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.targetingRules.description
Eligibility rules — URL patterns, audience, visitor status, query-param conditions. Omit to inherit defaults.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.properties.primary.properties.eventName.description
Event name to use as the goal for this metric.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.properties.primary.properties.funnelId.description
Optional funnel identifier when the metric should be derived from an existing funnel definition.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric. When provided, `eventName` must be a non-blank string.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Event name to use as the goal for this metric.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric should be derived from an existing funnel definition.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.metrics.description
Goal events. If you send `metrics.primary`, `metrics.primary.eventName` must be a non-blank string. A primary event name is required before the experiment can be started.

# paths./rest/v1/experiments.post.requestBody.content.application/json.schema.properties.analysisConfig.description
Optional draft analysis method. Server-owned statistical constants are normalized before storage.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiments.post.responses.200.content.application/json.schema.properties.variants.description
All persisted variants for this experiment, including the control variant. A non-personalization experiment needs at least two variants before it can be started. Reading variants is gated by the `experiment:find` permission: a key holding the `experiment:find` scope always receives them, and a key created by an org admin/member receives them too (that role satisfies the check). A key that holds neither the scope nor a qualifying creator role receives an empty array here.

# paths./rest/v1/experiments.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}.get.description
Find a single experiment by ID. Requires scope: experiment:find

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiments/{id}.get.responses.200.content.application/json.schema.properties.variants.description
All persisted variants for this experiment, including the control variant. A non-personalization experiment needs at least two variants before it can be started. Reading variants is gated by the `experiment:find` permission: a key holding the `experiment:find` scope always receives them, and a key created by an org admin/member receives them too (that role satisfies the check). A key that holds neither the scope nor a qualifying creator role receives an empty array here.

# paths./rest/v1/experiments/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}.patch.description
Partially update an experiment. Only the fields you send are changed, except renaming a non-draft legacy experiment with no stored key preserves its current name-derived key. Edits are allowed on draft, running, and paused experiments and are recorded in the change log. Only completed experiments return 409 with `A completed experiment can no longer be edited`. Use the lifecycle endpoints (`/start`, `/pause`, `/resume`, `/stop`) to change status. Requires scope: experiment:update

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.key.description
Updated stable code-facing key. When blank, the API falls back to a slugified key derived from the current experiment name. Renaming a non-draft legacy experiment with no stored key preserves its current name-derived key.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.description.description
Updated experiment hypothesis or operator note.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.trafficAllocation.description
Updated traffic allocation percentage from 0 to 100.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.includeQueryString.description
Updated redirect query-string forwarding behavior for the experiment.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.targetingRules.description
Updated eligibility rules. Send the full nested object — replaces the previous value, not merged.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.properties.primary.properties.eventName.description
Event name to use as the goal for this metric.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.properties.primary.properties.funnelId.description
Optional funnel identifier when the metric should be derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric. When provided, `eventName` must be a non-blank string.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Event name to use as the goal for this metric.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric should be derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.metrics.description
Updated goal events. Send the full nested object — replaces the previous value, not merged. If you send `metrics.primary`, `metrics.primary.eventName` must be a non-blank string.

# paths./rest/v1/experiments/{id}.patch.requestBody.content.application/json.schema.properties.analysisConfig.description
Updated draft analysis method. This field is locked once an experiment starts.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiments/{id}.patch.responses.200.content.application/json.schema.properties.variants.description
All persisted variants for this experiment, including the control variant. A non-personalization experiment needs at least two variants before it can be started. Reading variants is gated by the `experiment:find` permission: a key holding the `experiment:find` scope always receives them, and a key created by an org admin/member receives them too (that role satisfies the check). A key that holds neither the scope nor a qualifying creator role receives an empty array here.

# paths./rest/v1/experiments/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}.delete.description
Delete an experiment. Requires scope: experiment:delete

# paths./rest/v1/experiments/{id}.delete.responses.200.content.application/json.schema.description
Whether the experiment was deleted successfully.

# paths./rest/v1/experiments/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/duplicate.post.description
Create a draft copy of an experiment. The copy keeps its configuration and variants, receives a new key, and does not retain lifecycle, rollout, or result state. Requires scope: experiment:create

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.items.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.200.content.application/json.schema.properties.variants.description
All persisted variants for this experiment, including the control variant. A non-personalization experiment needs at least two variants before it can be started. Reading variants is gated by the `experiment:find` permission: a key holding the `experiment:find` scope always receives them, and a key created by an org admin/member receives them too (that role satisfies the check). A key that holds neither the scope nor a qualifying creator role receives an empty array here.

# paths./rest/v1/experiments/{id}/duplicate.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/duplicate.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/start.post.description
Start an experiment. By default also publishes the experiment and its variants atomically as a new version, making them live for end users — this is the canonical publish path for experiment changes. They do NOT flow through `POST /rest/v1/versions`. Pass `{ "publishAfterStart": false }` only if a separate publish is desired (e.g. bundling with non-experiment edits via a manual `POST /rest/v1/versions` afterwards). The request body is optional — send `{}` to use defaults. Requires scope: experiment:start

# paths./rest/v1/experiments/{id}/start.post.requestBody.content.application/json.schema.properties.publishAfterStart.description
When true (the default), atomically publish the experiment and its variants as a new version after starting — this is the canonical publish path for experiment changes. Any other unpublished non-experiment changes (destinations, mappings, settings, etc.) currently in draft are included in the same publish. Pass `false` explicitly to stage the change without publishing; the response will report `pending_publish` and a separate `POST /rest/v1/versions` call is then required.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.publishStatus.description
Whether the status change was also published to the current live version immediately.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.concurrentVersionChanges.description
Number of unpublished version changes detected at the time of the lifecycle action. Values greater than 1 mean other unpublished work exists besides this experiment state change.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/start.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/start.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/start.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/stop.post.description
Stop an experiment. The request body is optional — send `{}` to stop without recording a winner. Optionally pass `winnerVariantId` to record the winner (reporting only) and/or `rolloutVariantId` to keep that variant serving to all traffic. Requires scope: experiment:stop

# paths./rest/v1/experiments/{id}/stop.post.requestBody.content.application/json.schema.properties.winnerVariantId.description
Optional declared winner to record (reporting metadata only — does not change what visitors are served).

# paths./rest/v1/experiments/{id}/stop.post.requestBody.content.application/json.schema.properties.rolloutVariantId.description
Optional variant to roll out to 100% of traffic immediately on stop — the explicit serving decision that keeps the winning experience live (a winning redirect becomes an ongoing redirect). Must be a non-control variant. Reverse later via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/stop.post.requestBody.content.application/json.schema.description
Stopping always publishes the new live config immediately so visitors stop being assigned — there is no `publishAfterStop` flag because deferring the publish would leave a completed experiment still serving traffic. Send `{}` to stop without a recorded winner; everyone returns to the original unless you also pass `rolloutVariantId`.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.publishStatus.description
Whether the status change was also published to the current live version immediately.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.concurrentVersionChanges.description
Number of unpublished version changes detected at the time of the lifecycle action. Values greater than 1 mean other unpublished work exists besides this experiment state change.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/stop.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/stop.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/stop.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/rollout.post.description
Roll a non-control variant out to 100% of targeted traffic on a completed experiment — the explicit, reversible serving decision that makes a winning experience the ongoing default. Publishes. Reverse with `/end-rollout`. Returns 409 if the experiment is not completed or the variant is the control. Requires scope: experiment:stop

# paths./rest/v1/experiments/{id}/rollout.post.requestBody.content.application/json.schema.properties.variantId.description
Non-control variant to roll out to 100% of targeted traffic. The runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Reverse via `POST /experiments/{id}/end-rollout`. The experiment must be completed.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.publishStatus.description
Whether the status change was also published to the current live version immediately.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.concurrentVersionChanges.description
Number of unpublished version changes detected at the time of the lifecycle action. Values greater than 1 mean other unpublished work exists besides this experiment state change.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/rollout.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/rollout.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/end-rollout.post.description
End an active rollout: stop serving the rolled-out variant so every matching visitor reverts to the original experience. The declared winner is left intact. Publishes. Returns 409 if the experiment is not currently rolled out. Requires scope: experiment:stop

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.publishStatus.description
Whether the status change was also published to the current live version immediately.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.concurrentVersionChanges.description
Number of unpublished version changes detected at the time of the lifecycle action. Values greater than 1 mean other unpublished work exists besides this experiment state change.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/end-rollout.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/winner.post.description
Declare, change, or clear the winning variant on a completed experiment. Reporting metadata only — it does not change what visitors see and does not republish. Omit `winnerVariantId` to clear. To make the winner live, use `/rollout`. Requires scope: experiment:stop

# paths./rest/v1/experiments/{id}/winner.post.requestBody.content.application/json.schema.properties.winnerVariantId.description
Variant to record as the declared winner (reporting metadata only — does not change what visitors are served). Omit to clear the declared winner. The experiment must be completed.

# paths./rest/v1/experiments/{id}/winner.post.requestBody.content.application/json.schema.description
Declare, change, or clear the winning variant on a completed experiment. Reporting metadata only — it does not change what visitors see and does not republish. To make the winner live, roll it out via `POST /experiments/{id}/rollout`.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.description
Experiment with the declared winner updated

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/winner.post.responses.200.content.application/json.schema.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/winner.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/winner.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/pause.post.description
Pause a running experiment. Stops new variant assignments while preserving existing ones; the experiment can later be resumed. The request body is optional. Requires scope: experiment:stop

# paths./rest/v1/experiments/{id}/pause.post.requestBody.content.application/json.schema.properties.publishAfterPause.description
When true (default on the REST surface), publish the current draft version immediately after pausing the experiment. Any other unpublished changes in the same account version are included in that publish. Pass `false` explicitly to stage the change without publishing; the response will report `pending_publish`.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.publishStatus.description
Whether the status change was also published to the current live version immediately.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.concurrentVersionChanges.description
Number of unpublished version changes detected at the time of the lifecycle action. Values greater than 1 mean other unpublished work exists besides this experiment state change.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/pause.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/pause.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/pause.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/resume.post.description
Resume a previously-paused experiment so new visitors can be assigned again. The request body is optional. Requires scope: experiment:start

# paths./rest/v1/experiments/{id}/resume.post.requestBody.content.application/json.schema.properties.publishAfterResume.description
When true (default on the REST surface), publish the current draft version immediately after resuming the experiment. Any other unpublished changes in the same account version are included in that publish. Pass `false` explicitly to stage the change without publishing; the response will report `pending_publish`.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.publishStatus.description
Whether the status change was also published to the current live version immediately.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.concurrentVersionChanges.description
Number of unpublished version changes detected at the time of the lifecycle action. Values greater than 1 mean other unpublished work exists besides this experiment state change.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.key.description
Stable code-facing key for the experiment. Use this with the headless SDK `getExperimentByKey()` API instead of hard-coding opaque experiment IDs into application code.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.description.description
Optional human-readable hypothesis or summary. In GraphQL this is backed by the experiment hypothesis field.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.description.example
Test whether benefit-led copy increases demo requests.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.type.description
Experiment mode. `ab` and `multivariate` use traffic allocation and results; `personalization` is always-on targeting.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.status.description
Lifecycle state. `draft` is editable, `running` is active, `paused` is temporarily inactive, and `completed` is permanently stopped.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.createdAt.description
ISO-8601 timestamp when the experiment was created.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.updatedAt.description
ISO-8601 timestamp for the last persisted update, if any.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.startedAt.description
ISO-8601 timestamp when the experiment most recently entered a running state.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisStartedAt.description
ISO-8601 timestamp when the analysis plan was locked at experiment start.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.stoppedAt.description
ISO-8601 timestamp when the experiment was completed, if it has been stopped.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.trafficAllocation.description
Percent of eligible traffic assigned into the experiment. Use 0 to fully disable enrollment without deleting the experiment.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.includeQueryString.description
For redirect variants, whether the original page query string should be forwarded onto the redirect URL.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.winnerVariantId.description
Declared winning variant — reporting metadata only. Records which variant won; does NOT change what visitors are served. Set at stop time or later via `POST /experiments/{id}/winner`.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.rolloutVariantId.description
Variant currently rolled out to 100% of targeted traffic on a completed experiment. When set (and not the control), the runtime keeps serving it to every matching visitor — a winning redirect becomes an ongoing redirect. Independent of `winnerVariantId`. Set via `POST /experiments/{id}/rollout`; cleared via `POST /experiments/{id}/end-rollout`.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.urlPatterns.description
Glob-style URL patterns that must match for the experiment to be eligible. Each pattern is either a path (`/pricing`, matched on any domain) or a host-qualified pattern (`get.example.com/pricing` or `https://get.example.com/pricing`, matched against the full URL so a single domain or subdomain can be targeted). Use `*` to match within a path segment and `**` to match across segments. Up to 200 patterns; each pattern up to 2000 characters. An empty array (or omitting the field) matches all URLs — equivalent to `['**']`. The host(s) targeted here must also appear in the parent experiment settings' `whitelistDomains` — that allowlist is what limits which domains can load your experiments (see `GET /experiment-settings`). If the host is missing, the SDK refuses to load there and the experiment never runs, even after `POST /experiments/{id}/start` succeeds.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.audienceId.description
Optional audience identifier used for server-side eligibility filtering.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorProperties.description
Optional visitor-property matching rules. These are passed through as JSON for experimentation targeting.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.visitorStatus.description
Whether the experiment should target new visitors, returning visitors, or any visitor.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.key.description
Query string key to inspect on the current page URL.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.operator.description
Comparison operator applied to the query string value.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.items.properties.value.description
Comparison value used by operators that require one. Omit for `exists` and `not_exists`.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.properties.queryParams.description
Additional query-string conditions that must all match for the visitor to qualify.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.targetingRules.description
Eligibility rules: URL-pattern globs, optional audience, query-param conditions, visitor status, and (server-side) visitor properties. Same shape as the create/patch input.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.primary.description
Primary success metric used in the results report.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.eventName.description
Name of the event used to measure success for this metric.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.items.properties.funnelId.description
Optional funnel identifier when the metric is derived from an existing funnel definition.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.properties.secondary.description
Optional secondary metrics tracked alongside the primary goal.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.metrics.description
Configured success metrics. The read shape mirrors the write shape — `metrics` from a GET response can be PATCHed back without modification.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisConfig.description
Normalized statistical analysis plan. Missing legacy rows resolve to Bayesian analysis in GraphQL.

# paths./rest/v1/experiments/{id}/resume.post.responses.200.content.application/json.schema.properties.experiment.properties.analysisMetricSnapshot.description
Primary metric definition frozen with the analysis plan at start time.

# paths./rest/v1/experiments/{id}/resume.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/resume.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/results.get.description
Aggregate per-variant impressions, conversions, conversion rate, and Bayesian probability-to-be-best across the experiment runtime window. Requires scope: experiment:find

# paths./rest/v1/experiments/{id}/results.get.parameters[].schema.description
Optional override for the conversion event name. When omitted, the experiment primary metric event is used.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.items.properties.name.description
Human-readable variant name as configured on the experiment (e.g. `Control`, `Treatment`). Lets callers label results without a separate lookup against `/experiment-variants`.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.items.properties.isControl.description
Whether this variant is the experiment control. Exactly one variant per experiment is the control.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.items.properties.impressions.description
Number of distinct experiment-impression events counted for the variant.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.items.properties.conversions.description
Number of post-exposure conversions attributed to the variant.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.items.properties.conversionRate.description
Conversions divided by impressions for this variant.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.items.properties.probabilityToBeBest.description
Bayesian probability that this variant is the best-performing option among all variants in the experiment.

# paths./rest/v1/experiments/{id}/results.get.responses.200.content.application/json.schema.properties.variants.description
Aggregate performance metrics for each variant in the experiment over the experiment runtime window.

# paths./rest/v1/experiments/{id}/results.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/results.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/analysis.get.description
Return the configured Bayesian, fixed-horizon Frequentist, or Sequential analysis for conversion metrics; Bayesian and Frequentist also support value metrics. The response includes common visitor, impression, readiness, evidence, and data-quality fields plus the applicable method-specific result block. Visitors are the inferential unit; impressions remain a delivery diagnostic. Secondary event overrides are labeled exploratory, and unsupported legacy plans suppress official evidence. Requires scope: experiment:find

# paths./rest/v1/experiments/{id}/analysis.get.parameters[].schema.description
Optional override for the conversion event name. When omitted, the experiment primary metric event is used.

# paths./rest/v1/experiments/{id}/analysis.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/analysis.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/results-time-series.get.description
Per-day per-variant impressions, conversions, and conversion rate, sliced to a date range. Use this to chart trends, compare windows, or zoom in on a specific period. Pass `startDate` / `endDate` (`YYYY-MM-DD`, UTC, both inclusive) to set the window; both default to the full experiment runtime when omitted, so the no-arg call returns every day from start to today (or to `stoppedAt` for completed experiments). The response orders days oldest-first and omits days with no impressions, so an empty `days` array means there was no measured traffic in the window. Requires scope: experiment:find

# paths./rest/v1/experiments/{id}/results-time-series.get.parameters[].schema.description
Optional override for the conversion event name. When omitted, the experiment primary metric event is used.

# paths./rest/v1/experiments/{id}/results-time-series.get.parameters[].schema.description
Inclusive lower bound of the response window, as a UTC calendar day in `YYYY-MM-DD` format. Defaults to the experiment start date when omitted. Values before the experiment started are silently clamped to the experiment start.

# paths./rest/v1/experiments/{id}/results-time-series.get.parameters[].schema.description
Inclusive upper bound of the response window, as a UTC calendar day in `YYYY-MM-DD` format. Defaults to the experiment stop date for completed experiments, or today for running experiments. Values after that are silently clamped. The window between `startDate` and `endDate` must be 366 days or fewer.

# paths./rest/v1/experiments/{id}/results-time-series.get.responses.200.content.application/json.schema.properties.days.items.properties.date.description
UTC calendar day in `YYYY-MM-DD` format.

# paths./rest/v1/experiments/{id}/results-time-series.get.responses.200.content.application/json.schema.properties.days.description
Per-day metrics for each variant. Days with no impression rows are omitted from the response.

# paths./rest/v1/experiments/{id}/results-time-series.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/results-time-series.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiments/{id}/session-replays.get.description
List session replays for sessions in which the `$experiment_impression` event fired for this experiment. Each row is one session with the variant the visitor was assigned for that impression. Sessions are ordered newest first by session start. Filter to one variant with `variant_id`. Cursor pagination via `limit` (1–100, default 25) and `cursor`; malformed cursors return 400. Requires scope: experiment:find

# paths./rest/v1/experiments/{id}/session-replays.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/experiments/{id}/session-replays.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/experiments/{id}/session-replays.get.parameters[].schema.description
Optional filter to a single variant ID. Returns sessions for all variants when omitted.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.description
Session replays for visitors exposed to this experiment

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.sessionId.description
Session identifier (`dp_sid`). Combine with `visitorId` and the `YYYY-MM-DD` date of `startTime` to deep-link to a replay outside of the response `replayUrl`.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.visitorId.description
Visitor identifier whose session is recorded here.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.variantName.description
Human-readable name of the variant the visitor was assigned for the recorded impression. May be empty if the variant has been deleted since the impression fired.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.startTime.description
ISO-8601 timestamp of the first event recorded in this session. Sessions are ordered newest first by this field.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.durationSeconds.description
Time between the first and last events recorded for this session, in whole seconds.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.pageCount.description
Number of distinct page paths visited during this session.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.items.properties.replayUrl.description
Deep link to the in-app replay viewer for this session. Requires an authenticated session in the Ours Privacy app for an account that owns this experiment — not embeddable in customer-facing emails.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.200.content.application/json.schema.properties.entities.description
Sessions in which a `$experiment_impression` event for this experiment was recorded, ordered newest first by session start time.

# paths./rest/v1/experiments/{id}/session-replays.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiments/{id}/session-replays.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-variants.get.description
List variants for a specific parent experiment. Requires the `experimentId` query parameter — variants are always scoped to a single experiment. Supports cursor pagination via `limit` and `cursor`; SDK runtimes that need the full set in one request can pass `?limit=100`. Requires scope: experiment:find

# paths./rest/v1/experiment-variants.get.parameters[].schema.description
Maximum number of variants to return. Defaults to 200; values below 1 are clamped to 1 and values above 200 are clamped to 200. Variants per experiment are capped at 200 server-side, so a single request returns the full set.

# paths./rest/v1/experiment-variants.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/experiment-variants.get.parameters[].schema.description
Required. List variants belonging to this parent experiment.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.items.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiment-variants.get.responses.200.content.application/json.schema.properties.entities.description
Variants on the parent experiment, including the auto-generated control. Returns an empty list when the experiment does not exist or is not visible to the caller. Variants per experiment are capped at 200 server-side.

# paths./rest/v1/experiment-variants.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-variants.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-variants.post.description
Create a new experiment variant. Requires scope: experiment:update

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.experimentId.description
Parent experiment ID that will own this new variant.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.name.description
Human-readable name for the new variant.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.weight.description
Traffic weight for this variant as a percentage (0–100). Treatment weights are percentages of the split and must total 99% or less to leave room for the control; the control variant is the remainder (100 − Σ treatment weights, always ≥ 1%) and is maintained automatically.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.variantType.description
Variant delivery mechanism. `dom_modifications` mutates the current page in-place at SDK runtime — use it for copy/style/image/HTML changes that keep visitors on the same URL (headline copy tests, button color, hero image swap). `redirect` routes the visitor to a different URL entirely — use it for landing-page A/B tests, alternate pricing pages, or any test where the *page itself* is the variable. They are not interchangeable: a redirect variant cannot also tweak DOM, and a dom_modifications variant cannot send the visitor elsewhere.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.redirectUrl.description
Required for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.items.properties.selector.description
CSS selector for the element to modify at runtime. PREFER specific selectors that match exactly one element: an `id` (`#hero-headline`), a stable `data-*` attribute (`[data-testid="hero-headline"]`), or a unique class/structural chain (`section.hero > h1.headline`). AVOID bare tag selectors like `h1`, `button`, or `img` — modern pages usually contain several, and the runtime applies the mutation to ONLY THE FIRST match, which silently picks the wrong element. If you only have a tag name, scope it with the nearest unique ancestor (e.g. `main h1`, `header nav a:first-of-type`).

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — or you can supply the structured `styles` / `attribute` field instead and the server will normalize.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.items.properties.styles.description
Use this for `setStyle` to avoid JSON-stringifying `{property: value}` yourself. Ignored for other actions.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.items.properties.attribute.description
Use this for `setAttribute` to avoid JSON-stringifying `{name: value}` yourself. Ignored for other actions.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.domModifications.description
Required for DOM modification variants. Omit for redirect variants. Each entry is `{selector, action, value}`.

# paths./rest/v1/experiment-variants.post.requestBody.content.application/json.schema.properties.isControl.description
Mark this variant as the experiment control. Defaults to `false`. The API rejects the request with 409 if the experiment already has a control variant. Every experiment keeps exactly one control whose weight is the auto-derived remainder of the split, so the control cannot be cleared while it would leave the treatments at 100% (no room for a control). DELETE on the control returns 409.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants.post.responses.200.content.application/json.schema.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiment-variants.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-variants.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-variants/{id}.get.description
Find a single experiment variant by ID. Requires scope: experiment:find

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants/{id}.get.responses.200.content.application/json.schema.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiment-variants/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-variants/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-variants/{id}.patch.description
Partially update an experiment variant. Only the fields you send are changed. Requires scope: experiment:update

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.weight.description
Updated traffic weight as a percentage (0–100). The control variant weight is derived from the treatments (it is the remainder of the split) and cannot be set directly.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.variantType.description
Updated variant delivery mechanism. `dom_modifications` mutates the current page in-place; `redirect` sends the visitor to a different URL — pick based on whether the *page* or the *content* is the variable. Changing this also requires updating the matching payload field (`redirectUrl` or `domModifications`).

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.redirectUrl.description
Updated redirect URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.items.properties.selector.description
CSS selector for the element to modify at runtime. PREFER specific selectors that match exactly one element: an `id` (`#hero-headline`), a stable `data-*` attribute (`[data-testid="hero-headline"]`), or a unique class/structural chain (`section.hero > h1.headline`). AVOID bare tag selectors like `h1`, `button`, or `img` — modern pages usually contain several, and the runtime applies the mutation to ONLY THE FIRST match, which silently picks the wrong element. If you only have a tag name, scope it with the nearest unique ancestor (e.g. `main h1`, `header nav a:first-of-type`).

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — or you can supply the structured `styles` / `attribute` field instead and the server will normalize.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.items.properties.styles.description
Use this for `setStyle` to avoid JSON-stringifying `{property: value}` yourself. Ignored for other actions.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.items.properties.attribute.description
Use this for `setAttribute` to avoid JSON-stringifying `{name: value}` yourself. Ignored for other actions.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.domModifications.description
Updated declarative DOM mutations. Sending this field replaces the prior list — partial-array merging is not supported.

# paths./rest/v1/experiment-variants/{id}.patch.requestBody.content.application/json.schema.properties.isControl.description
Promote or demote this variant as the control. Promoting a second variant while another already has `isControl: true` is rejected with 409. Demoting the control (`isControl: false`) is rejected when it would leave the treatments at 100% — there must always be room for a control.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants/{id}.patch.responses.200.content.application/json.schema.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiment-variants/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-variants/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-variants/{id}.delete.description
Delete an experiment variant. Requires scope: experiment:update

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.id.description
Unique identifier for this experiment variant.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.experimentId.description
Parent experiment ID this variant belongs to.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.name.description
Human-readable variant name shown in the dashboard and results.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.isControl.description
Whether this is the baseline control variant.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.weight.description
Relative traffic weight used when assigning visitors among variants in an active experiment.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.variantType.description
How this variant changes the user experience. `dom_modifications` for on-page changes or `redirect` for redirect tests.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.redirectUrl.description
Target URL for redirect variants. Use either a site-relative path such as `/pricing-v2` or an absolute `https://` URL. Cross-origin `http://` URLs are rejected. Omit for DOM modification variants.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.items.properties.selector.description
CSS selector used to find the element to modify on the page at runtime.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.items.properties.action.description
Mutation to apply when the selector matches. Use `redirectUrl` instead of DOM modifications for redirect variants.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.items.properties.value.description
Canonical action payload. For `setText` / `setHtml` / `customCss` / `customJs` / `setImage` / `insertBefore` / `insertAfter` this is the literal text/HTML/CSS/JS/URL. For `setStyle` and `setAttribute` it is a JSON-stringified `{key: value}` object — prefer the structured `styles` / `attribute` fields below to avoid manual JSON encoding.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.items.properties.property.description
CSS property name in camelCase or kebab-case.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.items.properties.styles.description
Populated on read for `setStyle` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.items.properties.attribute.description
Populated on read for `setAttribute` modifications, parsed from `value`. Customers may also send this field instead of a JSON-stringified `value` on write — see `domModificationInputSchema`.

# paths./rest/v1/experiment-variants/{id}.delete.responses.200.content.application/json.schema.properties.domModifications.description
Ordered list of declarative DOM mutations applied when this variant is assigned.

# paths./rest/v1/experiment-variants/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-variants/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-settings.get.description
List experiment settings records for the account. Use the returned `id` as `experimentSettingsId` when creating an experiment. Requires scope: experimentSettings:list

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Unique identifier for the account-level experiment settings record.

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.accountId.description
Account that owns this experiment settings record.

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Human-readable name for this experimentation configuration.

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.pixel.description
Pixel token used by the experiments runtime and CDN configuration. This is informative for REST clients; use the settings `id` for createExperiment.

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser.

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.items.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings.get.responses.200.content.application/json.schema.properties.entities.description
Experiment settings records available to the current account. Use the `id` from this response as `experimentSettingsId` when creating an experiment. Most accounts have a single record; this list is not paginated.

# paths./rest/v1/experiment-settings.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-settings.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-settings.post.description
Create the account-level experimentation bootstrap record. Most accounts should only ever have one. Requires scope: experimentSettings:create

# paths./rest/v1/experiment-settings.post.requestBody.content.application/json.schema.properties.name.description
Human-readable name for this experimentation configuration. Defaults to `Experiment Settings` when omitted on create.

# paths./rest/v1/experiment-settings.post.requestBody.content.application/json.schema.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser. Defaults to `_cord_exp` when omitted on create.

# paths./rest/v1/experiment-settings.post.requestBody.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings.post.responses.200.content.application/json.schema.properties.id.description
Unique identifier for the account-level experiment settings record.

# paths./rest/v1/experiment-settings.post.responses.200.content.application/json.schema.properties.accountId.description
Account that owns this experiment settings record.

# paths./rest/v1/experiment-settings.post.responses.200.content.application/json.schema.properties.name.description
Human-readable name for this experimentation configuration.

# paths./rest/v1/experiment-settings.post.responses.200.content.application/json.schema.properties.pixel.description
Pixel token used by the experiments runtime and CDN configuration. This is informative for REST clients; use the settings `id` for createExperiment.

# paths./rest/v1/experiment-settings.post.responses.200.content.application/json.schema.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser.

# paths./rest/v1/experiment-settings.post.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-settings.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-settings.post.responses.409.description
Conflict — experiment settings already exist for this account. Use PATCH on the existing record instead.

# paths./rest/v1/experiment-settings/{id}.get.description
Find a single experiment settings record by ID. Returns 404 when no record matches the supplied id. Requires scope: experimentSettings:find

# paths./rest/v1/experiment-settings/{id}.get.responses.200.content.application/json.schema.properties.id.description
Unique identifier for the account-level experiment settings record.

# paths./rest/v1/experiment-settings/{id}.get.responses.200.content.application/json.schema.properties.accountId.description
Account that owns this experiment settings record.

# paths./rest/v1/experiment-settings/{id}.get.responses.200.content.application/json.schema.properties.name.description
Human-readable name for this experimentation configuration.

# paths./rest/v1/experiment-settings/{id}.get.responses.200.content.application/json.schema.properties.pixel.description
Pixel token used by the experiments runtime and CDN configuration. This is informative for REST clients; use the settings `id` for createExperiment.

# paths./rest/v1/experiment-settings/{id}.get.responses.200.content.application/json.schema.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser.

# paths./rest/v1/experiment-settings/{id}.get.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-settings/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-settings/{id}.patch.description
Partially update an experiment settings. Only the fields you send are changed. Requires scope: experimentSettings:update

# paths./rest/v1/experiment-settings/{id}.patch.requestBody.content.application/json.schema.properties.name.description
Human-readable name for this experimentation configuration. Defaults to `Experiment Settings` when omitted on create.

# paths./rest/v1/experiment-settings/{id}.patch.requestBody.content.application/json.schema.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser. Defaults to `_cord_exp` when omitted on create.

# paths./rest/v1/experiment-settings/{id}.patch.requestBody.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings/{id}.patch.responses.200.content.application/json.schema.properties.id.description
Unique identifier for the account-level experiment settings record.

# paths./rest/v1/experiment-settings/{id}.patch.responses.200.content.application/json.schema.properties.accountId.description
Account that owns this experiment settings record.

# paths./rest/v1/experiment-settings/{id}.patch.responses.200.content.application/json.schema.properties.name.description
Human-readable name for this experimentation configuration.

# paths./rest/v1/experiment-settings/{id}.patch.responses.200.content.application/json.schema.properties.pixel.description
Pixel token used by the experiments runtime and CDN configuration. This is informative for REST clients; use the settings `id` for createExperiment.

# paths./rest/v1/experiment-settings/{id}.patch.responses.200.content.application/json.schema.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser.

# paths./rest/v1/experiment-settings/{id}.patch.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-settings/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/experiment-settings/{id}.delete.description
Delete the experimentation bootstrap record. This also deletes child experiments, variants, and personalization properties owned by it. Requires scope: experimentSettings:delete

# paths./rest/v1/experiment-settings/{id}.delete.responses.200.content.application/json.schema.properties.id.description
Unique identifier for the account-level experiment settings record.

# paths./rest/v1/experiment-settings/{id}.delete.responses.200.content.application/json.schema.properties.accountId.description
Account that owns this experiment settings record.

# paths./rest/v1/experiment-settings/{id}.delete.responses.200.content.application/json.schema.properties.name.description
Human-readable name for this experimentation configuration.

# paths./rest/v1/experiment-settings/{id}.delete.responses.200.content.application/json.schema.properties.pixel.description
Pixel token used by the experiments runtime and CDN configuration. This is informative for REST clients; use the settings `id` for createExperiment.

# paths./rest/v1/experiment-settings/{id}.delete.responses.200.content.application/json.schema.properties.cookieName.description
Cookie name used to persist sticky variant assignments in the browser.

# paths./rest/v1/experiment-settings/{id}.delete.responses.200.content.application/json.schema.properties.whitelistDomains.description
Limits which domains can load your experiments. When set, experiments using this settings record are only served on these domains; the SDK refuses to load anywhere else and your experiments never run on those hosts. Separate from source `whitelistDomains`, which limits which domains can send events to the CDP.

# paths./rest/v1/experiment-settings/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/experiment-settings/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings.get.description
List mappings for an entity (a source or destination). Requires the `entityId` query parameter. Supports cursor pagination via `limit` and `cursor`. Sorted by `priority` ascending, then by `id` for deterministic pagination. Requires scope: mapping:list

# paths./rest/v1/mappings.get.parameters[].schema.description
Maximum number of mappings to return. Defaults to 1000; values below 1 are clamped to 1 and values above 1000 are clamped to 1000. Most accounts can fetch the full list in one request.

# paths./rest/v1/mappings.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/mappings.get.parameters[].schema.description
Filter mappings by their parent entity id. Must be a destination id or source id.

# paths./rest/v1/mappings.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings.get.responses.200.content.application/json.schema.properties.entities.items.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings.post.description
Create a mapping. Two body shapes are accepted:

1. Quick-create — `{ allowedEventId, destinationId }`. Binds an allowed event to a destination. Returns a slim entity with empty `mappings[]`; follow up with PATCH to populate fields.
2. Template fat-create — `{ entityId, templateId, mappings?, logic?, isEnabled?, name?, insertAfterIdx? }`. Lands a fully-shaped mapping in one round-trip. Use `GET /rest/v1/mapping-templates?entityId=...` to discover the valid `templateId` and `mappings[].property` values.

Sending both `allowedEventId` and `templateId` returns 400. Requires scope: mapping:create

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.allowedEventId.description
Quick-create variant: allowed event to bind the new mapping to. Required together with `destinationId`. Mutually exclusive with `templateId`/`entityId`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.destinationId.description
Quick-create variant: destination that should receive events matched by this mapping. Required together with `allowedEventId`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.entityId.description
Template fat-create variant: destination or source id this mapping belongs to. Required together with `templateId`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.templateId.description
Template fat-create variant: template id from `GET /rest/v1/mapping-templates`. Picks the property descriptor set used to validate `mappings[].property`. Required together with `entityId`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.insertAfterIdx.description
Template fat-create only. Zero-based position in the destination/source priority order to insert this mapping after. Omit to append at the end.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.name.description
Template fat-create only. Override the auto-generated mapping name.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.isEnabled.description
Template fat-create only. Initial enabled state. Defaults to `true`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.properties.mappings.description
Template fat-create only. Optional initial property mappings. When omitted the mapping is seeded with template defaults for sources and non-default destination templates, and with `[]` for default destination templates.

# paths./rest/v1/mappings.post.requestBody.content.application/json.schema.description
Two body shapes are accepted, distinguished by which keys are sent. Quick-create — `{ allowedEventId, destinationId }`. Template fat-create — `{ entityId, templateId, mappings?, logic?, isEnabled?, name?, insertAfterIdx? }`. Sending neither, both, or an incomplete pair returns 400 with a message telling you which variant to complete.

# paths./rest/v1/mappings.post.responses.200.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings.post.responses.200.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings.post.responses.200.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings.post.responses.400.description
Bad request — both `allowedEventId` and `templateId` were sent, or the body did not match either variant.

# paths./rest/v1/mappings.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/{id}.get.description
Find a single mapping by ID. Requires scope: mapping:find

# paths./rest/v1/mappings/{id}.get.responses.200.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings/{id}.get.responses.200.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings/{id}.get.responses.200.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/{id}.patch.description
Partially update a mapping. Only the fields you send are changed. Send `isEnabled: false` to pause the mapping without changing other fields (mirrors `status` on destinations). `mappings[]` is replaced wholesale when sent. Requires scope: mapping:update

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.isEnabled.description
Flip the mapping on/off without changing other fields. `null` is treated as omitted.

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/mappings/{id}.patch.requestBody.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings/{id}.patch.responses.200.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings/{id}.patch.responses.200.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings/{id}.patch.responses.200.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/{id}.delete.description
Delete a mapping. Requires scope: mapping:delete

# paths./rest/v1/mappings/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/reorder.post.description
Reassign `priority` for a set of mappings. Pass `{ uuids: [...] }` with the mapping ids in their new order — index 0 becomes the highest-priority mapping. All ids must belong to the same parent entity (source or destination); mixing entities returns 400. Requires scope: mapping:update

# paths./rest/v1/mappings/reorder.post.requestBody.content.application/json.schema.properties.uuids.description
Mapping ids in their new priority order, low priority index first. All ids must belong to the same parent entity (source or destination).

# paths./rest/v1/mappings/reorder.post.requestBody.content.application/json.schema.description
Reassign `priority` for the supplied mappings. The position in `uuids` becomes the new priority order: index 0 is highest priority.

# paths./rest/v1/mappings/reorder.post.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/mappings/reorder.post.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/mappings/reorder.post.responses.200.content.application/json.schema.properties.entities.items.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/mappings/reorder.post.responses.400.description
Bad request — `uuids` was empty, contained unknown ids, or referenced mappings across multiple parent entities.

# paths./rest/v1/mappings/reorder.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/reorder.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/templates.get.description
Discover every mapping template available for a destination or source, with full property descriptors inlined. Use the returned `id` as `templateId` when calling `POST /rest/v1/mappings` (template fat-create variant), and use each entry under `mappings[]` to learn the valid `property`, `kind`, `modificationOptions`, and any enforced `options`. The `isDefault: true` entry is the destination's built-in default template, configured via `PUT /rest/v1/default-mappings/{destinationId}`. Requires scope: mapping:find

# paths./rest/v1/mappings/templates.get.responses.200.description
Available mapping templates for an entity

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Template identifier — pass to `POST /rest/v1/mappings` as `templateId`.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.isDefault.description
True for the destination's built-in default template (the one stored at `MAPPER#{destinationId}` when configured). Sources only have one template; it is always default.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.property.description
The value to send as `mappings[].property` when creating or patching a mapping.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.label.description
Human-readable label (e.g. "Email", "Event Name").

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.description.description
Long-form description / tooltip for this property.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.kind.description
Type information for SDK validation (Text, Integer, Email, Url, IP, Object, KnownObject, Date, DateTime, Array, Boolean, JSON).

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.map.description
The template default source expression, e.g. `{{visitor.email}}`.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.modification.description
The template default modification (hashing / case / URL truncation).

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.modificationOptions.description
Suggested modification options for this property. Not a whitelist.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.options.description
When set, the ONLY valid `map` values for this property. Typically used for enum-shaped destinations.

# paths./rest/v1/mappings/templates.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.suggestedOptions.description
Non-binding suggestions for the `map` value (e.g. common event names a customer might want to use).

# paths./rest/v1/mappings/templates.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/templates.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/default-variables.get.description
Lists the platform-provided variables that any mapping `value` can reference (e.g. `event.email`, `event.request_context.ip`, `visitor.id`). Account-agnostic discovery — use these paths as the right-hand side of a mapping field. Requires scope: variables:find-default

# paths./rest/v1/mappings/default-variables.get.responses.200.description
Built-in variables available on every account

# paths./rest/v1/mappings/default-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.path.description
Dot-path used in mapping `value` fields (e.g. `event.email`).

# paths./rest/v1/mappings/default-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.examples.description
Sample values observed for this path (empty for unsampled defaults).

# paths./rest/v1/mappings/default-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.popularity.description
Relative popularity rank. Higher means more frequently set across events.

# paths./rest/v1/mappings/default-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.advancedInfo.description
Optional long-form context shown in the variable dictionary drawer.

# paths./rest/v1/mappings/default-variables.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/default-variables.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/custom-variables.get.description
Lists the custom variables observed in this account’s recent event stream (last 14 days). These are dot-paths under `event.event_properties.*` that callers can target in mapping `value` fields. Newly seen properties may take a few minutes to appear; an empty list means no custom properties have been observed yet for this account. Requires scope: variables:find-custom

# paths./rest/v1/mappings/custom-variables.get.responses.200.description
Account-specific variables sampled from the last 14 days of events

# paths./rest/v1/mappings/custom-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.path.description
Dot-path used in mapping `value` fields (e.g. `event.email`).

# paths./rest/v1/mappings/custom-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.examples.description
Sample values observed for this path (empty for unsampled defaults).

# paths./rest/v1/mappings/custom-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.popularity.description
Relative popularity rank. Higher means more frequently set across events.

# paths./rest/v1/mappings/custom-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.advancedInfo.description
Optional long-form context shown in the variable dictionary drawer.

# paths./rest/v1/mappings/custom-variables.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/custom-variables.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/mappings/modifications.get.description
Lists every value accepted on a mapping field’s `modification` property, with a human-readable label and one-sentence description. Account-agnostic. Use this alongside `GET /rest/v1/mapping-templates` to render a labelled modification picker without hardcoding the enum. Requires scope: variables:find-default

# paths./rest/v1/mappings/modifications.get.responses.200.description
Supported mapping modification types with descriptions

# paths./rest/v1/mappings/modifications.get.responses.200.content.application/json.schema.properties.entities.items.properties.value.description
Enum value to send on `modification` fields when authoring a mapping.

# paths./rest/v1/mappings/modifications.get.responses.200.content.application/json.schema.properties.entities.items.properties.label.description
Short human-readable name (suitable for picker labels).

# paths./rest/v1/mappings/modifications.get.responses.200.content.application/json.schema.properties.entities.items.properties.description.description
One-sentence explanation of what the modification does to the mapped value.

# paths./rest/v1/mappings/modifications.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/mappings/modifications.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/default-mappings.get.description
List every stored default mapping for the account, one per destination that has ever written a default. Destinations that have not yet written a default mapping do not appear here. Use `GET /rest/v1/default-mappings/{destinationId}` to fetch the hydrated would-be row for a specific destination. Requires scope: mapping:list

# paths./rest/v1/default-mappings.get.responses.200.description
Default mapping rows that have been written for any destination

# paths./rest/v1/default-mappings.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/default-mappings.get.responses.200.content.application/json.schema.properties.entities.items.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/default-mappings.get.responses.200.content.application/json.schema.properties.entities.items.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/default-mappings.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/default-mappings.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/default-mappings/{id}.get.description
Fetch the destination's default mapping by destination id. Returns a hydrated row with empty `mappings[]` when no default mapping has been written yet (so callers do not need to handle a 404-vs-200 branch). Each destination has at most one default mapping. Requires scope: mapping:find

# paths./rest/v1/default-mappings/{id}.get.responses.200.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/default-mappings/{id}.get.responses.200.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/default-mappings/{id}.get.responses.200.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/default-mappings/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/default-mappings/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/default-mappings/{id}.put.description
Upsert the destination default mapping. Always replaces `mappings[]` wholesale (default mappings have no merge-partial semantic). Default mappings cannot have custom `logic`; the field is not accepted on this endpoint. Requires scope: mapping:update

# paths./rest/v1/default-mappings/{id}.put.requestBody.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/default-mappings/{id}.put.requestBody.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/default-mappings/{id}.put.requestBody.content.application/json.schema.properties.mappings.description
Property mappings to persist as the destination default. Use `GET /rest/v1/mapping-templates?entityId={destinationId}` to discover the valid `property` values.

# paths./rest/v1/default-mappings/{id}.put.requestBody.content.application/json.schema.properties.isEnabled.description
Toggle the default mapping on/off. Defaults to `true` when omitted. `null` is treated as omitted.

# paths./rest/v1/default-mappings/{id}.put.requestBody.content.application/json.schema.description
Upsert the default mapping for a destination. Default mappings cannot have custom `logic` (the resolver rejects it), so the field is intentionally omitted here.

# paths./rest/v1/default-mappings/{id}.put.responses.200.content.application/json.schema.properties.mappings.items.properties.property.description
Destination-side field name. Comes from the destination template — discover the valid set via `GET /rest/v1/mapping-templates?entityId=...`.

# paths./rest/v1/default-mappings/{id}.put.responses.200.content.application/json.schema.properties.mappings.items.properties.map.description
Source expression sent to the destination for this `property`. Use `{{...}}` template syntax to substitute values from the event/visitor record: `{{event.event}}`, `{{event.event_properties.value}}`, `{{visitor.email}}`. Bare strings (no `{{}}`) are sent verbatim. Note: `{{...}}` template syntax belongs HERE, NOT in `logic.condition.property` — logic conditions use bare dotted paths like `$event.event_properties.value`.

# paths./rest/v1/default-mappings/{id}.put.responses.200.content.application/json.schema.properties.logic.description
Condition tree gating when this mapping fires. A node is either a leaf `condition` or a combinator (`AND`, `OR`, `NOT`). Combinator children are themselves logic nodes, so trees nest arbitrarily.

Example leaf: `{ "condition": { "property": "$event.event", "operator": "Is", "value": "page_view" } }`.

Example combinator: `{ "AND": [{ "condition": ... }, { "OR": [...] }] }`.

# paths./rest/v1/default-mappings/{id}.put.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/default-mappings/{id}.put.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/locations.get.description
List every location for this account. Not paginated — each account has a small map-count limit (single digits in practice) so the response always fits in a single page. Requires scope: maps:list

# paths./rest/v1/locations.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/locations.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/locations.post.description
Create a new location (map embed). All address fields are optional and can be filled in later via PATCH. Returns the slim entity with the server-assigned `id` so callers can immediately request `GET /rest/v1/locations/{id}/embed-code`. Requires scope: maps:create

# paths./rest/v1/locations.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/locations.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/locations.post.responses.409.description
Conflict — the account has reached its map count limit. Reason is in the response `error` field.

# paths./rest/v1/locations/{id}.patch.description
Partially update a location. Only the fields you send are changed. `additionalAddresses` is replaced wholesale when sent — partial item updates are not merged. The map's computed center is recalculated on every PATCH from the latest coordinates. Requires scope: maps:update

# paths./rest/v1/locations/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/locations/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/locations/{id}/embed-code.get.description
Generate the paste-ready HTML embed snippet for a location. The response is a single self-contained HTML string (a `

# paths./rest/v1/locations/{id}/embed-code.get.parameters[].schema.description
Brand color used in the embedded map UI. Any CSS color string.

# paths./rest/v1/locations/{id}/embed-code.get.parameters[].schema.description
Render the address sidebar overlay next to the map. Send `false` to hide.

# paths./rest/v1/locations/{id}/embed-code.get.parameters[].schema.description
Initial map zoom level (Google-style 1–20).

# paths./rest/v1/locations/{id}/embed-code.get.parameters[].schema.description
Whether the embed renders map controls. `accessible` enables keyboard-navigable controls.

# paths./rest/v1/locations/{id}/embed-code.get.parameters[].schema.description
Emit a `schema.org` Place JSON-LD block alongside the iframe so search engines can index the location.

# paths./rest/v1/locations/{id}/embed-code.get.responses.200.content.application/json.schema.properties.embedCode.description
Self-contained HTML snippet (a `

# paths./rest/v1/locations/{id}/embed-code.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/locations/{id}/embed-code.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners.get.description
List every web scanner for this account. Not paginated — accounts have a small number of scanners in practice, so the response always fits in a single page. Requires scope: webScanner:list

# paths./rest/v1/web-scanners.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners.post.description
Create a new web scanner for a root domain. A first scan is enqueued automatically after creation on a best-effort basis. `rootDomain` is required; missing, empty, or malformed values are rejected as HTTP 400. Everything else falls back to defaults (`status: Enabled`, `urlLimit: 100`, no excluded patterns, no extra seed URLs). The returned entity is the created scanner row and may not yet reflect async scan-state changes. Requires scope: webScanner:create

# paths./rest/v1/web-scanners.post.requestBody.content.application/json.schema.properties.rootDomain.description
Root domain to crawl (e.g. `example.com`). Required on create. Missing or empty values fail request validation as HTTP 400. Present-but-malformed values are rejected as HTTP 400 with the validation reason in `details`.

# paths./rest/v1/web-scanners.post.requestBody.content.application/json.schema.properties.excludedPatterns.description
URL glob patterns to skip during crawl. Max 100 entries.

# paths./rest/v1/web-scanners.post.requestBody.content.application/json.schema.properties.includedUrls.description
Additional seed URLs to include as crawl entry points. Each must be an http(s) URL. Max 100 entries.

# paths./rest/v1/web-scanners.post.requestBody.content.application/json.schema.properties.urlLimit.description
Maximum URLs to crawl per scan (1–20,000). Defaults to 100 when omitted.

# paths./rest/v1/web-scanners.post.requestBody.content.application/json.schema.properties.scanSchedule.description
How often the scanner crawls this monitor on its own: `daily`, `weekly`, `monthly`, or `manual` to disable scheduled crawls and only run on demand. Defaults to `weekly`. Cadences advance on UTC calendar days from the last completed scan.

# paths./rest/v1/web-scanners.post.responses.400.description
Bad request — the request body is malformed or `rootDomain` is missing, empty, or not a valid domain.

# paths./rest/v1/web-scanners.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners.post.responses.409.description
Conflict — one of the business-rule limits was exceeded (for example too many excluded patterns or `urlLimit` out of range). Reason is in the response `error` field.

# paths./rest/v1/web-scanners/{id}.get.description
Find a single web scanner by ID. Requires scope: webScanner:find

# paths./rest/v1/web-scanners/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners/{id}.patch.description
Partially update a web scanner. Only the fields you send are changed; omitted fields keep their current value. List-valued fields (`excludedPatterns`, `includedUrls`) are replaced wholesale when sent. If `rootDomain` is provided and malformed, the request is rejected as HTTP 400. Use `POST /rest/v1/web-scanners/{id}/trigger` to start a new scan after edits. Requires scope: webScanner:update

# paths./rest/v1/web-scanners/{id}.patch.requestBody.content.application/json.schema.properties.rootDomain.description
Replace the scanner root domain. When provided, malformed values are rejected as HTTP 400 with the validation reason in `details`.

# paths./rest/v1/web-scanners/{id}.patch.requestBody.content.application/json.schema.properties.scanSchedule.description
How often the scanner crawls this monitor on its own: `daily`, `weekly`, `monthly`, or `manual` to disable scheduled crawls and only run on demand. Defaults to `weekly`. Cadences advance on UTC calendar days from the last completed scan. Omit to leave the current cadence unchanged.

# paths./rest/v1/web-scanners/{id}.patch.responses.400.description
Bad request — the request body is malformed or `rootDomain` is not a valid domain.

# paths./rest/v1/web-scanners/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners/{id}.patch.responses.409.description
Conflict — a business-rule validation failed (for example oversized lists, `urlLimit` out of range, or a malformed seed URL). Reason is in the response `error` field.

# paths./rest/v1/web-scanners/{id}.delete.description
Delete a web scanner. Associated suppression rules are deleted in the same operation. Requires scope: webScanner:delete

# paths./rest/v1/web-scanners/{id}.delete.responses.200.content.application/json.schema.properties.id.description
The id of the web scanner that was deleted.

# paths./rest/v1/web-scanners/{id}.delete.responses.200.content.application/json.schema.properties.deleted.description
True when the scanner and its rules were deleted.

# paths./rest/v1/web-scanners/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners/{id}/trigger.post.description
Manually kick off a new scan for this web scanner. The request body is empty (or `{}`). A successful response means the request was accepted; because the scan starts asynchronously, the returned entity may still reflect pre-trigger values for fields like `scanStatus` and `lastScanStartedAt`. The trigger is rate-limited: a 409 is returned if another scan is already in flight, or if this production monitor has `urlLimit >= 5000` and its previous scan completed within the last 10 minutes; the reason is in the response `error` field. Requires scope: webScanner:trigger

# paths./rest/v1/web-scanners/{id}/trigger.post.responses.200.description
Web scanner details returned after the trigger request was accepted.

# paths./rest/v1/web-scanners/{id}/trigger.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}/trigger.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners/{id}/trigger.post.responses.409.description
Conflict — another scan is already running, or this production monitor has `urlLimit >= 5000` and its previous scan completed within the last 10 minutes. Reason is in the response `error` field.

# paths./rest/v1/web-scanners/{id}/findings.get.description
List the third-party trackers (requests) found on a scan run, with their risk, category, the pages they were seen on, and whether each host is already covered by a CMP consent service. Defaults to the latest run; pass `date` (an ISO-8601 timestamp; only the calendar day is used to select the run) to read an earlier run. Documented exception to the cursor-pagination standard: paginates with `limit` and `offset` because each run is an immutable snapshot. A host that is neither covered (`coveredByCmp: false`) nor matched by a suppression rule still needs a triage decision — resolve it by adding the host to a CMP consent service or by creating a suppression rule with `POST /rest/v1/web-scanner-rules`. Use `GET /rest/v1/web-scanners/{id}/summary` for the rolled-up counts. Requires scope: webScanner:find

# paths./rest/v1/web-scanners/{id}/findings.get.parameters[].schema.description
Which scan run to read, as an ISO-8601 timestamp. Only the UTC calendar day is used to select the run; the time component is ignored. Defaults to the most recent run when omitted.

# paths./rest/v1/web-scanners/{id}/findings.get.parameters[].schema.description
Maximum number of findings to return. Defaults to 25; clamped to 1–100.

# paths./rest/v1/web-scanners/{id}/findings.get.parameters[].schema.description
Skip this many findings before returning. Use with `limit` for load-more paging.

# paths./rest/v1/web-scanners/{id}/findings.get.responses.200.description
Third-party trackers found on the selected scan run

# paths./rest/v1/web-scanners/{id}/findings.get.responses.200.content.application/json.schema.properties.items.description
Third-party trackers seen on the run. `coveredByCmp` is true when the host is already mapped to a CMP consent service; `risk` is high/medium/low/unknown. Hosts that are neither covered nor matched by a suppression rule are the ones that need a triage decision — clear them by adding the host to a CMP consent service or creating a suppression rule (POST /rest/v1/web-scanner-rules).

# paths./rest/v1/web-scanners/{id}/findings.get.responses.200.content.application/json.schema.properties.hasMore.description
True when more findings are available beyond the current window.

# paths./rest/v1/web-scanners/{id}/findings.get.responses.400.description
Bad request — malformed `date`, or `limit`/`offset` out of range.

# paths./rest/v1/web-scanners/{id}/findings.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}/findings.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners/{id}/cookies.get.description
List the cookies and local-storage entries observed on a scan run. Defaults to the latest run; pass `date` (an ISO-8601 timestamp; only the calendar day is used to select the run) to read an earlier run. Cookies paginate with `limit` and `offset` (a documented exception to the cursor-pagination standard, since each run is an immutable snapshot); local-storage entries are returned in full. Requires scope: webScanner:find

# paths./rest/v1/web-scanners/{id}/cookies.get.parameters[].schema.description
Which scan run to read, as an ISO-8601 timestamp. Only the UTC calendar day is used to select the run; the time component is ignored. Defaults to the most recent run when omitted.

# paths./rest/v1/web-scanners/{id}/cookies.get.parameters[].schema.description
Maximum number of findings to return. Defaults to 25; clamped to 1–100.

# paths./rest/v1/web-scanners/{id}/cookies.get.parameters[].schema.description
Skip this many findings before returning. Use with `limit` for load-more paging.

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.200.description
Cookies and local-storage entries found on the selected scan run

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.200.content.application/json.schema.properties.cookies.description
Cookies observed on the run, paginated by `limit`/`offset`.

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.200.content.application/json.schema.properties.localStorage.description
Local-storage entries observed on the run. Returned in full (not paginated).

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.200.content.application/json.schema.properties.hasMore.description
True when more cookies are available beyond the current window.

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.400.description
Bad request — malformed `date`, or `limit`/`offset` out of range.

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}/cookies.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanners/{id}/summary.get.description
Compliance summary for a scan run — the rolled-up "what does this site look like, and what still needs a decision" view, assembled server-side so you do not have to page every finding. Includes total host/vendor/cookie counts, captured privacy policies and host coverage, a breakdown by risk and by category, coverage (how many hosts are already covered by a CMP consent service or a suppression rule vs. how many still need a decision), the new/removed host delta versus the previous run, and up to 10 highest-risk hosts that still need a decision. A null privacyPolicyUrl means that no policy was captured for the hostname. Defaults to the latest run; pass `date` (an ISO-8601 timestamp; only the calendar day is used to select the run) to read an earlier run. Clear a host that needs a decision by adding it to a CMP consent service or creating a suppression rule with `POST /rest/v1/web-scanner-rules`. When the scanner has no completed runs, every count is 0 and `runDate` is null. Requires scope: webScanner:find

# paths./rest/v1/web-scanners/{id}/summary.get.parameters[].schema.description
Which scan run to read, as an ISO-8601 timestamp. Only the UTC calendar day is used to select the run; the time component is ignored. Defaults to the most recent run when omitted.

# paths./rest/v1/web-scanners/{id}/summary.get.responses.200.description
Rolled-up compliance summary for the selected scan run

# paths./rest/v1/web-scanners/{id}/summary.get.responses.200.content.application/json.schema.properties.privacyPolicies.description
Distinct privacy policies captured for first-party hostnames in the selected scan run, including the bounded visible policy text.

# paths./rest/v1/web-scanners/{id}/summary.get.responses.200.content.application/json.schema.properties.privacyPolicyHosts.description
Every successfully crawled first-party hostname and its captured privacy policy URL. A null privacyPolicyUrl means no policy was captured for that hostname.

# paths./rest/v1/web-scanners/{id}/summary.get.responses.200.content.application/json.schema.properties.topUncoveredHosts.description
Up to 10 hosts that still need a decision (neither CMP-covered nor suppressed), highest risk first. Clear each by adding the host to a CMP consent service or creating a suppression rule (POST /rest/v1/web-scanner-rules) with the reason that explains why it is allowed (baa, internal, approved, compliant, firstParty, ignore).

# paths./rest/v1/web-scanners/{id}/summary.get.responses.200.content.application/json.schema.properties.accessibility.description
Automated accessibility (WCAG 2.1/2.2 A + AA) rollup for the run: `score` is a 0-100 site score (mean of per-page scores; higher is better), with distinct rule-violation `countsByImpact` and the most frequently violated rules in `topViolations` (each with the number of pages it appears on). Covers only the machine-detectable subset of WCAG (~30-40%) — a high score is not a certification of full conformance; manual audit is still required. Null when the run audited no pages.

# paths./rest/v1/web-scanners/{id}/summary.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanners/{id}/summary.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanner-rules.get.description
List suppression rules for a single web scanner. Requires the `scannerId` query parameter — rules are always scoped to a parent scanner. Not paginated; the per-scanner rule count is bounded. Requires scope: webScanner:find

# paths./rest/v1/web-scanner-rules.get.parameters[].schema.description
The web scanner whose suppression rules should be returned.

# paths./rest/v1/web-scanner-rules.get.responses.200.description
List of suppression rules for the requested scanner

# paths./rest/v1/web-scanner-rules.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanner-rules.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanner-rules.post.description
Create a suppression rule on a web scanner. Auth is enforced against the parent scanner via `webScanner:update`. At least one of `cookiePatterns`, `domainPatterns`, or `scriptPatterns` should be set for the rule to match anything; omitted pattern arrays default to `[]`. Requires scope: webScanner:update

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.name.description
User-friendly name for the suppression rule.

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.priority.description
Rule priority (1–10,000). Lower numbers are evaluated first when multiple rules match.

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.reason.description
Why this rule was added. Surfaced in audit views. Send `null` to clear an existing reason on patch.

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.notes.description
Free-form notes about why this rule exists or what it covers. Trimmed server-side; empty strings become `null`.

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.cookiePatterns.description
Glob patterns matched against cookie names (e.g. `_ga*`). Max 100 entries. When sent on PATCH, replaces the existing list wholesale.

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.domainPatterns.description
Glob patterns matched against cookie domain / script hostname (e.g. `*.google-analytics.com`). Max 100 entries. When sent on PATCH, replaces the existing list wholesale.

# paths./rest/v1/web-scanner-rules.post.requestBody.content.application/json.schema.properties.scriptPatterns.description
Glob patterns matched against full script URLs (e.g. `https://www.googletagmanager.com/gtm.js?id=*`). Max 100 entries. When sent on PATCH, replaces the existing list wholesale.

# paths./rest/v1/web-scanner-rules.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanner-rules.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanner-rules/{id}.get.description
Find a single web scanner rule by ID. Requires scope: webScanner:find

# paths./rest/v1/web-scanner-rules/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanner-rules/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanner-rules/{id}.patch.description
Partially update a suppression rule. Only the fields you send are changed. List-valued fields (`cookiePatterns`, `domainPatterns`, `scriptPatterns`) are replaced wholesale when sent. Requires scope: webScanner:update

# paths./rest/v1/web-scanner-rules/{id}.patch.requestBody.content.application/json.schema.properties.reason.description
Why this rule was added. Surfaced in audit views. Send `null` to clear an existing reason on patch.

# paths./rest/v1/web-scanner-rules/{id}.patch.requestBody.content.application/json.schema.properties.notes.description
Free-form notes about why this rule exists or what it covers. Trimmed server-side; empty strings become `null`.

# paths./rest/v1/web-scanner-rules/{id}.patch.requestBody.content.application/json.schema.properties.cookiePatterns.description
Glob patterns matched against cookie names (e.g. `_ga*`). Max 100 entries. When sent on PATCH, replaces the existing list wholesale.

# paths./rest/v1/web-scanner-rules/{id}.patch.requestBody.content.application/json.schema.properties.domainPatterns.description
Glob patterns matched against cookie domain / script hostname (e.g. `*.google-analytics.com`). Max 100 entries. When sent on PATCH, replaces the existing list wholesale.

# paths./rest/v1/web-scanner-rules/{id}.patch.requestBody.content.application/json.schema.properties.scriptPatterns.description
Glob patterns matched against full script URLs (e.g. `https://www.googletagmanager.com/gtm.js?id=*`). Max 100 entries. When sent on PATCH, replaces the existing list wholesale.

# paths./rest/v1/web-scanner-rules/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanner-rules/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-scanner-rules/{id}.delete.description
Delete a web scanner rule. Requires scope: webScanner:update

# paths./rest/v1/web-scanner-rules/{id}.delete.responses.200.content.application/json.schema.properties.id.description
The id of the suppression rule that was deleted.

# paths./rest/v1/web-scanner-rules/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-scanner-rules/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/heatmap-pages.get.description
List pages with heatmap coverage in a date window, ranked for triage. Each entity is identified by `pageKey`, normally origin + pathname with the query string stripped; an account-configured split may include one significant query parameter. Preserve the returned `pageKey` when calling `GET /rest/v1/heatmap-pages/summary`. Supports cursor pagination, with cursor depth capped at roughly 10,000 entries; if you need pages beyond that, narrow `from`/`to` or add filters rather than paginating further. `from`/`to` are UTC calendar days in `YYYY-MM-DD`; the window must be 60 days or fewer. Requires scope: web-analytics:view

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Inclusive lower bound of the heatmap window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Inclusive upper bound of the heatmap window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Filter by visitor country (ISO country name or code as stored on events).

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Filter by visitor region (state/province as stored on events).

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Filter by browser name as captured on events.

# paths./rest/v1/heatmap-pages.get.parameters[].schema.description
Sort key. Defaults to `CLICKS` (descending).

# paths./rest/v1/heatmap-pages.get.responses.200.content.application/json.schema.properties.entities.items.properties.pageKey.description
Stable per-page identifier. It is normally origin + pathname with the query string stripped, but an account-configured split may include one significant query parameter. Preserve the returned value when calling `GET /rest/v1/heatmap-pages/summary` and the heatmap MCP tools.

# paths./rest/v1/heatmap-pages.get.responses.200.content.application/json.schema.properties.entities.description
Pages with heatmap coverage in the requested window, ranked by the requested sort key (default: total clicks, descending). Use `pageKey` to drill into `GET /rest/v1/heatmap-pages/summary`.

# paths./rest/v1/heatmap-pages.get.responses.400.description
Bad request — malformed `from`/`to`, window longer than 60 days, or cursor depth exceeded.

# paths./rest/v1/heatmap-pages.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/heatmap-pages.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/heatmap-pages/summary.get.description
Bundled per-page heatmap rollup: click bins, dead clicks, rage clicks, scroll depth, and up to 5 curated in-app replay URLs in a single payload. Designed as a one-call diagnosis surface for an AI assistant or marketer — answers "what is happening on this page?" without fanning out across five endpoints. `pageKey` comes from `GET /rest/v1/heatmap-pages`. The endpoint is identified by query params rather than a path id because heatmap pages are not stored entities; this is a documented derived-read exception. `breakpoint` scopes the bin/scroll aggregations; replays are returned across all breakpoints regardless of `breakpoint` (weighted to cover multiple viewports) so callers can compare devices. Requires scope: web-analytics:view

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Page identifier returned by `GET /rest/v1/heatmap-pages`. It is normally origin + pathname with the query string stripped, but may include one account-configured significant query parameter. Pass the returned value unchanged.

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Viewport bucket the click, dead-click, rage, and scroll-depth aggregations are computed for. Replays are returned for all breakpoints regardless of this value so callers can compare across devices.

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Inclusive lower bound of the heatmap window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Inclusive upper bound of the heatmap window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Filter by visitor country (ISO country name or code as stored on events).

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Filter by visitor region (state/province as stored on events).

# paths./rest/v1/heatmap-pages/summary.get.parameters[].schema.description
Filter by browser name as captured on events.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.clickBins.description
Aggregated click positions for the requested breakpoint, bucketed into a 64×64 grid normalized to the page viewport.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.deadClicks.description
Click positions where no interactive element was hit. `topElement` is the most-frequently-clicked non-interactive ancestor tag at that bucket, if attributable.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.rageClicks.description
Click positions where repeated clicks were detected within a short window.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.scrollDepth.description
Distribution of how far visitors scrolled, bucketed in percent of page height. `sessions` is the count of distinct sessions that reached at least that bucket.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.replays.items.properties.breakpoint.description
Viewport bucket the session was recorded under.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.replays.items.properties.url.description
Absolute link to view the session replay in the OursPrivacy web app. Opens the replayer pre-scoped to this session, visitor, and date.

# paths./rest/v1/heatmap-pages/summary.get.responses.200.content.application/json.schema.properties.replays.description
Up to 5 curated replay links for this page, ranked by engagement and weighted to cover multiple viewport breakpoints when possible. Each entry is an absolute URL into the OursPrivacy web app — open it to view the recorded session.

# paths./rest/v1/heatmap-pages/summary.get.responses.400.description
Bad request — malformed `from`/`to`, missing `pageKey`/`breakpoint`, or window longer than 60 days.

# paths./rest/v1/heatmap-pages/summary.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/heatmap-pages/summary.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-managers.get.description
List every tag manager on this account. Each tag manager is a pixel-scoped container of tags, triggers, variables, and folders. Not paginated — accounts are capped at a small number of tag managers in practice, so the response fits in a single page. Requires scope: tagManagers:list

# paths./rest/v1/tag-managers.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Server-assigned UUID for this tag manager container.

# paths./rest/v1/tag-managers.get.responses.200.content.application/json.schema.properties.entities.items.properties.name.description
Human-readable name for the tag manager.

# paths./rest/v1/tag-managers.get.responses.200.content.application/json.schema.properties.entities.items.properties.pixel.description
Server-assigned pixel/container token. Used in the tag-manager install snippet served on customer sites — do not regenerate via the API.

# paths./rest/v1/tag-managers.get.responses.200.content.application/json.schema.properties.entities.items.properties.dataLayerName.description
Window-global name of the customer data layer that triggers and variables read from (e.g. `dataLayer`). Defaults to `null`, which means the SDK falls back to its built-in name.

# paths./rest/v1/tag-managers.get.responses.200.content.application/json.schema.properties.entities.items.properties.createdAt.description
ISO 8601 timestamp when the tag manager was created.

# paths./rest/v1/tag-managers.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-managers.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-managers.post.description
Create a new tag manager. The server seeds three default triggers (`Initialization`, `PageView`, `DomReady`) and one `OursInitTag` so the container is immediately usable — call `GET /tag-manager-triggers?tagManagerId={id}` right after create to grab their server-assigned ids so you can reuse them in `fireTriggerIds` instead of redundantly creating a second `PageView`/`DomReady`/`Initialization`. Returns the bare entity. Requires scope: tagManagers:create

# paths./rest/v1/tag-managers.post.requestBody.content.application/json.schema.properties.name.description
Human-readable name for the new tag manager.

# paths./rest/v1/tag-managers.post.requestBody.content.application/json.schema.properties.dataLayerName.description
Optional global data-layer name (e.g. `dataLayer`). Omit to use the SDK default.

# paths./rest/v1/tag-managers.post.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this tag manager container.

# paths./rest/v1/tag-managers.post.responses.200.content.application/json.schema.properties.name.description
Human-readable name for the tag manager.

# paths./rest/v1/tag-managers.post.responses.200.content.application/json.schema.properties.pixel.description
Server-assigned pixel/container token. Used in the tag-manager install snippet served on customer sites — do not regenerate via the API.

# paths./rest/v1/tag-managers.post.responses.200.content.application/json.schema.properties.dataLayerName.description
Window-global name of the customer data layer that triggers and variables read from (e.g. `dataLayer`). Defaults to `null`, which means the SDK falls back to its built-in name.

# paths./rest/v1/tag-managers.post.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the tag manager was created.

# paths./rest/v1/tag-managers.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-managers.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-managers/{id}.get.description
Fetch a single tag manager by id, including its server-assigned `pixel` token used by the install snippet. Requires scope: tagManagers:find

# paths./rest/v1/tag-managers/{id}.get.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this tag manager container.

# paths./rest/v1/tag-managers/{id}.get.responses.200.content.application/json.schema.properties.name.description
Human-readable name for the tag manager.

# paths./rest/v1/tag-managers/{id}.get.responses.200.content.application/json.schema.properties.pixel.description
Server-assigned pixel/container token. Used in the tag-manager install snippet served on customer sites — do not regenerate via the API.

# paths./rest/v1/tag-managers/{id}.get.responses.200.content.application/json.schema.properties.dataLayerName.description
Window-global name of the customer data layer that triggers and variables read from (e.g. `dataLayer`). Defaults to `null`, which means the SDK falls back to its built-in name.

# paths./rest/v1/tag-managers/{id}.get.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the tag manager was created.

# paths./rest/v1/tag-managers/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-managers/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-managers/{id}.patch.description
Partially update a tag manager. Only the fields you send are changed; omitted fields keep their current value. Send `dataLayerName: null` to clear the override and fall back to the SDK default. Requires scope: tagManagers:update

# paths./rest/v1/tag-managers/{id}.patch.requestBody.content.application/json.schema.properties.dataLayerName.description
New data-layer name. Send `null` to clear and fall back to the SDK default.

# paths./rest/v1/tag-managers/{id}.patch.responses.200.content.application/json.schema.properties.id.description
Server-assigned UUID for this tag manager container.

# paths./rest/v1/tag-managers/{id}.patch.responses.200.content.application/json.schema.properties.name.description
Human-readable name for the tag manager.

# paths./rest/v1/tag-managers/{id}.patch.responses.200.content.application/json.schema.properties.pixel.description
Server-assigned pixel/container token. Used in the tag-manager install snippet served on customer sites — do not regenerate via the API.

# paths./rest/v1/tag-managers/{id}.patch.responses.200.content.application/json.schema.properties.dataLayerName.description
Window-global name of the customer data layer that triggers and variables read from (e.g. `dataLayer`). Defaults to `null`, which means the SDK falls back to its built-in name.

# paths./rest/v1/tag-managers/{id}.patch.responses.200.content.application/json.schema.properties.createdAt.description
ISO 8601 timestamp when the tag manager was created.

# paths./rest/v1/tag-managers/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-managers/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-managers/{id}.delete.description
Delete a tag manager. Child tags, triggers, variables, and folders are cascade-deleted with the container. Requires scope: tagManagers:delete

# paths./rest/v1/tag-managers/{id}.delete.responses.200.content.application/json.schema.properties.id.description
The id of the tag manager that was deleted.

# paths./rest/v1/tag-managers/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-managers/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-tags.get.description
List tags inside a single tag manager. Requires the `tagManagerId` query parameter — tags are always scoped to one parent container. Supports cursor pagination via `limit` and `cursor`; the limit clamp is 1000 so a single request can return the full set (the web-app workspace renders all tags in one shot). Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-tags.get.parameters[].schema.description
Maximum number of tags to return. Defaults to 25; values below 1 are clamped to 1 and values above 1000 are clamped to 1000. The web-app passes 1000 to render the full workspace in one request.

# paths./rest/v1/tag-manager-tags.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/tag-manager-tags.get.parameters[].schema.description
Parent tag manager whose tags should be returned.

# paths./rest/v1/tag-manager-tags.get.responses.200.content.application/json.schema.properties.entities.items.properties.type.description
Tag type discriminator. Examples that exist today: `OursTrackTag`, `OursInitTag`, `OursIdentifyTag`, `CustomHtmlTag`. Pick from `GET /tag-manager-tags/types` for the canonical set — names like `GA4Event` are not valid ids.

# paths./rest/v1/tag-manager-tags.get.responses.200.content.application/json.schema.properties.entities.items.properties.parameters.description
Type-specific JSON configuration. Shape depends on `type` — inspect a known-good tag of the same type for the field set. Empty object is valid for placeholder tags.

# paths./rest/v1/tag-manager-tags.get.responses.200.content.application/json.schema.properties.entities.items.properties.fireTriggerIds.description
Triggers that fire this tag. Tag does nothing if this list is empty.

# paths./rest/v1/tag-manager-tags.get.responses.200.content.application/json.schema.properties.entities.items.properties.blockTriggerIds.description
Triggers that suppress this tag when they match — evaluated after fire triggers.

# paths./rest/v1/tag-manager-tags.get.responses.200.content.application/json.schema.properties.entities.items.properties.priority.description
Lower numbers fire first. Defaults to 0.

# paths./rest/v1/tag-manager-tags.get.responses.200.content.application/json.schema.properties.entities.items.properties.folderId.description
Folder this tag belongs to in the dashboard. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-tags.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-tags.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-tags.post.description
Create a new tag inside a tag manager. `tagManagerId` is required in the body. Newly created tags are not assigned to any folder — assign them with `POST /rest/v1/tag-manager-asset-folders`. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-tags.post.requestBody.content.application/json.schema.properties.tagManagerId.description
Parent tag manager that will own the new tag.

# paths./rest/v1/tag-manager-tags.post.requestBody.content.application/json.schema.properties.type.description
Tag type discriminator. Pick from `GET /tag-manager-tags/types` for the canonical set (e.g. `OursTrackTag`, `OursInitTag`, `CustomHtmlTag`). Names like `GA4Event` are not valid ids.

# paths./rest/v1/tag-manager-tags.post.requestBody.content.application/json.schema.properties.parameters.description
Type-specific JSON configuration. Send `{}` for a placeholder.

# paths./rest/v1/tag-manager-tags.post.requestBody.content.application/json.schema.properties.fireTriggerIds.description
Trigger ids that cause this tag to fire. Use `[]` only for placeholder tags.

# paths./rest/v1/tag-manager-tags.post.requestBody.content.application/json.schema.properties.blockTriggerIds.description
Optional trigger ids that block this tag when they match.

# paths./rest/v1/tag-manager-tags.post.responses.200.content.application/json.schema.properties.type.description
Tag type discriminator. Examples that exist today: `OursTrackTag`, `OursInitTag`, `OursIdentifyTag`, `CustomHtmlTag`. Pick from `GET /tag-manager-tags/types` for the canonical set — names like `GA4Event` are not valid ids.

# paths./rest/v1/tag-manager-tags.post.responses.200.content.application/json.schema.properties.parameters.description
Type-specific JSON configuration. Shape depends on `type` — inspect a known-good tag of the same type for the field set. Empty object is valid for placeholder tags.

# paths./rest/v1/tag-manager-tags.post.responses.200.content.application/json.schema.properties.fireTriggerIds.description
Triggers that fire this tag. Tag does nothing if this list is empty.

# paths./rest/v1/tag-manager-tags.post.responses.200.content.application/json.schema.properties.blockTriggerIds.description
Triggers that suppress this tag when they match — evaluated after fire triggers.

# paths./rest/v1/tag-manager-tags.post.responses.200.content.application/json.schema.properties.priority.description
Lower numbers fire first. Defaults to 0.

# paths./rest/v1/tag-manager-tags.post.responses.200.content.application/json.schema.properties.folderId.description
Folder this tag belongs to in the dashboard. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-tags.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-tags.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-tags/{id}.get.description
Fetch a single tag by id, including its `folderId` (read-only on this endpoint). Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-tags/{id}.get.responses.200.content.application/json.schema.properties.type.description
Tag type discriminator. Examples that exist today: `OursTrackTag`, `OursInitTag`, `OursIdentifyTag`, `CustomHtmlTag`. Pick from `GET /tag-manager-tags/types` for the canonical set — names like `GA4Event` are not valid ids.

# paths./rest/v1/tag-manager-tags/{id}.get.responses.200.content.application/json.schema.properties.parameters.description
Type-specific JSON configuration. Shape depends on `type` — inspect a known-good tag of the same type for the field set. Empty object is valid for placeholder tags.

# paths./rest/v1/tag-manager-tags/{id}.get.responses.200.content.application/json.schema.properties.fireTriggerIds.description
Triggers that fire this tag. Tag does nothing if this list is empty.

# paths./rest/v1/tag-manager-tags/{id}.get.responses.200.content.application/json.schema.properties.blockTriggerIds.description
Triggers that suppress this tag when they match — evaluated after fire triggers.

# paths./rest/v1/tag-manager-tags/{id}.get.responses.200.content.application/json.schema.properties.priority.description
Lower numbers fire first. Defaults to 0.

# paths./rest/v1/tag-manager-tags/{id}.get.responses.200.content.application/json.schema.properties.folderId.description
Folder this tag belongs to in the dashboard. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-tags/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-tags/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-tags/{id}.patch.description
Partially update a tag. Only the fields you send are changed. Tags cannot be moved between tag managers. To assign a tag to a folder, use `POST /rest/v1/tag-manager-asset-folders`. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-tags/{id}.patch.requestBody.content.application/json.schema.properties.type.description
Updated tag type. Pick from `GET /tag-manager-tags/types`.

# paths./rest/v1/tag-manager-tags/{id}.patch.requestBody.content.application/json.schema.properties.fireTriggerIds.description
Replaces the fire trigger list wholesale.

# paths./rest/v1/tag-manager-tags/{id}.patch.requestBody.content.application/json.schema.properties.blockTriggerIds.description
Replaces the block trigger list wholesale. Send `null` to clear.

# paths./rest/v1/tag-manager-tags/{id}.patch.requestBody.content.application/json.schema.properties.enabled.description
Pause/resume the tag without changing other fields.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.200.content.application/json.schema.properties.type.description
Tag type discriminator. Examples that exist today: `OursTrackTag`, `OursInitTag`, `OursIdentifyTag`, `CustomHtmlTag`. Pick from `GET /tag-manager-tags/types` for the canonical set — names like `GA4Event` are not valid ids.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.200.content.application/json.schema.properties.parameters.description
Type-specific JSON configuration. Shape depends on `type` — inspect a known-good tag of the same type for the field set. Empty object is valid for placeholder tags.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.200.content.application/json.schema.properties.fireTriggerIds.description
Triggers that fire this tag. Tag does nothing if this list is empty.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.200.content.application/json.schema.properties.blockTriggerIds.description
Triggers that suppress this tag when they match — evaluated after fire triggers.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.200.content.application/json.schema.properties.priority.description
Lower numbers fire first. Defaults to 0.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.200.content.application/json.schema.properties.folderId.description
Folder this tag belongs to in the dashboard. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-tags/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-tags/{id}.delete.description
Delete a tag manager tag. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-tags/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-tags/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-tags/types.get.description
Lists every tag template the platform supports — what `type` discriminator to send on create/patch, and the shape of the type-specific `parameters` payload (fields, validators, required flags, available values for selects). Account-agnostic: the response is the same for every API key. The same registry powers server-side validation on `POST` / `PATCH` so what this endpoint advertises matches what the server enforces. Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Type discriminator — pass this as `type` on create/patch.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.id.description
Parameter key that goes in the `parameters` payload at create/patch.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.type.description
Underlying data type of the parameter value.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.required.description
When `true`, omitting or sending an empty value for this parameter on create/patch returns HTTP 400.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.default.description
Default value when the caller omits the parameter on create.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.availableValues.description
When present, the field accepts only one of these values. Send the `value` string in `parameters`; the `label` is for display.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.allowedKeys.description
For TABLE-typed fields, the predefined keys each row may contain.

# paths./rest/v1/tag-manager-tags/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.validators.description
Server-enforced rules applied to this field at create and patch.

# paths./rest/v1/tag-manager-tags/types.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-tags/types.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-triggers.get.description
List triggers inside a single tag manager. Requires the `tagManagerId` query parameter — triggers are always scoped to one parent container. Supports cursor pagination via `limit` and `cursor`; the limit clamp is 1000 so a single request can return the full set (the web-app workspace renders all triggers in one shot). Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-triggers.get.parameters[].schema.description
Maximum number of triggers to return. Defaults to 25; values below 1 are clamped to 1 and values above 1000 are clamped to 1000. The web-app passes 1000 to render the full workspace in one request.

# paths./rest/v1/tag-manager-triggers.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/tag-manager-triggers.get.parameters[].schema.description
Parent tag manager whose triggers should be returned.

# paths./rest/v1/tag-manager-triggers.get.responses.200.content.application/json.schema.properties.entities.items.properties.type.description
Trigger type discriminator. Examples that exist today: `PageView`, `DomReady`, `Initialization`, `AllElementsClick`, `AllLinksClick`, `FormSubmit`, `CustomEvent`, `ScrollReach`, `Timer`. Pick from `GET /tag-manager-triggers/types` for the canonical set. Note there is no plain `Click` id; use one of the `All*Click` variants.

# paths./rest/v1/tag-manager-triggers.get.responses.200.content.application/json.schema.properties.entities.items.properties.parameters.description
Type-specific configuration. Send `{}` for a no-op trigger.

# paths./rest/v1/tag-manager-triggers.get.responses.200.content.application/json.schema.properties.entities.items.properties.conditions.description
Conditions that must hold for the trigger to match. Use `[]` for unconditional triggers.

# paths./rest/v1/tag-manager-triggers.get.responses.200.content.application/json.schema.properties.entities.items.properties.folderId.description
Folder this trigger belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-triggers.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-triggers.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-triggers.post.description
Create a new trigger inside a tag manager. `tagManagerId` is required in the body. Send `conditions: []` for an unconditional trigger; otherwise supply type-specific condition objects. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-triggers.post.requestBody.content.application/json.schema.properties.tagManagerId.description
Parent tag manager that will own the new trigger.

# paths./rest/v1/tag-manager-triggers.post.requestBody.content.application/json.schema.properties.type.description
Trigger type discriminator. Pick from `GET /tag-manager-triggers/types` for the canonical set (e.g. `PageView`, `CustomEvent`, `AllElementsClick`).

# paths./rest/v1/tag-manager-triggers.post.requestBody.content.application/json.schema.properties.conditions.description
Match conditions; use `[]` for an unconditional trigger.

# paths./rest/v1/tag-manager-triggers.post.responses.200.content.application/json.schema.properties.type.description
Trigger type discriminator. Examples that exist today: `PageView`, `DomReady`, `Initialization`, `AllElementsClick`, `AllLinksClick`, `FormSubmit`, `CustomEvent`, `ScrollReach`, `Timer`. Pick from `GET /tag-manager-triggers/types` for the canonical set. Note there is no plain `Click` id; use one of the `All*Click` variants.

# paths./rest/v1/tag-manager-triggers.post.responses.200.content.application/json.schema.properties.parameters.description
Type-specific configuration. Send `{}` for a no-op trigger.

# paths./rest/v1/tag-manager-triggers.post.responses.200.content.application/json.schema.properties.conditions.description
Conditions that must hold for the trigger to match. Use `[]` for unconditional triggers.

# paths./rest/v1/tag-manager-triggers.post.responses.200.content.application/json.schema.properties.folderId.description
Folder this trigger belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-triggers.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-triggers.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-triggers/{id}.get.description
Find a single tag manager trigger by ID. Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-triggers/{id}.get.responses.200.content.application/json.schema.properties.type.description
Trigger type discriminator. Examples that exist today: `PageView`, `DomReady`, `Initialization`, `AllElementsClick`, `AllLinksClick`, `FormSubmit`, `CustomEvent`, `ScrollReach`, `Timer`. Pick from `GET /tag-manager-triggers/types` for the canonical set. Note there is no plain `Click` id; use one of the `All*Click` variants.

# paths./rest/v1/tag-manager-triggers/{id}.get.responses.200.content.application/json.schema.properties.parameters.description
Type-specific configuration. Send `{}` for a no-op trigger.

# paths./rest/v1/tag-manager-triggers/{id}.get.responses.200.content.application/json.schema.properties.conditions.description
Conditions that must hold for the trigger to match. Use `[]` for unconditional triggers.

# paths./rest/v1/tag-manager-triggers/{id}.get.responses.200.content.application/json.schema.properties.folderId.description
Folder this trigger belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-triggers/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-triggers/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-triggers/{id}.patch.description
Partially update a trigger. Only the fields you send are changed. `conditions` is replaced wholesale when sent. To assign a trigger to a folder, use `POST /rest/v1/tag-manager-asset-folders`. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-triggers/{id}.patch.requestBody.content.application/json.schema.properties.type.description
Updated trigger type. Pick from `GET /tag-manager-triggers/types`.

# paths./rest/v1/tag-manager-triggers/{id}.patch.requestBody.content.application/json.schema.properties.conditions.description
Replaces conditions wholesale when sent. Use `[]` for an unconditional trigger.

# paths./rest/v1/tag-manager-triggers/{id}.patch.requestBody.content.application/json.schema.properties.enabled.description
Pause/resume the trigger without changing other fields.

# paths./rest/v1/tag-manager-triggers/{id}.patch.responses.200.content.application/json.schema.properties.type.description
Trigger type discriminator. Examples that exist today: `PageView`, `DomReady`, `Initialization`, `AllElementsClick`, `AllLinksClick`, `FormSubmit`, `CustomEvent`, `ScrollReach`, `Timer`. Pick from `GET /tag-manager-triggers/types` for the canonical set. Note there is no plain `Click` id; use one of the `All*Click` variants.

# paths./rest/v1/tag-manager-triggers/{id}.patch.responses.200.content.application/json.schema.properties.parameters.description
Type-specific configuration. Send `{}` for a no-op trigger.

# paths./rest/v1/tag-manager-triggers/{id}.patch.responses.200.content.application/json.schema.properties.conditions.description
Conditions that must hold for the trigger to match. Use `[]` for unconditional triggers.

# paths./rest/v1/tag-manager-triggers/{id}.patch.responses.200.content.application/json.schema.properties.folderId.description
Folder this trigger belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-triggers/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-triggers/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-triggers/{id}.delete.description
Delete a tag manager trigger. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-triggers/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-triggers/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-triggers/types.get.description
Lists every trigger template the platform supports — what `type` discriminator to send on create/patch, and the shape of the type-specific `parameters` payload. Trigger `conditions` are evaluated at runtime (per-trigger, see the resource docs) and are not part of this descriptor. Account-agnostic: the response is the same for every API key. Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Type discriminator — pass this as `type` on create/patch.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.id.description
Parameter key that goes in the `parameters` payload at create/patch.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.type.description
Underlying data type of the parameter value.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.required.description
When `true`, omitting or sending an empty value for this parameter on create/patch returns HTTP 400.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.default.description
Default value when the caller omits the parameter on create.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.availableValues.description
When present, the field accepts only one of these values. Send the `value` string in `parameters`; the `label` is for display.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.allowedKeys.description
For TABLE-typed fields, the predefined keys each row may contain.

# paths./rest/v1/tag-manager-triggers/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.validators.description
Server-enforced rules applied to this field at create and patch.

# paths./rest/v1/tag-manager-triggers/types.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-triggers/types.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-variables.get.description
List variables inside a single tag manager. Requires the `tagManagerId` query parameter — variables are always scoped to one parent container. Supports cursor pagination via `limit` and `cursor`; the limit clamp is 1000 so a single request can return the full set (the web-app workspace renders all variables in one shot). Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-variables.get.parameters[].schema.description
Maximum number of variables to return. Defaults to 25; values below 1 are clamped to 1 and values above 1000 are clamped to 1000. The web-app passes 1000 to render the full workspace in one request.

# paths./rest/v1/tag-manager-variables.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/tag-manager-variables.get.parameters[].schema.description
Parent tag manager whose variables should be returned.

# paths./rest/v1/tag-manager-variables.get.responses.200.description
Variables scoped to a parent tag manager

# paths./rest/v1/tag-manager-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.type.description
Variable type discriminator. Examples that exist today: `DataLayer`, `Constant`, `Cookie`, `Url`, `UrlParameter`, `Weekday`, `RandomNumber`. Pick from `GET /tag-manager-variables/types` for the canonical set.

# paths./rest/v1/tag-manager-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.defaultValue.description
Default value returned when no rule matches. JSON value — type depends on `type`.

# paths./rest/v1/tag-manager-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.lookUpTable.description
Optional lookup table for `LookUpTable`-style variables. JSON value.

# paths./rest/v1/tag-manager-variables.get.responses.200.content.application/json.schema.properties.entities.items.properties.folderId.description
Folder this variable belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-variables.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-variables.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-variables.post.description
Create a new variable inside a tag manager. `tagManagerId` is required in the body. Known input failures (e.g. duplicate variable name within the tag manager) are returned as HTTP 409 with the reason in the response `error` field. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-variables.post.requestBody.content.application/json.schema.properties.tagManagerId.description
Parent tag manager that will own the new variable.

# paths./rest/v1/tag-manager-variables.post.requestBody.content.application/json.schema.properties.type.description
Variable type discriminator. Pick from `GET /tag-manager-variables/types` for the canonical set (e.g. `DataLayer`, `Constant`, `Cookie`, `Url`).

# paths./rest/v1/tag-manager-variables.post.requestBody.content.application/json.schema.properties.defaultValue.description
Optional default value. JSON value of any type.

# paths./rest/v1/tag-manager-variables.post.requestBody.content.application/json.schema.properties.lookUpTable.description
Optional lookup table for `LookUpTable` variables.

# paths./rest/v1/tag-manager-variables.post.responses.200.content.application/json.schema.properties.type.description
Variable type discriminator. Examples that exist today: `DataLayer`, `Constant`, `Cookie`, `Url`, `UrlParameter`, `Weekday`, `RandomNumber`. Pick from `GET /tag-manager-variables/types` for the canonical set.

# paths./rest/v1/tag-manager-variables.post.responses.200.content.application/json.schema.properties.defaultValue.description
Default value returned when no rule matches. JSON value — type depends on `type`.

# paths./rest/v1/tag-manager-variables.post.responses.200.content.application/json.schema.properties.lookUpTable.description
Optional lookup table for `LookUpTable`-style variables. JSON value.

# paths./rest/v1/tag-manager-variables.post.responses.200.content.application/json.schema.properties.folderId.description
Folder this variable belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-variables.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-variables.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-variables.post.responses.409.description
Conflict — variable name collides with another variable in the same tag manager, or another business-rule validation failed. Reason is in the response `error` field.

# paths./rest/v1/tag-manager-variables/{id}.get.description
Find a single tag manager variable by ID. Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-variables/{id}.get.responses.200.content.application/json.schema.properties.type.description
Variable type discriminator. Examples that exist today: `DataLayer`, `Constant`, `Cookie`, `Url`, `UrlParameter`, `Weekday`, `RandomNumber`. Pick from `GET /tag-manager-variables/types` for the canonical set.

# paths./rest/v1/tag-manager-variables/{id}.get.responses.200.content.application/json.schema.properties.defaultValue.description
Default value returned when no rule matches. JSON value — type depends on `type`.

# paths./rest/v1/tag-manager-variables/{id}.get.responses.200.content.application/json.schema.properties.lookUpTable.description
Optional lookup table for `LookUpTable`-style variables. JSON value.

# paths./rest/v1/tag-manager-variables/{id}.get.responses.200.content.application/json.schema.properties.folderId.description
Folder this variable belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-variables/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-variables/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-variables/{id}.patch.description
Partially update a variable. Only the fields you send are changed. Name collisions with other variables in the same tag manager return 409 with the reason in the response `error` field. To assign a variable to a folder, use `POST /rest/v1/tag-manager-asset-folders`. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-variables/{id}.patch.requestBody.content.application/json.schema.properties.type.description
Updated variable type. Pick from `GET /tag-manager-variables/types`.

# paths./rest/v1/tag-manager-variables/{id}.patch.requestBody.content.application/json.schema.properties.defaultValue.description
Updated default value. JSON value of any type.

# paths./rest/v1/tag-manager-variables/{id}.patch.requestBody.content.application/json.schema.properties.enabled.description
Pause/resume the variable without changing other fields.

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.200.content.application/json.schema.properties.type.description
Variable type discriminator. Examples that exist today: `DataLayer`, `Constant`, `Cookie`, `Url`, `UrlParameter`, `Weekday`, `RandomNumber`. Pick from `GET /tag-manager-variables/types` for the canonical set.

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.200.content.application/json.schema.properties.defaultValue.description
Default value returned when no rule matches. JSON value — type depends on `type`.

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.200.content.application/json.schema.properties.lookUpTable.description
Optional lookup table for `LookUpTable`-style variables. JSON value.

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.200.content.application/json.schema.properties.folderId.description
Folder this variable belongs to. Settable via PATCH — send a folder UUID to assign, or `null` to remove from its current folder.

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-variables/{id}.patch.responses.409.description
Conflict — name collision or other business-rule validation failure. Reason is in the response `error` field.

# paths./rest/v1/tag-manager-variables/{id}.delete.description
Delete a tag manager variable. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-variables/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-variables/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-variables/types.get.description
Lists every variable template the platform supports — what `type` discriminator to send on create/patch, the shape of the type-specific `parameters` payload, and `supportsVariables` (whether the variable's own parameter fields may reference `{{OtherVariable}}` at runtime). Account-agnostic: the response is the same for every API key. Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.id.description
Type discriminator — pass this as `type` on create/patch.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.id.description
Parameter key that goes in the `parameters` payload at create/patch.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.type.description
Underlying data type of the parameter value.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.required.description
When `true`, omitting or sending an empty value for this parameter on create/patch returns HTTP 400.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.default.description
Default value when the caller omits the parameter on create.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.availableValues.description
When present, the field accepts only one of these values. Send the `value` string in `parameters`; the `label` is for display.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.allowedKeys.description
For TABLE-typed fields, the predefined keys each row may contain.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.fields.items.properties.validators.description
Server-enforced rules applied to this field at create and patch.

# paths./rest/v1/tag-manager-variables/types.get.responses.200.content.application/json.schema.properties.entities.items.properties.supportsVariables.description
When `true`, this variable type's parameter fields can themselves contain `{{OtherVariable}}` references that the SDK resolves at runtime.

# paths./rest/v1/tag-manager-variables/types.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-variables/types.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-folders.get.description
List folders inside a single tag manager. Folders are dashboard-only organizational containers — they do not affect tag evaluation. Requires the `tagManagerId` query parameter. Supports cursor pagination via `limit` and `cursor`; the limit clamp is 1000 so a single request can return the full set (the web-app workspace renders all folders in one shot). Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-folders.get.parameters[].schema.description
Maximum number of folders to return. Defaults to 25; values below 1 are clamped to 1 and values above 1000 are clamped to 1000. The web-app passes 1000 to render the full workspace in one request.

# paths./rest/v1/tag-manager-folders.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/tag-manager-folders.get.parameters[].schema.description
Parent tag manager whose folders should be returned.

# paths./rest/v1/tag-manager-folders.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-folders.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-folders.post.description
Create a folder inside a tag manager. `tagManagerId` is required in the body. Names are case-insensitively unique within the tag manager — collisions return 409 with the reason in the response `error` field. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-folders.post.requestBody.content.application/json.schema.properties.tagManagerId.description
Parent tag manager that will own the new folder.

# paths./rest/v1/tag-manager-folders.post.requestBody.content.application/json.schema.properties.name.description
Folder name. Case-insensitively unique within the tag manager.

# paths./rest/v1/tag-manager-folders.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-folders.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-folders.post.responses.409.description
Conflict — a folder with the same name (case-insensitive) already exists in this tag manager.

# paths./rest/v1/tag-manager-folders/{id}.get.description
Find a single tag manager folder by ID. Requires scope: tagManagers:find

# paths./rest/v1/tag-manager-folders/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-folders/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-folders/{id}.patch.description
Rename a folder. The new name must be case-insensitively unique within the tag manager; collisions return 409. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-folders/{id}.patch.requestBody.content.application/json.schema.properties.name.description
New folder name. Case-insensitively unique within the tag manager.

# paths./rest/v1/tag-manager-folders/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-folders/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-folders/{id}.patch.responses.409.description
Conflict — a folder with the same name (case-insensitive) already exists in this tag manager.

# paths./rest/v1/tag-manager-folders/{id}.delete.description
Delete a folder. Tags, triggers, and variables previously assigned to the folder are no longer grouped under it; the assets themselves are not deleted. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-folders/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-folders/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/tag-manager-asset-folders.post.description
Assign a tag, trigger, or variable to a folder within its tag manager, or send `folderId: null` to remove the asset from its current folder. The assignment is a full replace — calling it again with a different `folderId` silently moves the asset. Requires scope: tagManagers:update

# paths./rest/v1/tag-manager-asset-folders.post.requestBody.content.application/json.schema.properties.assetType.description
Asset type to assign. Must be one of `tagManagerTag`, `tagManagerTrigger`, or `tagManagerVariable`.

# paths./rest/v1/tag-manager-asset-folders.post.requestBody.content.application/json.schema.properties.assetId.description
UUID of the tag, trigger, or variable to assign.

# paths./rest/v1/tag-manager-asset-folders.post.requestBody.content.application/json.schema.properties.folderId.description
Folder UUID to assign to. Send `null` to remove the asset from its current folder.

# paths./rest/v1/tag-manager-asset-folders.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/tag-manager-asset-folders.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/attribution/initial.get.description
Returns the top-15 values for each UTM dimension (source, medium, campaign, content, term, name) and referring domain attributed to the conversion event on a first-touch basis for the given date window. Use `from`/`to` to set the analysis window (max 60 days). Optionally filter to a specific UTM combo with `utmSource`, `utmMedium`, etc. The counts represent unique visitors who performed the specified `eventName` and were attributed to each UTM value. Requires scope: web-analytics:view

# paths./rest/v1/attribution/initial.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/attribution/initial.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/attribution/initial.get.parameters[].schema.description
Conversion event to count. Must be a selectable conversion event.

# paths./rest/v1/attribution/initial.get.parameters[].schema.description
Attribution type for UTM filter matching. Defaults to `INITIAL`.

# paths./rest/v1/attribution/initial.get.responses.200.description
Initial (first-touch) attribution breakdown by UTM dimension and referring domain

# paths./rest/v1/attribution/initial.get.responses.400.description
Bad request — malformed `from`/`to` or window longer than 60 days.

# paths./rest/v1/attribution/initial.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/attribution/initial.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/attribution/last-touch.get.description
Returns the top-15 values for each UTM dimension (source, medium, campaign, content, term, name) and referring domain attributed to the conversion event on a last-touch basis for the given date window. Use `from`/`to` to set the analysis window (max 60 days). The counts represent unique visitors who performed the specified `eventName` and were attributed to each UTM value on their most recent session. Requires scope: web-analytics:view

# paths./rest/v1/attribution/last-touch.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/attribution/last-touch.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/attribution/last-touch.get.parameters[].schema.description
Conversion event to count. Must be a selectable conversion event.

# paths./rest/v1/attribution/last-touch.get.parameters[].schema.description
Attribution type for UTM filter matching. Defaults to `LAST_TOUCH`.

# paths./rest/v1/attribution/last-touch.get.responses.200.description
Last-touch attribution breakdown by UTM dimension and referring domain

# paths./rest/v1/attribution/last-touch.get.responses.400.description
Bad request — malformed `from`/`to` or window longer than 60 days.

# paths./rest/v1/attribution/last-touch.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/attribution/last-touch.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/attribution/conversion.get.description
Multi-touch conversion attribution: returns a source → medium → campaign hierarchy with attributed converter credits distributed according to the selected `attributionModel`. Scoped to all web sources by default; optionally narrow to a single web source via `webSourceId`. Date range is capped at 31 days; lookback window is capped at 60 days. Requires scope: web-analytics:view

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 31 days or fewer.

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 31 days or fewer.

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
Conversion event to attribute. Must be a selectable conversion event.

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
Attribution model to apply to multi-touch conversion paths.

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
How far back before each conversion to consider touchpoints. Capped at 60 days for this report. Defaults to `THIRTY_DAYS`.

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
Maximum number of leaf-level attribution rows to return. Defaults to 1000.

# paths./rest/v1/attribution/conversion.get.parameters[].schema.description
Scope to a single web source by id, or omit for all sources (account-wide).

# paths./rest/v1/attribution/conversion.get.responses.400.description
Bad request — malformed `from`/`to`, window longer than 31 days, or invalid `eventName`.

# paths./rest/v1/attribution/conversion.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/attribution/conversion.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/attribution/audience-conversion.get.description
Audience performance conversion report: returns a summary of converters and conversion rate for the selected event and date window, a per-day timeseries, and a UTM source/medium/campaign breakdown. Optionally compare against the preceding period of equal length when `attributionWindow` is `IN_RANGE`. Date range is capped at 60 days. Requires scope: web-analytics:view

# paths./rest/v1/attribution/audience-conversion.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/attribution/audience-conversion.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 60 days or fewer.

# paths./rest/v1/attribution/audience-conversion.get.parameters[].schema.description
Event property to sum as conversion value.

# paths./rest/v1/attribution/audience-conversion.get.parameters[].schema.description
Attribution window: `IN_RANGE` or a number of lookback days (e.g. `7`, `30`). Defaults to `IN_RANGE`.

# paths./rest/v1/attribution/audience-conversion.get.parameters[].schema.description
Filter results to a specific web source by its UUID.

# paths./rest/v1/attribution/audience-conversion.get.parameters[].schema.description
Exclude bot sessions. Defaults to `true`.

# paths./rest/v1/attribution/audience-conversion.get.responses.200.description
Audience conversion report with summary, timeseries, and UTM breakdown

# paths./rest/v1/attribution/audience-conversion.get.responses.400.description
Bad request — malformed `from`/`to` or window longer than 60 days.

# paths./rest/v1/attribution/audience-conversion.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/attribution/audience-conversion.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/attribution/utm-comparison.get.description
Compare up to 5 UTM dimension combinations side-by-side for a single conversion event. Each combo returns the unique visitors, sessions, total events, and derived conversion rate for that UTM filter within the window. Requires both `web-analytics:view` and `report:event-count-by-day` API-key scopes. Date range is capped at 31 days. Pass `combos` as a single JSON-encoded array: `combos=[{"utmSource":"google","utmMedium":"cpc"},{"utmSource":"meta"}]`. Requires scope: web-analytics:view

# paths./rest/v1/attribution/utm-comparison.get.parameters[].schema.description
Inclusive lower bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 31 days or fewer.

# paths./rest/v1/attribution/utm-comparison.get.parameters[].schema.description
Inclusive upper bound of the analytics window, as a UTC calendar day in `YYYY-MM-DD` format. The window between `from` and `to` must be 31 days or fewer.

# paths./rest/v1/attribution/utm-comparison.get.parameters[].schema.description
Conversion event to compare across UTM combos.

# paths./rest/v1/attribution/utm-comparison.get.parameters[].schema.description
JSON-encoded array of UTM dimension combos to compare side-by-side (min 1, max 5). Each combo is an object with optional `utmSource`, `utmMedium`, `utmCampaign`, `utmContent`, `utmTerm` fields.

# paths./rest/v1/attribution/utm-comparison.get.responses.200.description
Side-by-side UTM performance comparison for up to 5 UTM combos

# paths./rest/v1/attribution/utm-comparison.get.responses.200.content.application/json.schema.properties.combos.description
Per-combo metrics in the same order as the input `combos` array.

# paths./rest/v1/attribution/utm-comparison.get.responses.200.content.application/json.schema.properties.range.description
The requested date range as returned by the server.

# paths./rest/v1/attribution/utm-comparison.get.responses.400.description
Bad request — malformed `from`/`to`, window longer than 31 days, malformed `combos` JSON, or more than 5 combos.

# paths./rest/v1/attribution/utm-comparison.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/attribution/utm-comparison.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/overview.get.description
Return privacy-first traffic metrics and a timeseries for the requested date range. Filter by source, geography, page, campaign, device, or other supported dimensions with the JSON-encoded `filters` query parameter. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Inclusive lower bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Inclusive upper bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Optional web source UUID. Omit to aggregate all web sources in the account.

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Exclude detected bot sessions. Defaults to true.

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Optional JSON-encoded array of up to 20 filters. Dimensions: `page`, `entry_page`, `exit_page`, `source`, `medium`, `campaign`, `content`, `term`, `referrer`, `country`, `region`, `city`, `device`, `browser`, `os`. Each filter has a dimension, optional operator (`IS`, `IS_NOT`, `CONTAINS`, `NOT_CONTAINS`; defaults to `IS`), and one or more values. Example: `[{"dimension":"country","values":["United States"]}]`.

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Timeseries bucket interval. Minute queries are capped to the most recent 24 hours.

# paths./rest/v1/web-analytics/overview.get.parameters[].schema.description
Optional ISO timestamp used as the lower bound for realtime queries.

# paths./rest/v1/web-analytics/overview.get.responses.200.content.application/json.schema.properties.metrics.properties.bounceRate.description
Percentage from 0 to 100 of visits with exactly one pageview.

# paths./rest/v1/web-analytics/overview.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/overview.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/sources.get.description
Return visitor counts grouped by referrer or UTM source dimension for the requested date range. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/sources.get.parameters[].schema.description
Inclusive lower bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/sources.get.parameters[].schema.description
Inclusive upper bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/sources.get.parameters[].schema.description
Optional web source UUID. Omit to aggregate all web sources in the account.

# paths./rest/v1/web-analytics/sources.get.parameters[].schema.description
Exclude detected bot sessions. Defaults to true.

# paths./rest/v1/web-analytics/sources.get.parameters[].schema.description
Optional JSON-encoded array of up to 20 filters. Dimensions: `page`, `entry_page`, `exit_page`, `source`, `medium`, `campaign`, `content`, `term`, `referrer`, `country`, `region`, `city`, `device`, `browser`, `os`. Each filter has a dimension, optional operator (`IS`, `IS_NOT`, `CONTAINS`, `NOT_CONTAINS`; defaults to `IS`), and one or more values. Example: `[{"dimension":"country","values":["United States"]}]`.

# paths./rest/v1/web-analytics/sources.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/sources.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/pages.get.description
Return page-level traffic metrics for top pages, entry pages, or exit pages in the requested date range. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/pages.get.parameters[].schema.description
Inclusive lower bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/pages.get.parameters[].schema.description
Inclusive upper bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/pages.get.parameters[].schema.description
Optional web source UUID. Omit to aggregate all web sources in the account.

# paths./rest/v1/web-analytics/pages.get.parameters[].schema.description
Exclude detected bot sessions. Defaults to true.

# paths./rest/v1/web-analytics/pages.get.parameters[].schema.description
Optional JSON-encoded array of up to 20 filters. Dimensions: `page`, `entry_page`, `exit_page`, `source`, `medium`, `campaign`, `content`, `term`, `referrer`, `country`, `region`, `city`, `device`, `browser`, `os`. Each filter has a dimension, optional operator (`IS`, `IS_NOT`, `CONTAINS`, `NOT_CONTAINS`; defaults to `IS`), and one or more values. Example: `[{"dimension":"country","values":["United States"]}]`.

# paths./rest/v1/web-analytics/pages.get.responses.200.content.application/json.schema.properties.rows.items.properties.bounceRate.description
Percentage from 0 to 100 of visits to the page that bounced.

# paths./rest/v1/web-analytics/pages.get.responses.200.content.application/json.schema.properties.rows.items.properties.timeOnPage.description
Average time on page in seconds when available.

# paths./rest/v1/web-analytics/pages.get.responses.200.content.application/json.schema.properties.rows.items.properties.exitRate.description
Percentage from 0 to 100 of pageviews that ended a visit.

# paths./rest/v1/web-analytics/pages.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/pages.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/locations.get.description
Return visitor counts grouped by country, region, or city for the requested date range. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/locations.get.parameters[].schema.description
Inclusive lower bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/locations.get.parameters[].schema.description
Inclusive upper bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/locations.get.parameters[].schema.description
Optional web source UUID. Omit to aggregate all web sources in the account.

# paths./rest/v1/web-analytics/locations.get.parameters[].schema.description
Exclude detected bot sessions. Defaults to true.

# paths./rest/v1/web-analytics/locations.get.parameters[].schema.description
Optional JSON-encoded array of up to 20 filters. Dimensions: `page`, `entry_page`, `exit_page`, `source`, `medium`, `campaign`, `content`, `term`, `referrer`, `country`, `region`, `city`, `device`, `browser`, `os`. Each filter has a dimension, optional operator (`IS`, `IS_NOT`, `CONTAINS`, `NOT_CONTAINS`; defaults to `IS`), and one or more values. Example: `[{"dimension":"country","values":["United States"]}]`.

# paths./rest/v1/web-analytics/locations.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/locations.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/devices.get.description
Return visitor counts grouped by device type, browser, or operating system for the requested date range. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/devices.get.parameters[].schema.description
Inclusive lower bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/devices.get.parameters[].schema.description
Inclusive upper bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/devices.get.parameters[].schema.description
Optional web source UUID. Omit to aggregate all web sources in the account.

# paths./rest/v1/web-analytics/devices.get.parameters[].schema.description
Exclude detected bot sessions. Defaults to true.

# paths./rest/v1/web-analytics/devices.get.parameters[].schema.description
Optional JSON-encoded array of up to 20 filters. Dimensions: `page`, `entry_page`, `exit_page`, `source`, `medium`, `campaign`, `content`, `term`, `referrer`, `country`, `region`, `city`, `device`, `browser`, `os`. Each filter has a dimension, optional operator (`IS`, `IS_NOT`, `CONTAINS`, `NOT_CONTAINS`; defaults to `IS`), and one or more values. Example: `[{"dimension":"country","values":["United States"]}]`.

# paths./rest/v1/web-analytics/devices.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/devices.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/current-visitors.get.description
Return the distinct visitors active in the most recent 15-minute window, optionally scoped to one web source. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/current-visitors.get.parameters[].schema.description
Optional web source UUID. Omit to count visitors across all account web sources.

# paths./rest/v1/web-analytics/current-visitors.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/current-visitors.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/web-analytics/journey.get.description
Return the next or previous journey steps for a pinned path. The `path` and `filters` query parameters are JSON-encoded arrays. Requires scope: web-analytics:view

# paths./rest/v1/web-analytics/journey.get.parameters[].schema.description
Inclusive lower bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/journey.get.parameters[].schema.description
Inclusive upper bound of the analysis window as `YYYY-MM-DD`.

# paths./rest/v1/web-analytics/journey.get.parameters[].schema.description
Optional web source UUID. Omit to aggregate all web sources in the account.

# paths./rest/v1/web-analytics/journey.get.parameters[].schema.description
Exclude detected bot sessions. Defaults to true.

# paths./rest/v1/web-analytics/journey.get.parameters[].schema.description
Optional JSON-encoded array of up to 20 journey filters. Supports web analytics dimensions plus `event_name`, `ep_currency`, `ep_appointment_id`, `ep_appointment_status`, `ep_service_line`, `ep_provider_id`, `ep_location_id`, `ep_booking_channel`, `ep_revenue_type`, `ep_call_outcome`, and `ep_staff_id`. Each filter has a dimension, optional operator (`IS`, `IS_NOT`, `CONTAINS`, `NOT_CONTAINS`; defaults to `IS`), and one or more values.

# paths./rest/v1/web-analytics/journey.get.parameters[].schema.description
JSON-encoded ordered path of opaque journey step keys. Use an empty array to request first-column candidates.

# paths./rest/v1/web-analytics/journey.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/web-analytics/journey.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/session-replays.get.description
List recorded sessions for a date range. Filter by event, page, visitor, UTM fields, or an explicit JSON-encoded session ID list. Use `pagination.nextCursor` to retrieve the next page. Requires scope: web-analytics:view

# paths./rest/v1/session-replays.get.parameters[].schema.description
Inclusive lower bound of the replay window as `YYYY-MM-DD`.

# paths./rest/v1/session-replays.get.parameters[].schema.description
Inclusive upper bound of the replay window as `YYYY-MM-DD`.

# paths./rest/v1/session-replays.get.parameters[].schema.description
Optional JSON-encoded session ID array. Maximum 100 session IDs.

# paths./rest/v1/session-replays.get.parameters[].schema.description
Maximum replay sessions to return. Defaults to the report default.

# paths./rest/v1/session-replays.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/session-replays.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/session-replays.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/session-replays/overview.get.description
Return the total number of replay-bearing sessions and a daily timeseries for the requested date range. Requires scope: web-analytics:view

# paths./rest/v1/session-replays/overview.get.parameters[].schema.description
Inclusive lower bound of the replay window as `YYYY-MM-DD`.

# paths./rest/v1/session-replays/overview.get.parameters[].schema.description
Inclusive upper bound of the replay window as `YYYY-MM-DD`.

# paths./rest/v1/session-replays/overview.get.responses.200.description
Session replay totals and daily timeseries

# paths./rest/v1/session-replays/overview.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/session-replays/overview.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/translation-widgets/{id}/analytics.get.description
Return usage totals and language, host, and page breakdowns for one translation widget over the requested date range. Requires scope: report:translation-analytics

# paths./rest/v1/translation-widgets/{id}/analytics.get.parameters[].schema.description
Inclusive lower bound of the analytics window as `YYYY-MM-DD`.

# paths./rest/v1/translation-widgets/{id}/analytics.get.parameters[].schema.description
Inclusive upper bound of the analytics window as `YYYY-MM-DD`.

# paths./rest/v1/translation-widgets/{id}/analytics.get.parameters[].schema.description
Maximum rows to return for each breakdown. Defaults to 50.

# paths./rest/v1/translation-widgets/{id}/analytics.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/translation-widgets/{id}/analytics.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/conversion-journey-summaries.get.description
List saved Conversion Journey Summary configurations, most recently updated first. Supports cursor pagination. Each result contains the conversion event, analysis window, attribution window, filters, and bot/source settings needed to reopen the saved analysis. Requires scope: web-analytics:view

# paths./rest/v1/conversion-journey-summaries.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/conversion-journey-summaries.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/conversion-journey-summaries.get.responses.200.description
Paginated saved conversion journey summaries

# paths./rest/v1/conversion-journey-summaries.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/conversion-journey-summaries.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/conversion-journey-summaries.post.description
Save a named Conversion Journey Summary configuration. Returns the full saved summary so callers can reopen the same analysis without a follow-up request. Each account can save up to 100 summaries. Requires scope: web-analytics:write

# paths./rest/v1/conversion-journey-summaries.post.requestBody.content.application/json.schema.properties.dateFrom.description
Inclusive start of the saved analysis window in `YYYY-MM-DD` format.

# paths./rest/v1/conversion-journey-summaries.post.requestBody.content.application/json.schema.properties.dateTo.description
Inclusive end of the saved analysis window in `YYYY-MM-DD` format.

# paths./rest/v1/conversion-journey-summaries.post.responses.200.description
Created saved conversion journey summary

# paths./rest/v1/conversion-journey-summaries.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/conversion-journey-summaries.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/conversion-journey-summaries.post.responses.409.description
Conflict — the account has reached its saved Conversion Journey Summary limit.

# paths./rest/v1/conversion-journey-summaries/{id}.get.description
Fetch a saved Conversion Journey Summary by its id. Returns 404 when it does not exist. Requires scope: web-analytics:view

# paths./rest/v1/conversion-journey-summaries/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/conversion-journey-summaries/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/conversion-journey-summaries/{id}.get.responses.404.description
Saved conversion journey summary not found.

# paths./rest/v1/conversion-journey-summaries/{id}.patch.description
Update one or more fields on a saved Conversion Journey Summary. Omitted fields remain unchanged. When provided, `filters` replaces the complete saved filter list. Send `null` for `webSourceId` or `excludeBots` to clear that optional setting. Requires scope: web-analytics:write

# paths./rest/v1/conversion-journey-summaries/{id}.patch.responses.200.description
Updated saved conversion journey summary

# paths./rest/v1/conversion-journey-summaries/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/conversion-journey-summaries/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/conversion-journey-summaries/{id}.patch.responses.404.description
Saved conversion journey summary not found.

# paths./rest/v1/conversion-journey-summaries/{id}.delete.description
Delete a saved Conversion Journey Summary. The underlying analytics data is unaffected. Requires scope: web-analytics:write

# paths./rest/v1/conversion-journey-summaries/{id}.delete.responses.200.description
Deleted saved conversion journey summary

# paths./rest/v1/conversion-journey-summaries/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/conversion-journey-summaries/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/conversion-journey-summaries/{id}.delete.responses.404.description
Saved conversion journey summary not found.

# paths./rest/v1/funnels.get.description
List every funnel configured on this account. Each funnel includes its step configuration, funnel type, and conversion window. Funnel results are computed on demand, so `status` is always `READY` and `reportDateRange` is always `null`; both fields are retained for backward compatibility and should not be used to decide whether results are available. Requires scope: web-analytics:view

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels.get.responses.200.content.application/json.schema.properties.entities.items.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/funnels.post.description
Create a session-based funnel with 2 to 10 ordered event steps. Returns the complete saved configuration. Requires scope: web-analytics:write

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.funnelType.description
Funnels are session-based. `SESSION_BASED` is the only supported value and is applied when omitted.

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels.post.requestBody.content.application/json.schema.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels.post.responses.200.content.application/json.schema.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/funnels/{id}.get.description
Fetch a single funnel configuration by its id. Returns `404` when the funnel does not exist or belongs to a different account. Requires scope: web-analytics:view

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}.get.responses.200.content.application/json.schema.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/funnels/{id}.patch.description
Update one or more Funnel fields. Omitted fields remain unchanged. Send `null` to clear an optional field. `globalLogic` and legacy `utmFilters` cannot be set together. Requires scope: web-analytics:write

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}.patch.requestBody.content.application/json.schema.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}.patch.responses.200.content.application/json.schema.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/funnels/{id}.delete.description
Delete a Funnel configuration. Existing analytics data is unaffected. Requires scope: web-analytics:write

# paths./rest/v1/funnels/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/funnels/{id}/duplicate.post.description
Duplicate a funnel configuration in the same account. The copy keeps the funnel steps and settings, receives a new ID, and is named `Copy of …`. Requires scope: web-analytics:write

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.steps.items.properties.logic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.utmFilters.description
Legacy exact-match UTM filters. Do not combine with globalLogic; globalLogic takes precedence.

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.globalLogic.properties.AND.description
All child nodes must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.globalLogic.properties.OR.description
Any child node must match. Each child is itself a logic node (leaf `condition` or combinator).

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.property.description
Bare dotted path into the event/visitor record. Examples: `$event.event`, `$event.event_properties.value`, `visitor.consent.marketing`. The leading `$` is optional and stripped before lookup. Do **not** use `{{...}}` here — that template syntax is for mapping values (`mappings[].map`), not logic conditions, and would be compared as a literal string.

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.globalLogic.properties.condition.properties.value.description
String compared against the resolved property. Operators that take no value (`IsFalsy`, `IsTruthy`, `IsNull`, `IsNotNull`, `IsUndefined`, `IsNotUndefined`, `IsTrue`, `IsFalse`) ignore this field — send `""`.

# paths./rest/v1/funnels/{id}/duplicate.post.responses.200.content.application/json.schema.properties.globalLogic.description
Nested visitor logic for the entire funnel. When supplied, this replaces legacy UTM filters.

# paths./rest/v1/funnels/{id}/duplicate.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels/{id}/duplicate.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/funnels/{id}/results.get.description
Compute funnel step analytics for a funnel over a date window. Returns per-step visitor counts, conversion rates, drop-off rates, average time to next step, and sample session IDs for replay. Results are computed on demand from event data at request time, so any date window within the supported range returns current results. `to` must be on or after `from`, and the window may span at most 31 days including both endpoints. Requires scope: web-analytics:view

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Inclusive lower bound of the analysis window, as a UTC calendar day in `YYYY-MM-DD` format. The window may span at most 31 days including both endpoints.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Inclusive upper bound of the analysis window, as a UTC calendar day in `YYYY-MM-DD` format. Must be on or after `from`, and the window may span at most 31 days including both endpoints.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Restrict the funnel to sessions on a device class. `MOBILE` matches phone sessions; `DESKTOP` matches every session that is not a phone, tablet, TV, console, wearable, XR, or embedded device. `ALL` (the default) applies no device filter.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Accepted for backward compatibility but NOT applied. Funnel sessions carry a single attribution set, so there is no initial vs. last-touch distinction to select between.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Restrict the funnel to sessions whose `utm_source` exactly matches this value.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Restrict the funnel to sessions whose `utm_medium` exactly matches this value.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Restrict the funnel to sessions whose `utm_campaign` exactly matches this value.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Restrict the funnel to sessions whose `utm_content` exactly matches this value.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Restrict the funnel to sessions whose `utm_term` exactly matches this value.

# paths./rest/v1/funnels/{id}/results.get.parameters[].schema.description
Accepted for backward compatibility but NOT applied — there is no campaign-name dimension on funnel sessions. Use `utmCampaign` instead.

# paths./rest/v1/funnels/{id}/results.get.responses.200.description
Funnel step analytics for the requested date window

# paths./rest/v1/funnels/{id}/results.get.responses.200.content.application/json.schema.properties.steps.description
Per-step funnel analytics, ordered by step number.

# paths./rest/v1/funnels/{id}/results.get.responses.200.content.application/json.schema.properties.totalVisitors.description
Total number of visitors who entered the funnel (entered step 1).

# paths./rest/v1/funnels/{id}/results.get.responses.200.content.application/json.schema.properties.overallConversionRate.description
Conversion rate from first step to last step as a percentage.

# paths./rest/v1/funnels/{id}/results.get.responses.200.content.application/json.schema.properties.overallAvgTimeToConversion.description
Average time from first step to last step in seconds. Null when no completions.

# paths./rest/v1/funnels/{id}/results.get.responses.200.content.application/json.schema.properties.warning.description
Present when the results are wider than the funnel as configured. Some step conditions could not be expressed as a query and were ignored, so the counts above include visitors those conditions would have excluded. Absent when the whole definition was applied. The dashboard surfaces the same caveat.

# paths./rest/v1/funnels/{id}/results.get.responses.400.description
Bad request — malformed `from`/`to` dates, `to` earlier than `from`, or a window longer than 31 days.

# paths./rest/v1/funnels/{id}/results.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/funnels/{id}/results.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/audience-conversion-reports.get.description
List saved Audience Performance report configurations, most recently updated first. Requires scope: web-analytics:view

# paths./rest/v1/audience-conversion-reports.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/audience-conversion-reports.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/audience-conversion-reports.post.description
Save an Audience Performance report configuration. Returns the full report so callers can run or update it without another request. Requires scope: web-analytics:write

# paths./rest/v1/audience-conversion-reports.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/audience-conversion-reports.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/audience-conversion-reports.post.responses.409.description
The saved Audience Performance report limit has been reached.

# paths./rest/v1/audience-conversion-reports/{id}.get.description
Fetch a saved Audience Performance report by id. Requires scope: web-analytics:view

# paths./rest/v1/audience-conversion-reports/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/audience-conversion-reports/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/audience-conversion-reports/{id}.patch.description
Update a saved Audience Performance report. Omitted fields remain unchanged, `filters: []` clears all filters, and dates must be sent or cleared as a pair. Requires scope: web-analytics:write

# paths./rest/v1/audience-conversion-reports/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/audience-conversion-reports/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/audience-conversion-reports/{id}.delete.description
Delete a saved Audience Performance report configuration. Requires scope: web-analytics:write

# paths./rest/v1/audience-conversion-reports/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/audience-conversion-reports/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/audience-conversion-reports/{id}/results.get.description
Run a saved Audience Performance report. `from` and `to` override the saved date range when provided together. Returns 400 when neither a saved range nor an override is available. Requires scope: web-analytics:view

# paths./rest/v1/audience-conversion-reports/{id}/results.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/audience-conversion-reports/{id}/results.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/short-links.get.description
List all short links (QR codes / redirects) for this account, newest first. Supports cursor pagination and optional `status` and `nameContains` filters. Each entity bundles the destination URL, immutable code, path format, and QR/campaign design. Requires scope: source:list

# paths./rest/v1/short-links.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/short-links.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/short-links.get.parameters[].schema.description
Case-insensitive substring filter on the short link name.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.accountId.description
Organization id that owns this short link.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.isPublished.description
Whether this short link exists in the currently published version. An unpublished short link does not resolve at the edge.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.redirectUrl.description
The destination URL this short link redirects to.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.pixel.description
The immutable short code embedded in the public URL (`/r/{pixel}` for new links). Server-assigned.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.shortLinkCode.description
The public code embedded in the short-link URL.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.hasCustomShortLinkCode.description
Whether a user selected this code instead of using a generated code.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.shortUrl.description
The public short-link URL that the QR encodes and callers share. New links use `/r/{pixel}`; tracked event and campaign defaults are stored server-side. Also resolves on branded custom domains configured for the account.

# paths./rest/v1/short-links.get.responses.200.content.application/json.schema.properties.entities.items.properties.shortLinkDesign.description
QR styling + campaign tags. Null until the link is styled.

# paths./rest/v1/short-links.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/short-links.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/short-links.post.description
Create a short link (QR code / redirect) with its destination, campaign tags, and QR styling in a single call. The server atomically reserves an immutable compact code; `shortUrl` resolves as `/r/{pixel}` without tracking query parameters. All body fields are optional: send `{}` to create an unconfigured link and fill it in later with PATCH. A newly created short link only resolves at the edge once a version is published. Requires scope: source:create

# paths./rest/v1/short-links.post.requestBody.content.application/json.schema.properties.name.description
Human-readable name. Also sent as the tracked event name on every click/scan.

# paths./rest/v1/short-links.post.requestBody.content.application/json.schema.properties.redirectUrl.description
Destination URL the short link redirects to. Must be a valid URL.

# paths./rest/v1/short-links.post.requestBody.content.application/json.schema.properties.utm.description
Campaign / UTM tags appended to the tracked short-link URL.

# paths./rest/v1/short-links.post.requestBody.content.application/json.schema.properties.code.description
Optional custom code in the shared public short-link namespace.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.accountId.description
Organization id that owns this short link.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.isPublished.description
Whether this short link exists in the currently published version. An unpublished short link does not resolve at the edge.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.redirectUrl.description
The destination URL this short link redirects to.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.pixel.description
The immutable short code embedded in the public URL (`/r/{pixel}` for new links). Server-assigned.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.shortLinkCode.description
The public code embedded in the short-link URL.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.hasCustomShortLinkCode.description
Whether a user selected this code instead of using a generated code.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.shortUrl.description
The public short-link URL that the QR encodes and callers share. New links use `/r/{pixel}`; tracked event and campaign defaults are stored server-side. Also resolves on branded custom domains configured for the account.

# paths./rest/v1/short-links.post.responses.200.content.application/json.schema.properties.shortLinkDesign.description
QR styling + campaign tags. Null until the link is styled.

# paths./rest/v1/short-links.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/short-links.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/short-links/{id}.get.description
Fetch a single short link by id, including its destination, immutable code, composed `shortUrl`, and QR/campaign design. Returns 404 when no short link matches the id or it belongs to a different account. Requires scope: source:view

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.accountId.description
Organization id that owns this short link.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.isPublished.description
Whether this short link exists in the currently published version. An unpublished short link does not resolve at the edge.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.redirectUrl.description
The destination URL this short link redirects to.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.pixel.description
The immutable short code embedded in the public URL (`/r/{pixel}` for new links). Server-assigned.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.shortLinkCode.description
The public code embedded in the short-link URL.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.hasCustomShortLinkCode.description
Whether a user selected this code instead of using a generated code.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.shortUrl.description
The public short-link URL that the QR encodes and callers share. New links use `/r/{pixel}`; tracked event and campaign defaults are stored server-side. Also resolves on branded custom domains configured for the account.

# paths./rest/v1/short-links/{id}.get.responses.200.content.application/json.schema.properties.shortLinkDesign.description
QR styling + campaign tags. Null until the link is styled.

# paths./rest/v1/short-links/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/short-links/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/short-links/{id}.patch.description
Partially update a short link. Only the fields you send are changed; omitted fields are unchanged. Send explicit `null` to clear `redirectUrl`. The `utm` and `qr` objects are replaced wholesale when sent. Returns the full short link entity after the update. Requires scope: source:update

# paths./rest/v1/short-links/{id}.patch.requestBody.content.application/json.schema.properties.redirectUrl.description
Destination URL the short link redirects to. Must be a valid URL. Send `null` to clear it.

# paths./rest/v1/short-links/{id}.patch.requestBody.content.application/json.schema.properties.status.description
Whether the short link resolves at the edge. Send `Enabled` or `Disabled`; `null` is rejected since storage cannot represent it.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.accountId.description
Organization id that owns this short link.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.isPublished.description
Whether this short link exists in the currently published version. An unpublished short link does not resolve at the edge.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.redirectUrl.description
The destination URL this short link redirects to.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.pixel.description
The immutable short code embedded in the public URL (`/r/{pixel}` for new links). Server-assigned.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.shortLinkCode.description
The public code embedded in the short-link URL.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.hasCustomShortLinkCode.description
Whether a user selected this code instead of using a generated code.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.shortUrl.description
The public short-link URL that the QR encodes and callers share. New links use `/r/{pixel}`; tracked event and campaign defaults are stored server-side. Also resolves on branded custom domains configured for the account.

# paths./rest/v1/short-links/{id}.patch.responses.200.content.application/json.schema.properties.shortLinkDesign.description
QR styling + campaign tags. Null until the link is styled.

# paths./rest/v1/short-links/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/short-links/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/short-links/{id}.delete.description
Delete a short link and its QR/campaign design. After deletion the short URL stops resolving on the next publish. Requires scope: source:delete

# paths./rest/v1/short-links/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/short-links/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/short-links/{id}/results.get.description
Aggregate click analytics for a short link over a date window: total and unique clicks, a time series (daily or hourly), and breakdowns by country, city, and device. QR scans are counted as clicks. Pass `from`/`to` as UTC calendar days (`YYYY-MM-DD`); set `granularity=HOURLY` for hourly buckets and `excludeBots=false` to include bot traffic. Requires the `shortlink:reporting` scope, which is gated separately because analytics data is PHI-bearing. Requires scope: shortlink:reporting

# paths./rest/v1/short-links/{id}/results.get.parameters[].schema.description
Inclusive lower bound of the report window, a UTC calendar day in `YYYY-MM-DD`.

# paths./rest/v1/short-links/{id}/results.get.parameters[].schema.description
Inclusive upper bound of the report window, a UTC calendar day in `YYYY-MM-DD`.

# paths./rest/v1/short-links/{id}/results.get.parameters[].schema.description
Time-series bucket size. Defaults to `DAILY`.

# paths./rest/v1/short-links/{id}/results.get.parameters[].schema.description
Exclude bot traffic from the counts. Defaults to `true`.

# paths./rest/v1/short-links/{id}/results.get.responses.200.description
Click / scan analytics for the short link

# paths./rest/v1/short-links/{id}/results.get.responses.400.description
Bad request — malformed `from`/`to` dates.

# paths./rest/v1/short-links/{id}/results.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/short-links/{id}/results.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos.get.description
List videos for the account, newest first. Supports cursor pagination and an optional case-insensitive title filter. Requires scope: media:list

# paths./rest/v1/videos.get.parameters[].schema.description
Maximum number of items to return. Defaults to 25; values below 1 are clamped to 1 and values above 100 are clamped to 100.

# paths./rest/v1/videos.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/videos.get.parameters[].schema.description
Case-insensitive substring match on the video title.

# paths./rest/v1/videos.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos.post.description
Create a video record and return a temporary upload target for the original MP4 or WebM file. Upload the file directly using the returned URL and matching content type, then poll the video to observe processing progress. Requires scope: media:create

# paths./rest/v1/videos.post.requestBody.content.application/json.schema.properties.name.description
Video title. Defaults to `New Video` when omitted.

# paths./rest/v1/videos.post.requestBody.content.application/json.schema.properties.mimeType.description
Content type for the original video upload: `MP4` or `WEBM`.

# paths./rest/v1/videos.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos.post.responses.409.description
Conflict — the account has reached its video count limit.

# paths./rest/v1/videos/{id}.get.description
Fetch a video and its current playback asset availability. The processed video, poster, and transcript are prepared asynchronously after upload. Requires scope: media:find

# paths./rest/v1/videos/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/{id}.patch.description
Partially update video metadata. Only fields included in the body change; send `null` to clear a nullable field. Requires scope: media:update

# paths./rest/v1/videos/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/{id}.delete.description
Delete a video and its related assets. Requires scope: media:delete

# paths./rest/v1/videos/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/{id}/upload.post.description
Return a temporary upload target for replacing this video’s original MP4 or WebM source. Upload the file directly using the returned URL and matching content type, then poll the video to observe processing progress. Requires scope: media:update

# paths./rest/v1/videos/{id}/upload.post.requestBody.content.application/json.schema.properties.mimeType.description
Content type for the replacement original video: `MP4` or `WEBM`.

# paths./rest/v1/videos/{id}/upload.post.responses.200.description
Direct upload target for a replacement video source

# paths./rest/v1/videos/{id}/upload.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}/upload.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/{id}/transcript.get.description
Read the current WebVTT transcript. Transcript text is available wherever the video is embedded, so do not include PHI or other confidential information. Requires scope: media:find

# paths./rest/v1/videos/{id}/transcript.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}/transcript.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/{id}/transcript.put.description
Replace the transcript with VTT or SRT text. SRT is normalized to WebVTT. Transcript text is available wherever the video is embedded, so do not include PHI or other confidential information. Requires scope: media:update

# paths./rest/v1/videos/{id}/transcript.put.requestBody.content.application/json.schema.properties.format.description
Transcript source format. SRT content is normalized to WebVTT before it is saved.

# paths./rest/v1/videos/{id}/transcript.put.responses.200.description
Video with updated transcript provenance

# paths./rest/v1/videos/{id}/transcript.put.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}/transcript.put.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/analytics.get.description
Return per-video starts, unique viewers, completion rate, and average watch time for a date window. This derived report uses `limit` and `offset` pagination; `total` is the number of rows returned through the current offset, not a total match count. Requires scope: report:video-analytics

# paths./rest/v1/videos/analytics.get.parameters[].schema.description
Inclusive UTC start day in `YYYY-MM-DD` format.

# paths./rest/v1/videos/analytics.get.parameters[].schema.description
Inclusive UTC end day in `YYYY-MM-DD` format.

# paths./rest/v1/videos/analytics.get.parameters[].schema.description
Maximum number of video rows to return. Defaults to 50.

# paths./rest/v1/videos/analytics.get.parameters[].schema.description
Zero-based row offset. This report is an intentional offset-pagination exception.

# paths./rest/v1/videos/analytics.get.responses.400.description
Bad request — malformed dates, an invalid page size, or a window longer than 90 days.

# paths./rest/v1/videos/analytics.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/analytics.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/videos/{id}/analytics.get.description
Return daily or hourly starts, unique viewers, completions, and completion rate for one video. Daily windows support up to 90 days; hourly windows support up to 14 days. Requires scope: report:video-analytics

# paths./rest/v1/videos/{id}/analytics.get.parameters[].schema.description
Inclusive UTC start day in `YYYY-MM-DD` format.

# paths./rest/v1/videos/{id}/analytics.get.parameters[].schema.description
Inclusive UTC end day in `YYYY-MM-DD` format.

# paths./rest/v1/videos/{id}/analytics.get.parameters[].schema.description
Bucket size. Defaults to `DAILY`; `HOURLY` supports windows of up to 14 days.

# paths./rest/v1/videos/{id}/analytics.get.responses.400.description
Bad request — malformed dates or a window longer than the selected granularity allows.

# paths./rest/v1/videos/{id}/analytics.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/videos/{id}/analytics.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels.get.description
List video channels for the account, sorted by name. Supports cursor pagination via `limit` and `cursor`; the limit clamp is 1000 so a single request can return the full set. Entries omit `resolvedValues` — fetch a channel by id for its video count and embed output. Requires scope: videoChannel:list

# paths./rest/v1/video-channels.get.parameters[].schema.description
Maximum number of channels to return. Defaults to 25; values below 1 are clamped to 1 and values above 1000 are clamped to 1000.

# paths./rest/v1/video-channels.get.parameters[].schema.description
Opaque pagination cursor from pagination.nextCursor in the previous response. Do not decode or modify it. Malformed cursors return 400 Bad Request.

# paths./rest/v1/video-channels.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels.post.description
Create a video channel. Only `name` is accepted here; set branding and publish it with PATCH, and add videos with `POST /rest/v1/video-channels/{id}/media`. New channels start unpublished, so the page is not reachable until you send `isPublished: true`. Requires scope: videoChannel:create

# paths./rest/v1/video-channels.post.requestBody.content.application/json.schema.properties.name.description
Channel name. Case-insensitively unique within the account.

# paths./rest/v1/video-channels.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels.post.responses.409.description
Conflict — a channel with the same name (case-insensitive) already exists in this account.

# paths./rest/v1/video-channels/{id}.get.description
Fetch a channel with its branding, publish state, video count, shareable page URL, and paste-ready embed code. Requires scope: videoChannel:find

# paths./rest/v1/video-channels/{id}.get.responses.200.description
Channel details, video count, and embed output

# paths./rest/v1/video-channels/{id}.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels/{id}.patch.description
Partially update a channel. Only fields included in the body change; send `null` to clear a nullable field. Sending `isPublished: true` makes the channel page reachable and renders it from the current videos and branding; `false` takes it offline. `logoMediaId` must reference an image in your media library. Requires scope: videoChannel:update

# paths./rest/v1/video-channels/{id}.patch.requestBody.content.application/json.schema.properties.name.description
New channel name. Must stay case-insensitively unique within the account.

# paths./rest/v1/video-channels/{id}.patch.requestBody.content.application/json.schema.properties.brandColor.description
Accent color used on the channel page. Any CSS color string.

# paths./rest/v1/video-channels/{id}.patch.requestBody.content.application/json.schema.properties.logoMediaId.description
Id of an image in your media library to show as the channel logo. Must be an image; send `null` to clear it.

# paths./rest/v1/video-channels/{id}.patch.requestBody.content.application/json.schema.properties.isPublished.description
Whether the channel page is publicly reachable. Publishing renders the page from the current videos and branding; unpublishing takes it offline.

# paths./rest/v1/video-channels/{id}.patch.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}.patch.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels/{id}.patch.responses.409.description
Conflict — a channel with the same name (case-insensitive) already exists in this account.

# paths./rest/v1/video-channels/{id}.delete.description
Delete a channel and take its page offline. The videos it listed are not deleted — only their membership in this channel. Requires scope: videoChannel:delete

# paths./rest/v1/video-channels/{id}.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels/{id}/media.get.description
List the videos in a channel, ordered by their position on the page. Not paginated: a channel holds a bounded set of videos, so the full ordered list is always returned. Videos whose media no longer resolves are omitted rather than returned as broken entries. Requires scope: videoChannel:find

# paths./rest/v1/video-channels/{id}/media.get.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}/media.get.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels/{id}/media.post.description
Add a video to a channel. Omit `position` to append it to the end. A video can belong to several channels, so adding it here does not remove it from any other. Calling this again for a video already in the channel updates its position instead of adding a duplicate, and keeps its current slot when `position` is omitted. The returned `id` is a composite membership key, not a UUID. Requires scope: videoChannel:update

# paths./rest/v1/video-channels/{id}/media.post.requestBody.content.application/json.schema.properties.mediaId.description
Id of the video to add to the channel. Must be a video, not an image.

# paths./rest/v1/video-channels/{id}/media.post.requestBody.content.application/json.schema.properties.position.description
Zero-based slot in the channel order. Omit to append to the end; omitting it on a video that is already in the channel keeps its current slot.

# paths./rest/v1/video-channels/{id}/media.post.responses.400.description
Bad request — `mediaId` refers to an image rather than a video.

# paths./rest/v1/video-channels/{id}/media.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}/media.post.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels/{id}/media.post.responses.404.description
Not found — the channel or the video does not exist in this account.

# paths./rest/v1/video-channels/{id}/media.delete.description
Remove one video from a channel, identified by the `mediaId` query parameter. The video itself is not deleted and stays in any other channel it belongs to. Idempotent — removing a video that is not in the channel succeeds and returns the channel unchanged. Requires scope: videoChannel:update

# paths./rest/v1/video-channels/{id}/media.delete.parameters[].schema.description
Id of the video to remove from this channel.

# paths./rest/v1/video-channels/{id}/media.delete.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}/media.delete.responses.403.description
Forbidden — API key does not have the required scope

# paths./rest/v1/video-channels/{id}/reorder.post.description
Set the display order of a channel’s videos. Send every video id currently in the channel in the order you want them shown — index 0 appears first. A partial list, or an id that is not in the channel, returns 400 so a caller working from a stale view learns it is out of date instead of getting a partial write. Requires scope: videoChannel:update

# paths./rest/v1/video-channels/{id}/reorder.post.requestBody.content.application/json.schema.properties.mediaIds.description
Every video id currently in the channel, in the order you want them shown. Partial lists and ids that are not in the channel are rejected.

# paths./rest/v1/video-channels/{id}/reorder.post.responses.400.description
Bad request — `mediaIds` omitted a video in the channel or included an id that is not in it.

# paths./rest/v1/video-channels/{id}/reorder.post.responses.401.description
Unauthorized — missing, invalid, or expired API key

# paths./rest/v1/video-channels/{id}/reorder.post.responses.403.description
Forbidden — API key does not have the required scope