Opaque page cursor — the cursor query value found inside a prior response's next/previous URL. Normally you never build this yourself: just GET those URLs as-is.
Full URL of the previous page — request it as-is. null = already at the first page.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Usertour documention","colors":{"primary":"#0D9373","light":"#07C983","dark":"#0D9373"},"logo":{"light":"https://mintcdn.com/usertour/fGy2waOqk2YYQ2QK/logo-dark.svg?fit=max\u0026auto=format\u0026n=fGy2waOqk2YYQ2QK\u0026q=85\u0026s=841070ff620cff55401ec69cfc514e27","dark":"https://mintcdn.com/usertour/fGy2waOqk2YYQ2QK/logo-light.svg?fit=max\u0026auto=format\u0026n=fGy2waOqk2YYQ2QK\u0026q=85\u0026s=28f06f1ac3d117bd77837574e801ed7b","href":"https://www.usertour.io/"},"favicon":"https://mintcdn.com/usertour/nYBy6MD0LzNhBLol/images/favicon.png?fit=max\u0026auto=format\u0026n=nYBy6MD0LzNhBLol\u0026q=85\u0026s=2d933e312d87107d569af0615a00225b","api":{"playground":{"display":"simple"}},"navbar":{"links":[{"href":"mailto:support@usertour.io","label":"Support"}]},"footer":{"socials":{"x":"https://x.com/usertourio","github":"https://github.com/usertour/usertour","discord":"https://discord.gg/WPVJPX8fJh"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"usertour","hasAudioNarration":false,"actualSubdomain":"usertour","customDomains":["docs.usertour.io"],"gitSource":{"type":"github","owner":"usertour","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6af2be424ef979744de2e2db","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"API Reference","count":92},{"language":"default","tag":"Endpoints","count":79},{"language":"default","tag":"Documentation","count":49},{"language":"default","tag":"API Reference (v1)","count":37},{"language":"default","tag":"How-to Guides","count":31},{"language":"default","tag":"Usertour.js Reference","count":31},{"language":"default","tag":"Self-Hosting","count":20},{"language":"default","tag":"Content","count":15},{"language":"default","tag":"Users","count":14},{"language":"default","tag":"Companies","count":13}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/themes/list-themes","slug":"/api-reference/themes/list-themes","pageMetadata":{"title":"List themes","description":null,"deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/themes","href":"/api-reference/themes/list-themes","autogeneratedByOpenApi":true},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"List themes","description":null,"deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/themes","href":"/api-reference/themes/list-themes","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"ApiThemesController_list","summary":"List themes","parameters":["80d39b8a-db1d-4a85-91a7-b85fc894887a","0ed4c90c-ba4d-4542-87fb-12ec199e8ab5","7f3a51cd-3e24-436e-a29b-f6bf9d433ba1","06e59a59-cad2-4e3f-a2f8-60c944e57056","f9837f16-2a1a-42ba-a421-789cb72cb6f1","0544f83f-6c75-4395-b937-5936908b1199","7174099d-b411-44cc-806a-44bb274efab0"],"responses":{"200":"296439bd-8b84-4a4f-bb26-1202cb0c80fc","400":"009b9771-6d5c-4ffc-b4ac-cd3e05767848","401":"ce5f61ac-5bc3-4a98-85b4-40f5e4c851b3","403":"8a974a9e-1552-46ae-96be-0dd69fc4777a","429":"ca9f848e-1561-4e2a-b069-0adb4f4431c2"},"tags":["Themes"],"security":["4da889bd-5f8e-42a8-bfbf-ffe7f7c40cd2"],"method":"get","type":"path","servers":["23c31da0-5340-453a-ad80-9d71f43aa3ab"],"path":"/v2/projects/{projectId}/themes","baseUrlOptions":["https://api.usertour.io"],"title":"List themes","description":"","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"80d39b8a-db1d-4a85-91a7-b85fc894887a":{"name":"projectId","required":true,"in":"path","description":"Project ID","schema":{"type":"string","isRequired":true,"description":"Project ID","uniqueKey":"","typeLabel":"string"}},"0ed4c90c-ba4d-4542-87fb-12ec199e8ab5":{"name":"limit","required":false,"in":"query","description":"Max items per page (1-100, default 20).","schema":{"minimum":1,"maximum":100,"default":20,"type":"integer","isRequired":false,"description":"Max items per page (1-100, default 20).","uniqueKey":"","typeLabel":"integer"}},"7f3a51cd-3e24-436e-a29b-f6bf9d433ba1":{"name":"cursor","required":false,"in":"query","description":"Opaque page cursor — the `cursor` query value found inside a prior response's `next`/`previous` URL. Normally you never build this yourself: just GET those URLs as-is.","schema":{"type":"string","isRequired":false,"description":"Opaque page cursor — the `cursor` query value found inside a prior response's `next`/`previous` URL. Normally you never build this yourself: just GET those URLs as-is.","uniqueKey":"","typeLabel":"string"}},"06e59a59-cad2-4e3f-a2f8-60c944e57056":{"name":"name","required":false,"in":"query","description":"Filter by name (case-insensitive substring match).","schema":{"type":"string","isRequired":false,"description":"Filter by name (case-insensitive substring match).","uniqueKey":"","typeLabel":"string"}},"f9837f16-2a1a-42ba-a421-789cb72cb6f1":{"name":"orderBy","required":false,"in":"query","description":"Order by createdAt / -createdAt.","schema":{"oneOf":[{"type":"string","enum":["createdAt","-createdAt"],"description":"Order by createdAt / -createdAt.","uniqueKey":"oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"array","items":{"type":"string","enum":["createdAt","-createdAt"],"uniqueKey":"oneOf.1.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Order by createdAt / -createdAt.","uniqueKey":"oneOf.1","typeLabel":"enum\u003cstring>[]"}],"isRequired":false,"uniqueKey":"","typeLabel":"enum\u003cstring> | enum\u003cstring>[]"}},"0544f83f-6c75-4395-b937-5936908b1199":{"name":"expand","required":false,"in":"query","description":"Inline: settings (stored intent), variations, resolvedSettings (every \"Auto\" resolved).","schema":{"oneOf":[{"type":"string","enum":["settings","variations","resolvedSettings"],"description":"Inline: settings (stored intent), variations, resolvedSettings (every \"Auto\" resolved).","uniqueKey":"oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"array","items":{"type":"string","enum":["settings","variations","resolvedSettings"],"uniqueKey":"oneOf.1.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Inline: settings (stored intent), variations, resolvedSettings (every \"Auto\" resolved).","uniqueKey":"oneOf.1","typeLabel":"enum\u003cstring>[]"}],"isRequired":false,"uniqueKey":"","typeLabel":"enum\u003cstring> | enum\u003cstring>[]"}},"7174099d-b411-44cc-806a-44bb274efab0":{"name":"deleted","required":false,"in":"query","description":"List soft-deleted themes instead of live ones — the recovery pool for restore.","schema":{"enum":["true","false"],"type":"string","isRequired":false,"description":"List soft-deleted themes instead of live ones — the recovery pool for restore.","uniqueKey":"","typeLabel":"enum\u003cstring>"}}},"responses":{"296439bd-8b84-4a4f-bb26-1202cb0c80fc":{"description":"List of themes","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].id","typeLabel":"string"},"object":{"type":"string","enum":["theme"],"isRequired":true,"uniqueKey":"results.items.[INDEX].object","typeLabel":"enum\u003cstring>"},"name":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].name","typeLabel":"string"},"isDefault":{"type":"boolean","isRequired":true,"uniqueKey":"results.items.[INDEX].isDefault","typeLabel":"boolean"},"isSystem":{"type":"boolean","description":"Built-in theme: read-only — it cannot be updated or deleted (duplicating it into your own theme is the way to start from it). It CAN be made the project default.","isRequired":true,"uniqueKey":"results.items.[INDEX].isSystem","typeLabel":"boolean"},"updatedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"results.items.[INDEX].updatedAt","typeLabel":"string\u003cdate-time>"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"results.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"},"variationCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many conditional variations this theme carries (always present, no expand needed). Check it BEFORE pointing content at another theme: variations do NOT travel with the content, so moving from a theme with variations to one with 0 silently drops the conditional styling (e.g. dark mode) for every user those conditions targeted — nothing errors. Read the variations themselves with expand: [\"variations\"].","isRequired":true,"uniqueKey":"results.items.[INDEX].variationCount","typeLabel":"integer"},"settings":{"description":"Stored style INTENT — the same shape as the create/update `settings` body (that write schema is the field dictionary); Auto-capable colors read back as the literal \"Auto\".","type":"object","additionalProperties":{"oneOf":[{}],"uniqueKey":"results.items.[INDEX].settings.additionalProperties","typeLabel":"any"},"uniqueKey":"results.items.[INDEX].settings","typeLabel":"object"},"resolvedSettings":{"description":"Read-only render resolution of `settings` (the shared derivation the SDK runs). Two transformations: every \"Auto\" is replaced by the concrete derived color, and `font.fontFamily` is rewritten to the real font stack (\"System font\" → the system stack, \"Custom font\" → the `customFontFamily` value, named fonts gain a sans-serif fallback). Same field set as `settings` (stored settings are grounded complete at write) — differences between the two are exactly these derivations, so diff against the `settings` you wrote, not this, to find your edits. Request with expand: [\"resolvedSettings\"]. Not writable — author intent in `settings`.","type":"object","additionalProperties":{"oneOf":[{}],"uniqueKey":"results.items.[INDEX].resolvedSettings.additionalProperties","typeLabel":"any"},"uniqueKey":"results.items.[INDEX].resolvedSettings","typeLabel":"object"},"variations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].name","typeLabel":"string"},"conditions":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","match","conditions"],"properties":{"type":{"type":"string","enum":["group"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"match":{"type":"string","enum":["all","any"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.0.match","typeLabel":"enum\u003cstring>"},"conditions":{"minItems":1,"type":"array","items":{"$circularRef":"20a409a8-af11-4100-81e4-cb137f14e394"},"description":"The grouped conditions — at least one. An EMPTY group is not \"no filter\": it never matches, so next to an AND it makes the whole rule unmatchable, and writing one is rejected. A version saved with an empty group in the BUILDER still reads back with it (validate warns); writing that list back is refused until the group is filled or dropped.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.0.conditions","typeLabel":"array"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["type","scope","attribute","op"],"properties":{"type":{"type":"string","enum":["attribute"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"scope":{"type":"string","enum":["user","company","companyMembership"],"description":"Which entity owns the attribute — `user` (the end user), `company`, or `companyMembership`. Same value as the attribute definition's `scope` (see the attribute definitions list); required to disambiguate a codeName that exists in more than one scope.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.scope","typeLabel":"enum\u003cstring>"},"attribute":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.attribute","typeLabel":"string"},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","any","empty","lt","lte","gt","gte","between","true","false","includes_any","includes_all","not_includes_any","not_includes_all","less_than","exactly","more_than","before","on","after"],"description":"Operator — the allowed set depends on the attribute dataType. String: is | not | contains | not_contains | starts_with | ends_with | any | empty. Number: is | not | lt | lte | gt | gte | between | any | empty. Boolean: true | false | any | empty. List: includes_any | includes_all | not_includes_any | not_includes_all | any | empty. DateTime: less_than | exactly | more_than (relative — `value` is a number of days) | before | on | after (`value` is an absolute date) | any | empty. The relative ops are ONE-SIDED bounds around (now − N days): `less_than N` = the date is AFTER now−N — so it also matches every FUTURE date, and on a future-dated attribute (a trial end, a renewal date) it is NOT \"within the last N days\"; `more_than N` = the date is BEFORE now−N. **\"Signed up in the last N days\" therefore needs BOTH bounds** — `less_than N` AND `more_than 0` in one `all` group; `less_than N` alone silently includes anyone whose date is in the future (a mis-mapped trial-end column, a clock/timezone slip), and those are exactly the users a new-user audience must not contain (observed in testing). Negative N shifts the bound into the future: the rolling \"within the NEXT 7 days\" window is `less_than` value \"0\" AND `more_than` value \"-7\" (two conditions, both required). The relative ops are DAY-granularity only — no unit field; for hour/minute windows use an `event` condition with a `within` (which has a `unit`).","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.op","typeLabel":"enum\u003cstring>"},"value":{"description":"The comparison value (string / number-as-string / date). Omit for any/empty/true/false.","type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.value","typeLabel":"string"},"value2":{"description":"Upper bound for the `between` operator (`value` is the lower bound).","type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.value2","typeLabel":"string"},"values":{"description":"Values for the List operators (includes_any / includes_all / …).","type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.values.items.[INDEX]","typeLabel":"string"},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1.values","typeLabel":"string[]"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","required":["type","segment","in"],"properties":{"type":{"type":"string","enum":["segment"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"segment":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.2.segment","typeLabel":"string"},"in":{"type":"boolean","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.2.in","typeLabel":"boolean"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","required":["type","includes"],"properties":{"type":{"type":"string","enum":["current_url"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"includes":{"type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.3.includes.items.[INDEX]","typeLabel":"string"},"description":"URL patterns (anchored whole-url match, NOT substring/regex). `*` = wildcard within one url part; `:name` = one path segment. A bare `*` (i.e. `[\"*\"]`) matches EVERY page on every host incl. deep paths — the canonical always-on / whole-site pattern (use it when content should be available everywhere). Scope it down instead with: `*/` (homepage only — path exactly `/`), `*/pricing` (one page), `*/app/*` (a section + below), `host.com/*` (any page on a specific host). Multiple patterns are OR-matched: the URL matches this list if it matches ANY one pattern (so \"/tasks OR /dashboard\" is one condition with both patterns here — no group needed).","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.3.includes","typeLabel":"string[]"},"excludes":{"description":"URL patterns to exclude (same syntax as includes); excludes win over includes.","type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.3.excludes.items.[INDEX]","typeLabel":"string"},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.3.excludes","typeLabel":"string[]"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","required":["type","state"],"properties":{"type":{"type":"string","enum":["element"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"state":{"type":"string","enum":["present","hidden","disabled","enabled","clicked","unclicked"],"description":"`present` means NOT CLIPPED AWAY: the element is in the DOM and its box lies inside the viewport / its scroll ancestors — scrolled off-screen or `display:none` never satisfies it (and `hidden` is its negation). It is NOT \"the user can see something there\": an EMPTY, zero-height placeholder node satisfies `present` (observed in testing: a checklist task keyed on an initially-empty `\u003cp>` status line ticked itself the moment the checklist appeared, before the shopper did anything). So do not use element presence as a proxy for \"the app has said something\": most apps keep the container mounted and only fill in its text. Match the TEXT instead (`target.text` + `present`, or the negation trick: the old text `hidden`). Appearances shorter than about a second can be missed entirely. `disabled`/`enabled` read the element disabled state at evaluation time. **`clicked` means \"clicked since page load AND the element is STILL in the DOM right now\"** — both halves, re-checked every evaluation. The click memory latches (the listener attaches the FIRST time the condition is evaluated, so earlier clicks are invisible, and the memory survives a re-render), but the element lookup is redone each poll. Two consequences, one of them silent: (1) **an element that UNMOUNTS on click can NEVER satisfy it** — the click lands, the element vanishes, the lookup fails from then on and the condition stays false forever with no error (observed in testing: a tracker on a button that clears its own toolbar counted ZERO real clicks); (2) an element that unmounts and REMOUNTS satisfies it again, so a tracker gated on it fires once per remount — not once per page load. Unlike `present`, this lookup does NOT require viewport visibility: scrolling the target off-screen keeps `clicked` true. `unclicked` negates the same pair, so it is also false while the element is absent. To count a COMPLETED action, condition on what the app shows afterwards (a success toast, a state change) rather than `clicked` on the button that starts it.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4.state","typeLabel":"enum\u003cstring>"},"target":{"type":"object","properties":{"selector":{"type":"string","minLength":1,"description":"A stable CSS selector for the element, on the page or inside a same-origin iframe (written relative to the frame's own document). The runtime targets the FIRST match — so either make the selector unique, or pair a stable non-unique selector with `nth` to pick the intended match. A non-unique selector with no `nth` targets the first (often wrong) element and the tooltip silently won't render.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4.target.selector","typeLabel":"string"},"text":{"description":"Optional refinement of `selector`. Requires the targeted element's visible text to equal this (exact match, after trim) — use it to pin a specific content/state (e.g. a stable id whose displayed text you want to match: id + text). It refines the element chosen by `selector`/`nth`; on its own it does NOT search among multiple matches, so disambiguate a non-unique selector with `nth`, not `text` alone.","type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4.target.text","typeLabel":"string"},"nth":{"description":"Optional refinement of `selector`. 0-based index to pick which match when the selector isn't unique — e.g. a stable selector matching 3 elements + `nth: 1` targets the 2nd, giving a unique result. Matches are taken in document order (as they appear in the page HTML). Range 0–4 — only the first 5 matches are addressable; a larger value is rejected.","type":"integer","minimum":0,"maximum":4,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4.target.nth","typeLabel":"integer"}},"required":["selector"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4.target","typeLabel":"object"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","required":["type","content","state"],"properties":{"type":{"type":"string","enum":["content_state"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"content":{"type":"string","description":"contentId of the FLOW or CHECKLIST whose per-user state to check (an id from the content list). Only flows and checklists record this state — referencing a banner / launcher / resource-center / tracker is rejected at write.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.5.content","typeLabel":"string"},"state":{"type":"string","enum":["seen","unseen","completed","uncompleted","active","inactive"],"description":"The referenced flow/checklist's state for THIS user. seen = started at least once (for a flow, TRUE from the moment it opens; for a checklist, TRUE only once the user EXPANDS the panel — a `initialDisplay: \"button\"` checklist whose launcher is never clicked stays unseen forever); unseen = never started; active = currently open/running; inactive = NOT currently running (covers both never-started and ran-then-closed); completed = reached a goal/completion step; uncompleted = not completed. To gate piece B until flow A has run AND closed (the usual \"show next thing after the welcome flow\" sequencing), use `seen` AND `inactive` together — `seen` alone fires while A is still open (B piles on top), and `completed` alone strands users who skip/dismiss A.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.5.state","typeLabel":"enum\u003cstring>"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","required":["type","event"],"properties":{"type":{"type":"string","enum":["event"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"event":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.event","typeLabel":"string"},"count":{"description":"How many times the event must have occurred. Omit it for the common case \"the event has happened\" (treated as at_least 1). Set `op`/`n` for a threshold (`between` needs `n` and `n2`). `at_least`/`between` require n ≥ 1; use `at_most`/`exactly` with 0 for \"never happened\".","type":"object","properties":{"op":{"type":"string","enum":["at_least","at_most","exactly","between"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.count.op","typeLabel":"enum\u003cstring>"},"n":{"type":"integer","minimum":0,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.count.n","typeLabel":"integer"},"n2":{"type":"integer","minimum":0,"maximum":9007199254740991,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.count.n2","typeLabel":"integer"}},"required":["op","n"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.count","typeLabel":"object"},"within":{"description":"Optional time window for the event count. Omit it (or use `any_time`) to count over all time — \"the event has ever happened\". Any other `op` (`in_the_last` / `more_than` / `between`) requires BOTH `value` and `unit`, and `between` also `value2` — rejected at write otherwise.","type":"object","properties":{"op":{"type":"string","enum":["in_the_last","more_than","between","any_time"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.within.op","typeLabel":"enum\u003cstring>"},"value":{"type":"number","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.within.value","typeLabel":"number"},"value2":{"type":"number","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.within.value2","typeLabel":"number"},"unit":{"type":"string","enum":["seconds","minutes","hours","days"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.within.unit","typeLabel":"enum\u003cstring>"}},"required":["op"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.within","typeLabel":"object"},"scope":{"description":"Whose event activity to count (default `current_user`). `current_user` = only this user's own events. `current_user_in_company` = this user's events, but counted within their currently-associated company context (needs the user associated to a company via `group()` / the company-membership API). `any_user_in_company` = events by ANY user in this user's company — account-level activity (e.g. \"anyone on the account has done X\"). The two company scopes require the user to be in a company or they never match.","type":"string","enum":["current_user","current_user_in_company","any_user_in_company"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.scope","typeLabel":"enum\u003cstring>"},"where":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","attribute","op"],"properties":{"type":{"type":"string","enum":["event_attribute"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"attribute":{"type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.attribute","typeLabel":"string"},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","any","empty","lt","lte","gt","gte","between","true","false","includes_any","includes_all","not_includes_any","not_includes_all","less_than","exactly","more_than","before","on","after"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.value","typeLabel":"string"},"value2":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.value2","typeLabel":"string"},"values":{"type":"array","items":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.values.items.[INDEX]","typeLabel":"string"},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0.values","typeLabel":"string[]"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["type","match","conditions"],"properties":{"type":{"type":"string","enum":["group"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"match":{"type":"string","enum":["all","any"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.1.match","typeLabel":"enum\u003cstring>"},"conditions":{"minItems":1,"type":"array","items":{"$circularRef":"e0d49201-157d-4c7c-8083-63604d7aea93"},"description":"The grouped conditions — at least one. An EMPTY group is not \"no filter\": it never matches, so next to an AND it makes the whole rule unmatchable, and writing one is rejected. A version saved with an empty group in the BUILDER still reads back with it (validate warns); writing that list back is refused until the group is filled or dropped.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.1.conditions","typeLabel":"array"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where.items.[INDEX]","typeLabel":"object"},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6.where","typeLabel":"object[]"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.6","typeLabel":"object"},{"type":"object","required":["type","op"],"properties":{"type":{"type":"string","enum":["text_input"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.type","typeLabel":"enum\u003cstring>"},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","match","unmatch","any","empty"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.op","typeLabel":"enum\u003cstring>"},"target":{"type":"object","properties":{"selector":{"type":"string","minLength":1,"description":"A stable CSS selector for the element, on the page or inside a same-origin iframe (written relative to the frame's own document). The runtime targets the FIRST match — so either make the selector unique, or pair a stable non-unique selector with `nth` to pick the intended match. A non-unique selector with no `nth` targets the first (often wrong) element and the tooltip silently won't render.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.target.selector","typeLabel":"string"},"text":{"description":"Optional refinement of `selector`. Requires the targeted element's visible text to equal this (exact match, after trim) — use it to pin a specific content/state (e.g. a stable id whose displayed text you want to match: id + text). It refines the element chosen by `selector`/`nth`; on its own it does NOT search among multiple matches, so disambiguate a non-unique selector with `nth`, not `text` alone.","type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.target.text","typeLabel":"string"},"nth":{"description":"Optional refinement of `selector`. 0-based index to pick which match when the selector isn't unique — e.g. a stable selector matching 3 elements + `nth: 1` targets the 2nd, giving a unique result. Matches are taken in document order (as they appear in the page HTML). Range 0–4 — only the first 5 matches are addressable; a larger value is rejected.","type":"integer","minimum":0,"maximum":4,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.target.nth","typeLabel":"integer"}},"required":["selector"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.target","typeLabel":"object"},"value":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7.value","typeLabel":"string"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.7","typeLabel":"object"},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["text_filled"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.8.type","typeLabel":"enum\u003cstring>"},"target":{"type":"object","properties":{"selector":{"type":"string","minLength":1,"description":"A stable CSS selector for the element, on the page or inside a same-origin iframe (written relative to the frame's own document). The runtime targets the FIRST match — so either make the selector unique, or pair a stable non-unique selector with `nth` to pick the intended match. A non-unique selector with no `nth` targets the first (often wrong) element and the tooltip silently won't render.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.8.target.selector","typeLabel":"string"},"text":{"description":"Optional refinement of `selector`. Requires the targeted element's visible text to equal this (exact match, after trim) — use it to pin a specific content/state (e.g. a stable id whose displayed text you want to match: id + text). It refines the element chosen by `selector`/`nth`; on its own it does NOT search among multiple matches, so disambiguate a non-unique selector with `nth`, not `text` alone.","type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.8.target.text","typeLabel":"string"},"nth":{"description":"Optional refinement of `selector`. 0-based index to pick which match when the selector isn't unique — e.g. a stable selector matching 3 elements + `nth: 1` targets the 2nd, giving a unique result. Matches are taken in document order (as they appear in the page HTML). Range 0–4 — only the first 5 matches are addressable; a larger value is rejected.","type":"integer","minimum":0,"maximum":4,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.8.target.nth","typeLabel":"integer"}},"required":["selector"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.8.target","typeLabel":"object"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.8","typeLabel":"object"},{"type":"object","required":["type","start"],"properties":{"type":{"type":"string","enum":["time_window"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.9.type","typeLabel":"enum\u003cstring>"},"start":{"type":"string","description":"Window start (ISO datetime). REQUIRED — the runtime never matches a window without a start, so an end-only window is rejected at write. For \"until X\" semantics, set start to any past instant and end to X.","isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.9.start","typeLabel":"string"},"end":{"description":"Window end (ISO datetime). Omit for an open-ended \"from start onwards\" window.","type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.9.end","typeLabel":"string"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.9","typeLabel":"object"},{"type":"object","description":"Read-side placeholder for a stored condition this API cannot express (`note` says what it stands for — usually a DEAD condition the runtime never matches: a deleted attribute/event, an end-only time window). It cannot be written back (the placeholder carries no data to preserve): echoing it is rejected. Either remove it from the list you write — an explicit choice that DELETES the stored condition; mind that a never-matching node inside an AND list pins the whole rule to \"never fires\", so deleting it can bring the remaining conditions to life — or repair the original condition in the Usertour builder first.","required":["type"],"properties":{"type":{"type":"string","enum":["unsupported"],"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.10.type","typeLabel":"enum\u003cstring>"},"note":{"type":"string","uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.10.note","typeLabel":"string"}},"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX].oneOf.10","typeLabel":"object"}],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].conditions","typeLabel":"object[]"},"settings":{"type":"object","additionalProperties":{"oneOf":[{}],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].settings.additionalProperties","typeLabel":"any"},"isRequired":true,"uniqueKey":"results.items.[INDEX].variations.items.[INDEX].settings","typeLabel":"object"}},"required":["id","name","conditions","settings"],"uniqueKey":"results.items.[INDEX].variations.items.[INDEX]","typeLabel":"object"},"uniqueKey":"results.items.[INDEX].variations","typeLabel":"object[]"}},"required":["id","object","name","isDefault","isSystem","updatedAt","createdAt","variationCount"],"uniqueKey":"results.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"results","typeLabel":"object[]"},"next":{"oneOf":[{"type":"string","description":"Full URL of the next page — request it as-is (it already carries `cursor=` and your query parameters). null = no further pages.","isRequired":true,"uniqueKey":"next.oneOf.0","typeLabel":"string"},{"type":"null","description":"Full URL of the next page — request it as-is (it already carries `cursor=` and your query parameters). null = no further pages.","isRequired":true,"uniqueKey":"next.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"next","typeLabel":"string | null"},"previous":{"oneOf":[{"type":"string","description":"Full URL of the previous page — request it as-is. null = already at the first page.","isRequired":true,"uniqueKey":"previous.oneOf.0","typeLabel":"string"},{"type":"null","description":"Full URL of the previous page — request it as-is. null = already at the first page.","isRequired":true,"uniqueKey":"previous.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"previous","typeLabel":"string | null"}},"required":["results","next","previous"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"results":[{"id":"\u003cstring>","object":"theme","name":"\u003cstring>","isDefault":true,"isSystem":true,"updatedAt":"2023-11-07T05:31:56Z","createdAt":"2023-11-07T05:31:56Z","variationCount":0,"settings":{},"resolvedSettings":{},"variations":[{"id":"\u003cstring>","name":"\u003cstring>","conditions":[{"type":"group","match":"all","conditions":"\u003carray>"}],"settings":{}}]}],"next":"\u003cstring>","previous":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"009b9771-6d5c-4ffc-b4ac-cd3e05767848":{"description":"Invalid request — E1017 validation (may carry `issues`; an invalid orderBy/limit is also E1017), E1015 invalid scope, E0003 invalid against current domain state.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code (e.g. E1017). Match on this, never on `message`.","uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable summary. Wording may change between releases.","uniqueKey":"error.message","typeLabel":"string"},"issues":{"description":"Validation errors (E1017) may carry one entry per problem so every field can be fixed in a single round-trip. Absent on other errors.","type":"array","items":{"type":"object","properties":{"rule":{"type":"string","description":"Which validation layer rejected it: schema | reactive_condition | action_not_allowed | step_shape | reference_target | auto_start | media_url | destination_url. New values may be added; treat an unknown value as a generic validation failure.","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].rule","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].message","typeLabel":"string"},"path":{"description":"Path into the request body (e.g. `steps[0].triggers[0].when[1]`).","type":"string","uniqueKey":"error.issues.items.[INDEX].path","typeLabel":"string"}},"required":["rule","message"],"uniqueKey":"error.issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.issues","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Base URL of the API documentation.","uniqueKey":"error.doc_url","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","issues":[{"rule":"\u003cstring>","message":"\u003cstring>","path":"\u003cstring>"}],"doc_url":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"ce5f61ac-5bc3-4a98-85b4-40f5e4c851b3":{"description":"Missing or expired API key — E1010, E1020.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code (e.g. E1017). Match on this, never on `message`.","uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable summary. Wording may change between releases.","uniqueKey":"error.message","typeLabel":"string"},"issues":{"description":"Validation errors (E1017) may carry one entry per problem so every field can be fixed in a single round-trip. Absent on other errors.","type":"array","items":{"type":"object","properties":{"rule":{"type":"string","description":"Which validation layer rejected it: schema | reactive_condition | action_not_allowed | step_shape | reference_target | auto_start | media_url | destination_url. New values may be added; treat an unknown value as a generic validation failure.","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].rule","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].message","typeLabel":"string"},"path":{"description":"Path into the request body (e.g. `steps[0].triggers[0].when[1]`).","type":"string","uniqueKey":"error.issues.items.[INDEX].path","typeLabel":"string"}},"required":["rule","message"],"uniqueKey":"error.issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.issues","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Base URL of the API documentation.","uniqueKey":"error.doc_url","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","issues":[{"rule":"\u003cstring>","message":"\u003cstring>","path":"\u003cstring>"}],"doc_url":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"8a974a9e-1552-46ae-96be-0dd69fc4777a":{"description":"Refused — E1000 invalid key, E1011 project not in token scope, E1012 insufficient scope, E1029 environment not in token scope, E1032 environment creation needs a token without env-targeted capabilities (its allowlist cannot cover a not-yet-existing environment), E0043 the project's plan does not include the feature (e.g. webhooks require a paid plan on cloud).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code (e.g. E1017). Match on this, never on `message`.","uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable summary. Wording may change between releases.","uniqueKey":"error.message","typeLabel":"string"},"issues":{"description":"Validation errors (E1017) may carry one entry per problem so every field can be fixed in a single round-trip. Absent on other errors.","type":"array","items":{"type":"object","properties":{"rule":{"type":"string","description":"Which validation layer rejected it: schema | reactive_condition | action_not_allowed | step_shape | reference_target | auto_start | media_url | destination_url. New values may be added; treat an unknown value as a generic validation failure.","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].rule","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].message","typeLabel":"string"},"path":{"description":"Path into the request body (e.g. `steps[0].triggers[0].when[1]`).","type":"string","uniqueKey":"error.issues.items.[INDEX].path","typeLabel":"string"}},"required":["rule","message"],"uniqueKey":"error.issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.issues","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Base URL of the API documentation.","uniqueKey":"error.doc_url","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","issues":[{"rule":"\u003cstring>","message":"\u003cstring>","path":"\u003cstring>"}],"doc_url":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"ca9f848e-1561-4e2a-b069-0adb4f4431c2":{"description":"Rate limit exceeded — E1013. The limit follows the project's plan (100/500/1000/3000 requests per minute); unknown credentials share a per-IP bucket. Every response also carries X-RateLimit-Limit / -Remaining / -Reset for pacing; a 429 adds the standard Retry-After header (seconds to back off).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable code (e.g. E1017). Match on this, never on `message`.","uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable summary. Wording may change between releases.","uniqueKey":"error.message","typeLabel":"string"},"issues":{"description":"Validation errors (E1017) may carry one entry per problem so every field can be fixed in a single round-trip. Absent on other errors.","type":"array","items":{"type":"object","properties":{"rule":{"type":"string","description":"Which validation layer rejected it: schema | reactive_condition | action_not_allowed | step_shape | reference_target | auto_start | media_url | destination_url. New values may be added; treat an unknown value as a generic validation failure.","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].rule","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.issues.items.[INDEX].message","typeLabel":"string"},"path":{"description":"Path into the request body (e.g. `steps[0].triggers[0].when[1]`).","type":"string","uniqueKey":"error.issues.items.[INDEX].path","typeLabel":"string"}},"required":["rule","message"],"uniqueKey":"error.issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.issues","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Base URL of the API documentation.","uniqueKey":"error.doc_url","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>","issues":[{"rule":"\u003cstring>","message":"\u003cstring>","path":"\u003cstring>"}],"doc_url":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"4da889bd-5f8e-42a8-bfbf-ffe7f7c40cd2":{"bearer":{"scheme":"bearer","bearerFormat":"utp_... personal API token (opaque)","type":"http","scopes":[],"schemeName":"bearer"}}},"servers":{"23c31da0-5340-453a-ad80-9d71f43aa3ab":{"url":"https://api.usertour.io"}},"schemas":{"20a409a8-af11-4100-81e4-cb137f14e394":{"oneOf":[{"type":"object","required":["type","match","conditions"],"properties":{"type":{"type":"string","enum":["group"],"isRequired":true},"match":{"type":"string","enum":["all","any"],"isRequired":true},"conditions":{"minItems":1,"type":"array","items":{"$circularRef":"20a409a8-af11-4100-81e4-cb137f14e394"},"description":"The grouped conditions — at least one. An EMPTY group is not \"no filter\": it never matches, so next to an AND it makes the whole rule unmatchable, and writing one is rejected. A version saved with an empty group in the BUILDER still reads back with it (validate warns); writing that list back is refused until the group is filled or dropped.","isRequired":true}}},{"type":"object","required":["type","scope","attribute","op"],"properties":{"type":{"type":"string","enum":["attribute"],"isRequired":true},"scope":{"type":"string","enum":["user","company","companyMembership"],"description":"Which entity owns the attribute — `user` (the end user), `company`, or `companyMembership`. Same value as the attribute definition's `scope` (see the attribute definitions list); required to disambiguate a codeName that exists in more than one scope.","isRequired":true},"attribute":{"type":"string","isRequired":true},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","any","empty","lt","lte","gt","gte","between","true","false","includes_any","includes_all","not_includes_any","not_includes_all","less_than","exactly","more_than","before","on","after"],"description":"Operator — the allowed set depends on the attribute dataType. String: is | not | contains | not_contains | starts_with | ends_with | any | empty. Number: is | not | lt | lte | gt | gte | between | any | empty. Boolean: true | false | any | empty. List: includes_any | includes_all | not_includes_any | not_includes_all | any | empty. DateTime: less_than | exactly | more_than (relative — `value` is a number of days) | before | on | after (`value` is an absolute date) | any | empty. The relative ops are ONE-SIDED bounds around (now − N days): `less_than N` = the date is AFTER now−N — so it also matches every FUTURE date, and on a future-dated attribute (a trial end, a renewal date) it is NOT \"within the last N days\"; `more_than N` = the date is BEFORE now−N. **\"Signed up in the last N days\" therefore needs BOTH bounds** — `less_than N` AND `more_than 0` in one `all` group; `less_than N` alone silently includes anyone whose date is in the future (a mis-mapped trial-end column, a clock/timezone slip), and those are exactly the users a new-user audience must not contain (observed in testing). Negative N shifts the bound into the future: the rolling \"within the NEXT 7 days\" window is `less_than` value \"0\" AND `more_than` value \"-7\" (two conditions, both required). The relative ops are DAY-granularity only — no unit field; for hour/minute windows use an `event` condition with a `within` (which has a `unit`).","isRequired":true},"value":{"description":"The comparison value (string / number-as-string / date). Omit for any/empty/true/false.","type":"string"},"value2":{"description":"Upper bound for the `between` operator (`value` is the lower bound).","type":"string"},"values":{"description":"Values for the List operators (includes_any / includes_all / …).","type":"array","items":{"type":"string"}}}},{"type":"object","required":["type","segment","in"],"properties":{"type":{"type":"string","enum":["segment"],"isRequired":true},"segment":{"type":"string","isRequired":true},"in":{"type":"boolean","isRequired":true}}},{"type":"object","required":["type","includes"],"properties":{"type":{"type":"string","enum":["current_url"],"isRequired":true},"includes":{"type":"array","items":{"type":"string"},"description":"URL patterns (anchored whole-url match, NOT substring/regex). `*` = wildcard within one url part; `:name` = one path segment. A bare `*` (i.e. `[\"*\"]`) matches EVERY page on every host incl. deep paths — the canonical always-on / whole-site pattern (use it when content should be available everywhere). Scope it down instead with: `*/` (homepage only — path exactly `/`), `*/pricing` (one page), `*/app/*` (a section + below), `host.com/*` (any page on a specific host). Multiple patterns are OR-matched: the URL matches this list if it matches ANY one pattern (so \"/tasks OR /dashboard\" is one condition with both patterns here — no group needed).","isRequired":true},"excludes":{"description":"URL patterns to exclude (same syntax as includes); excludes win over includes.","type":"array","items":{"type":"string"}}}},{"type":"object","required":["type","state"],"properties":{"type":{"type":"string","enum":["element"],"isRequired":true},"state":{"type":"string","enum":["present","hidden","disabled","enabled","clicked","unclicked"],"description":"`present` means NOT CLIPPED AWAY: the element is in the DOM and its box lies inside the viewport / its scroll ancestors — scrolled off-screen or `display:none` never satisfies it (and `hidden` is its negation). It is NOT \"the user can see something there\": an EMPTY, zero-height placeholder node satisfies `present` (observed in testing: a checklist task keyed on an initially-empty `\u003cp>` status line ticked itself the moment the checklist appeared, before the shopper did anything). So do not use element presence as a proxy for \"the app has said something\": most apps keep the container mounted and only fill in its text. Match the TEXT instead (`target.text` + `present`, or the negation trick: the old text `hidden`). Appearances shorter than about a second can be missed entirely. `disabled`/`enabled` read the element disabled state at evaluation time. **`clicked` means \"clicked since page load AND the element is STILL in the DOM right now\"** — both halves, re-checked every evaluation. The click memory latches (the listener attaches the FIRST time the condition is evaluated, so earlier clicks are invisible, and the memory survives a re-render), but the element lookup is redone each poll. Two consequences, one of them silent: (1) **an element that UNMOUNTS on click can NEVER satisfy it** — the click lands, the element vanishes, the lookup fails from then on and the condition stays false forever with no error (observed in testing: a tracker on a button that clears its own toolbar counted ZERO real clicks); (2) an element that unmounts and REMOUNTS satisfies it again, so a tracker gated on it fires once per remount — not once per page load. Unlike `present`, this lookup does NOT require viewport visibility: scrolling the target off-screen keeps `clicked` true. `unclicked` negates the same pair, so it is also false while the element is absent. To count a COMPLETED action, condition on what the app shows afterwards (a success toast, a state change) rather than `clicked` on the button that starts it.","isRequired":true},"target":{"type":"object","properties":{"selector":{"type":"string","minLength":1,"description":"A stable CSS selector for the element, on the page or inside a same-origin iframe (written relative to the frame's own document). The runtime targets the FIRST match — so either make the selector unique, or pair a stable non-unique selector with `nth` to pick the intended match. A non-unique selector with no `nth` targets the first (often wrong) element and the tooltip silently won't render.","isRequired":true},"text":{"description":"Optional refinement of `selector`. Requires the targeted element's visible text to equal this (exact match, after trim) — use it to pin a specific content/state (e.g. a stable id whose displayed text you want to match: id + text). It refines the element chosen by `selector`/`nth`; on its own it does NOT search among multiple matches, so disambiguate a non-unique selector with `nth`, not `text` alone.","type":"string"},"nth":{"description":"Optional refinement of `selector`. 0-based index to pick which match when the selector isn't unique — e.g. a stable selector matching 3 elements + `nth: 1` targets the 2nd, giving a unique result. Matches are taken in document order (as they appear in the page HTML). Range 0–4 — only the first 5 matches are addressable; a larger value is rejected.","type":"integer","minimum":0,"maximum":4}},"required":["selector"]}}},{"type":"object","required":["type","content","state"],"properties":{"type":{"type":"string","enum":["content_state"],"isRequired":true},"content":{"type":"string","description":"contentId of the FLOW or CHECKLIST whose per-user state to check (an id from the content list). Only flows and checklists record this state — referencing a banner / launcher / resource-center / tracker is rejected at write.","isRequired":true},"state":{"type":"string","enum":["seen","unseen","completed","uncompleted","active","inactive"],"description":"The referenced flow/checklist's state for THIS user. seen = started at least once (for a flow, TRUE from the moment it opens; for a checklist, TRUE only once the user EXPANDS the panel — a `initialDisplay: \"button\"` checklist whose launcher is never clicked stays unseen forever); unseen = never started; active = currently open/running; inactive = NOT currently running (covers both never-started and ran-then-closed); completed = reached a goal/completion step; uncompleted = not completed. To gate piece B until flow A has run AND closed (the usual \"show next thing after the welcome flow\" sequencing), use `seen` AND `inactive` together — `seen` alone fires while A is still open (B piles on top), and `completed` alone strands users who skip/dismiss A.","isRequired":true}}},{"type":"object","required":["type","event"],"properties":{"type":{"type":"string","enum":["event"],"isRequired":true},"event":{"type":"string","isRequired":true},"count":{"description":"How many times the event must have occurred. Omit it for the common case \"the event has happened\" (treated as at_least 1). Set `op`/`n` for a threshold (`between` needs `n` and `n2`). `at_least`/`between` require n ≥ 1; use `at_most`/`exactly` with 0 for \"never happened\".","type":"object","properties":{"op":{"type":"string","enum":["at_least","at_most","exactly","between"],"isRequired":true},"n":{"type":"integer","minimum":0,"maximum":9007199254740991,"isRequired":true},"n2":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["op","n"]},"within":{"description":"Optional time window for the event count. Omit it (or use `any_time`) to count over all time — \"the event has ever happened\". Any other `op` (`in_the_last` / `more_than` / `between`) requires BOTH `value` and `unit`, and `between` also `value2` — rejected at write otherwise.","type":"object","properties":{"op":{"type":"string","enum":["in_the_last","more_than","between","any_time"],"isRequired":true},"value":{"type":"number"},"value2":{"type":"number"},"unit":{"type":"string","enum":["seconds","minutes","hours","days"]}},"required":["op"]},"scope":{"description":"Whose event activity to count (default `current_user`). `current_user` = only this user's own events. `current_user_in_company` = this user's events, but counted within their currently-associated company context (needs the user associated to a company via `group()` / the company-membership API). `any_user_in_company` = events by ANY user in this user's company — account-level activity (e.g. \"anyone on the account has done X\"). The two company scopes require the user to be in a company or they never match.","type":"string","enum":["current_user","current_user_in_company","any_user_in_company"]},"where":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","attribute","op"],"properties":{"type":{"type":"string","enum":["event_attribute"],"isRequired":true},"attribute":{"type":"string","isRequired":true},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","any","empty","lt","lte","gt","gte","between","true","false","includes_any","includes_all","not_includes_any","not_includes_all","less_than","exactly","more_than","before","on","after"],"isRequired":true},"value":{"type":"string"},"value2":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},{"type":"object","required":["type","match","conditions"],"properties":{"type":{"type":"string","enum":["group"],"isRequired":true},"match":{"type":"string","enum":["all","any"],"isRequired":true},"conditions":{"minItems":1,"type":"array","items":{"$circularRef":"e0d49201-157d-4c7c-8083-63604d7aea93"},"description":"The grouped conditions — at least one. An EMPTY group is not \"no filter\": it never matches, so next to an AND it makes the whole rule unmatchable, and writing one is rejected. A version saved with an empty group in the BUILDER still reads back with it (validate warns); writing that list back is refused until the group is filled or dropped.","isRequired":true}}}]}}}},{"type":"object","required":["type","op"],"properties":{"type":{"type":"string","enum":["text_input"],"isRequired":true},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","match","unmatch","any","empty"],"isRequired":true},"target":{"type":"object","properties":{"selector":{"type":"string","minLength":1,"description":"A stable CSS selector for the element, on the page or inside a same-origin iframe (written relative to the frame's own document). The runtime targets the FIRST match — so either make the selector unique, or pair a stable non-unique selector with `nth` to pick the intended match. A non-unique selector with no `nth` targets the first (often wrong) element and the tooltip silently won't render.","isRequired":true},"text":{"description":"Optional refinement of `selector`. Requires the targeted element's visible text to equal this (exact match, after trim) — use it to pin a specific content/state (e.g. a stable id whose displayed text you want to match: id + text). It refines the element chosen by `selector`/`nth`; on its own it does NOT search among multiple matches, so disambiguate a non-unique selector with `nth`, not `text` alone.","type":"string"},"nth":{"description":"Optional refinement of `selector`. 0-based index to pick which match when the selector isn't unique — e.g. a stable selector matching 3 elements + `nth: 1` targets the 2nd, giving a unique result. Matches are taken in document order (as they appear in the page HTML). Range 0–4 — only the first 5 matches are addressable; a larger value is rejected.","type":"integer","minimum":0,"maximum":4}},"required":["selector"]},"value":{"type":"string"}}},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["text_filled"],"isRequired":true},"target":{"type":"object","properties":{"selector":{"type":"string","minLength":1,"description":"A stable CSS selector for the element, on the page or inside a same-origin iframe (written relative to the frame's own document). The runtime targets the FIRST match — so either make the selector unique, or pair a stable non-unique selector with `nth` to pick the intended match. A non-unique selector with no `nth` targets the first (often wrong) element and the tooltip silently won't render.","isRequired":true},"text":{"description":"Optional refinement of `selector`. Requires the targeted element's visible text to equal this (exact match, after trim) — use it to pin a specific content/state (e.g. a stable id whose displayed text you want to match: id + text). It refines the element chosen by `selector`/`nth`; on its own it does NOT search among multiple matches, so disambiguate a non-unique selector with `nth`, not `text` alone.","type":"string"},"nth":{"description":"Optional refinement of `selector`. 0-based index to pick which match when the selector isn't unique — e.g. a stable selector matching 3 elements + `nth: 1` targets the 2nd, giving a unique result. Matches are taken in document order (as they appear in the page HTML). Range 0–4 — only the first 5 matches are addressable; a larger value is rejected.","type":"integer","minimum":0,"maximum":4}},"required":["selector"]}}},{"type":"object","required":["type","start"],"properties":{"type":{"type":"string","enum":["time_window"],"isRequired":true},"start":{"type":"string","description":"Window start (ISO datetime). REQUIRED — the runtime never matches a window without a start, so an end-only window is rejected at write. For \"until X\" semantics, set start to any past instant and end to X.","isRequired":true},"end":{"description":"Window end (ISO datetime). Omit for an open-ended \"from start onwards\" window.","type":"string"}}},{"type":"object","description":"Read-side placeholder for a stored condition this API cannot express (`note` says what it stands for — usually a DEAD condition the runtime never matches: a deleted attribute/event, an end-only time window). It cannot be written back (the placeholder carries no data to preserve): echoing it is rejected. Either remove it from the list you write — an explicit choice that DELETES the stored condition; mind that a never-matching node inside an AND list pins the whole rule to \"never fires\", so deleting it can bring the remaining conditions to life — or repair the original condition in the Usertour builder first.","required":["type"],"properties":{"type":{"type":"string","enum":["unsupported"],"isRequired":true},"note":{"type":"string"}}}]},"e0d49201-157d-4c7c-8083-63604d7aea93":{"oneOf":[{"type":"object","required":["type","attribute","op"],"properties":{"type":{"type":"string","enum":["event_attribute"],"isRequired":true},"attribute":{"type":"string","isRequired":true},"op":{"type":"string","enum":["is","not","contains","not_contains","starts_with","ends_with","any","empty","lt","lte","gt","gte","between","true","false","includes_any","includes_all","not_includes_any","not_includes_all","less_than","exactly","more_than","before","on","after"],"isRequired":true},"value":{"type":"string"},"value2":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}}},{"type":"object","required":["type","match","conditions"],"properties":{"type":{"type":"string","enum":["group"],"isRequired":true},"match":{"type":"string","enum":["all","any"],"isRequired":true},"conditions":{"minItems":1,"type":"array","items":{"$circularRef":"e0d49201-157d-4c7c-8083-63604d7aea93"},"description":"The grouped conditions — at least one. An EMPTY group is not \"no filter\": it never matches, so next to an AND it makes the whole rule unmatchable, and writing one is rejected. A version saved with an empty group in the BUILDER still reads back with it (validate warns); writing that list back is refused until the group is filled or dropped.","isRequired":true}}}]}},"processedSecurityOptions":[{"schemes":[{"scheme":{"scheme":"bearer","bearerFormat":"utp_... personal API token (opaque)","type":"http","scopes":[],"schemeName":"bearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearer","name":"Authorization"}],"title":"bearer"}]},"originalFileLocation":"api-reference-v2/openapi.json"},"subdomain":"usertour","siteName":"Usertour documention","title":"List themes - Usertour documention","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-10T06:48:43.787Z","originalFileLocation":"api-reference/themes/list-themes.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Usertour documention\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"List themes - Usertour documention\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Usertour documention\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.usertour.io/api-reference/themes/list-themes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://usertour.mintlify.site/_mintlify/api/og/v2?division=Themes\u0026amp;title=List+themes\u0026amp;theme=51092ed6781dc62f07a52a12\u0026amp;signature=6f31498f397f05dfee9ded421cd08b91f59a79e71921c8b49259259019ccde1a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"List themes - Usertour documention\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://usertour.mintlify.site/_mintlify/api/og/v2?division=Themes\u0026amp;title=List+themes\u0026amp;theme=51092ed6781dc62f07a52a12\u0026amp;signature=6f31498f397f05dfee9ded421cd08b91f59a79e71921c8b49259259019ccde1a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/usertour/vM2wRfIVfuMnzscJ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Usertour documention\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D9373\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.usertour.io/api-reference/themes/list-themes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/themes/list-themes.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.usertour.io/#organization\",\"name\":\"Usertour documention\",\"url\":\"https://docs.usertour.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/usertour/fGy2waOqk2YYQ2QK/logo-dark.svg?fit=max\u0026auto=format\u0026n=fGy2waOqk2YYQ2QK\u0026q=85\u0026s=841070ff620cff55401ec69cfc514e27\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.usertour.io#website\",\"name\":\"Usertour documention\",\"url\":\"https://docs.usertour.io\",\"publisher\":{\"@id\":\"https://docs.usertour.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.usertour.io/api-reference/themes/list-themes#webpage\",\"url\":\"https://docs.usertour.io/api-reference/themes/list-themes\",\"name\":\"List themes\",\"dateModified\":\"2026-11-10T06:48:43.787Z\",\"isPartOf\":{\"@id\":\"https://docs.usertour.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.usertour.io/api-reference/themes/list-themes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.usertour.io/api-reference/themes/list-themes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.usertour.io/api-reference/analytics/get-content-analytics\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"List themes\",\"item\":\"https://docs.usertour.io/api-reference/themes/list-themes\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.usertour.io/api-reference/themes/list-themes#apireference\",\"headline\":\"List themes\",\"name\":\"List themes\",\"url\":\"https://docs.usertour.io/api-reference/themes/list-themes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.usertour.io/api-reference/themes/list-themes#webpage\"},\"dateModified\":\"2026-11-10T06:48:43.787Z\",\"publisher\":{\"@id\":\"https://docs.usertour.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.usertour.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Usertour documention\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Usertour documention\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/themes/list-themes.md","siteName":"Usertour documention","nav":{"global":null,"anchors":[{"anchor":"Documentation","icon":"book-open","pages":[{"title":"Documentation","href":"/build-onboarding-with-ai"}]},{"anchor":"Usertour.js Reference","icon":"connectdevelop","pages":[{"title":"Usertour.js Reference","href":"/developers/usertourjs-reference/overview"}]},{"anchor":"API Reference","icon":"terminal","groups":[{"group":"Getting started","pages":[{"title":"Introduction","href":"/api-reference-v2/introduction"},{"title":"Authentication","href":"/api-reference-v2/authentication"},{"title":"Errors","href":"/api-reference-v2/errors"},{"title":"MCP server","href":"/api-reference-v2/mcp"}]},{"group":"Conventions","pages":[{"title":"Pagination","href":"/api-reference-v2/pagination"},{"title":"Ordering","href":"/api-reference-v2/ordering"},{"title":"Expanding objects","href":"/api-reference-v2/expanding-objects"},{"title":"Attributes","href":"/api-reference-v2/attributes"}]},{"group":"Concepts","pages":[{"title":"Content representation","href":"/api-reference-v2/content-representation"},{"title":"Blocks","href":"/api-reference-v2/blocks"},{"title":"Conditions \u0026 actions","href":"/api-reference-v2/conditions-and-actions"},{"title":"Start, hide \u0026 trigger rules","href":"/api-reference-v2/rules"},{"title":"Type-specific data","href":"/api-reference-v2/type-data"}]},{"group":"Endpoints","pages":[{"group":"Analytics","pages":[{"title":"Get content analytics","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{id}/analytics","href":"/api-reference/analytics/get-content-analytics"},{"title":"Get question analytics","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{id}/analytics/questions","href":"/api-reference/analytics/get-question-analytics"}]},{"group":"Content","pages":[{"title":"List content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content","href":"/api-reference/content/list-content"},{"title":"Create content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content","href":"/api-reference/content/create-content"},{"title":"Get content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{id}","href":"/api-reference/content/get-content"},{"title":"Delete content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/content/{id}","href":"/api-reference/content/delete-content"},{"title":"Update content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/content/{id}","href":"/api-reference/content/update-content"},{"title":"Restore deleted content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content/{id}/restore","href":"/api-reference/content/restore-deleted-content"},{"title":"Duplicate content","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content/{id}/duplicate","href":"/api-reference/content/duplicate-content"},{"title":"Publish a version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content/{id}/publish","href":"/api-reference/content/publish-a-version"},{"title":"Unpublish a version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content/{id}/unpublish","href":"/api-reference/content/unpublish-a-version"}]},{"group":"Content versions","pages":[{"title":"List content versions","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{contentId}/versions","href":"/api-reference/content-versions/list-content-versions"},{"title":"Create a content version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content/{contentId}/versions","href":"/api-reference/content-versions/create-a-content-version"},{"title":"Get a content version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{contentId}/versions/{id}","href":"/api-reference/content-versions/get-a-content-version"},{"title":"Update a content version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/content/{contentId}/versions/{id}","href":"/api-reference/content-versions/update-a-content-version"},{"title":"Validate a content version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{contentId}/versions/{id}/validate","href":"/api-reference/content-versions/validate-a-content-version"},{"title":"Restore a content version","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/content/{contentId}/versions/{id}/restore","href":"/api-reference/content-versions/restore-a-content-version"},{"title":"Get a translation","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/content/{contentId}/versions/{versionId}/localizations/{code}","href":"/api-reference/content-versions/get-a-translation"},{"title":"Update a translation","description":"Write translations by unit path and/or switch delivery on or off. Only an editable draft accepts translations — fork a published version first (the fork carries every translation with it). Translations merge onto the stored ones server-side; the response is the full translation as now stored. The `code` is one of the project's non-default locales — see List localizations.","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json put /v2/projects/{projectId}/content/{contentId}/versions/{versionId}/localizations/{code}","href":"/api-reference/content-versions/update-a-translation"}]},{"group":"Themes","pages":[{"title":"List themes","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/themes","href":"/api-reference/themes/list-themes"},{"title":"Create a theme","description":null,"deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/themes","href":"/api-reference/themes/create-a-theme"},{"title":"Get a theme","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/themes/{id}","href":"/api-reference/themes/get-a-theme"},{"title":"Delete a theme","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/themes/{id}","href":"/api-reference/themes/delete-a-theme"},{"title":"Update a theme","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/themes/{id}","href":"/api-reference/themes/update-a-theme"},{"title":"Duplicate a theme","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/themes/{id}/duplicate","href":"/api-reference/themes/duplicate-a-theme"},{"title":"Restore a deleted theme","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/themes/{id}/restore","href":"/api-reference/themes/restore-a-deleted-theme"}]},{"group":"Users","pages":[{"title":"List users","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/users","href":"/api-reference/users/list-users"},{"title":"Get a user","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/users/{id}","href":"/api-reference/users/get-a-user"},{"title":"Create or update a user","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json put /v2/projects/{projectId}/environments/{environmentId}/users/{id}","href":"/api-reference/users/create-or-update-a-user"},{"title":"Delete a user","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{environmentId}/users/{id}","href":"/api-reference/users/delete-a-user"}]},{"group":"Companies","pages":[{"title":"List companies","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/companies","href":"/api-reference/companies/list-companies"},{"title":"Get a company","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/companies/{id}","href":"/api-reference/companies/get-a-company"},{"title":"Create or update a company","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json put /v2/projects/{projectId}/environments/{environmentId}/companies/{id}","href":"/api-reference/companies/create-or-update-a-company"},{"title":"Delete a company","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{environmentId}/companies/{id}","href":"/api-reference/companies/delete-a-company"},{"title":"Add a company member","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json put /v2/projects/{projectId}/environments/{environmentId}/companies/{id}/memberships/{userId}","href":"/api-reference/companies/add-a-company-member"},{"title":"Remove a company member","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{environmentId}/companies/{id}/memberships/{userId}","href":"/api-reference/companies/remove-a-company-member"}]},{"group":"Segments","pages":[{"title":"List segments","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/segments","href":"/api-reference/segments/list-segments"},{"title":"Create a segment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/segments","href":"/api-reference/segments/create-a-segment"},{"title":"Get a segment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/segments/{id}","href":"/api-reference/segments/get-a-segment"},{"title":"Delete a segment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/segments/{id}","href":"/api-reference/segments/delete-a-segment"},{"title":"Update a segment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/segments/{id}","href":"/api-reference/segments/update-a-segment"},{"title":"Restore a deleted segment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/segments/{id}/restore","href":"/api-reference/segments/restore-a-deleted-segment"},{"title":"Add a segment member","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json put /v2/projects/{projectId}/environments/{environmentId}/segments/{id}/members/{externalId}","href":"/api-reference/segments/add-a-segment-member"},{"title":"Remove a segment member","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{environmentId}/segments/{id}/members/{externalId}","href":"/api-reference/segments/remove-a-segment-member"}]},{"group":"Sessions","pages":[{"title":"List sessions","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/sessions","href":"/api-reference/sessions/list-sessions"},{"title":"Get a session","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/sessions/{id}","href":"/api-reference/sessions/get-a-session"},{"title":"Delete a session","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{environmentId}/sessions/{id}","href":"/api-reference/sessions/delete-a-session"},{"title":"End a session","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/environments/{environmentId}/sessions/{id}/end","href":"/api-reference/sessions/end-a-session"}]},{"group":"Attribute definitions","pages":[{"title":"List attribute definitions","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/attribute-definitions","href":"/api-reference/attribute-definitions/list-attribute-definitions"},{"title":"Create an attribute definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/attribute-definitions","href":"/api-reference/attribute-definitions/create-an-attribute-definition"},{"title":"Get an attribute definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/attribute-definitions/{id}","href":"/api-reference/attribute-definitions/get-an-attribute-definition"},{"title":"Delete an attribute definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/attribute-definitions/{id}","href":"/api-reference/attribute-definitions/delete-an-attribute-definition"},{"title":"Update an attribute definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/attribute-definitions/{id}","href":"/api-reference/attribute-definitions/update-an-attribute-definition"},{"title":"Restore a deleted attribute definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/attribute-definitions/{id}/restore","href":"/api-reference/attribute-definitions/restore-a-deleted-attribute-definition"}]},{"group":"Event definitions","pages":[{"title":"List event definitions","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/event-definitions","href":"/api-reference/event-definitions/list-event-definitions"},{"title":"Create an event definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/event-definitions","href":"/api-reference/event-definitions/create-an-event-definition"},{"title":"Get an event definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/event-definitions/{id}","href":"/api-reference/event-definitions/get-an-event-definition"},{"title":"Delete an event definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/event-definitions/{id}","href":"/api-reference/event-definitions/delete-an-event-definition"},{"title":"Update an event definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/event-definitions/{id}","href":"/api-reference/event-definitions/update-an-event-definition"},{"title":"Restore a deleted event definition","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/event-definitions/{id}/restore","href":"/api-reference/event-definitions/restore-a-deleted-event-definition"}]},{"group":"Webhooks","pages":[{"title":"List webhooks","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Create a webhook","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/environments/{environmentId}/webhooks","href":"/api-reference/webhooks/create-a-webhook"},{"title":"Get a webhook (includes the signing secret for webhook:manage tokens)","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{environmentId}/webhooks/{id}","href":"/api-reference/webhooks/get-a-webhook-includes-the-signing-secret-for-webhook:manage-tokens"},{"title":"Delete a webhook","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{environmentId}/webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook"},{"title":"Update a webhook","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/environments/{environmentId}/webhooks/{id}","href":"/api-reference/webhooks/update-a-webhook"},{"title":"Rotate the signing secret","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/environments/{environmentId}/webhooks/{id}/rotate-secret","href":"/api-reference/webhooks/rotate-the-signing-secret"}]},{"group":"Me","pages":[{"title":"Introspect the token","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/me","href":"/api-reference/me/introspect-the-token"}]},{"group":"Localizations","pages":[{"title":"List locales","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/locales","href":"/api-reference/localizations/list-locales"},{"title":"List localizations","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/localizations","href":"/api-reference/localizations/list-localizations"},{"title":"Create a localization","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/localizations","href":"/api-reference/localizations/create-a-localization"},{"title":"Delete a localization","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/localizations/{id}","href":"/api-reference/localizations/delete-a-localization"},{"title":"Update a localization","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/localizations/{id}","href":"/api-reference/localizations/update-a-localization"},{"title":"Restore a deleted localization","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/localizations/{id}/restore","href":"/api-reference/localizations/restore-a-deleted-localization"}]},{"group":"Events","pages":[{"title":"Track an event","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/environments/{environmentId}/events","href":"/api-reference/events/track-an-event"}]},{"group":"Environments","pages":[{"title":"List environments","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments","href":"/api-reference/environments/list-environments"},{"title":"Create an environment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json post /v2/projects/{projectId}/environments","href":"/api-reference/environments/create-an-environment"},{"title":"Get an environment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json get /v2/projects/{projectId}/environments/{id}","href":"/api-reference/environments/get-an-environment"},{"title":"Delete an environment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json delete /v2/projects/{projectId}/environments/{id}","href":"/api-reference/environments/delete-an-environment"},{"title":"Update an environment","deprecated":null,"version":null,"openapi":"/api-reference-v2/openapi.json patch /v2/projects/{projectId}/environments/{id}","href":"/api-reference/environments/update-an-environment"}]}]}]},{"anchor":"Self-Hosting","icon":"github","pages":[{"title":"Self-Hosting","href":"/open-source/self-hosting"}]},{"anchor":"Use Cases","icon":"route","pages":[{"title":"Use Cases","href":"/use-cases/analyze-onboarding-with-ai"}]},{"anchor":"API Reference (v1)","icon":"terminal","pages":[{"title":"API Reference (v1)","href":"/api-reference/introduction"}]},{"anchor":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/changelog/2026"}]}]},"basePath":"","title":"List themes - Usertour documention","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C9Wu0MeN.js","utils-jWgu-6Qf.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DBD8f9qn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BGuX1ui5.js","snippetPresets-Evy63nQB.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BQHO1lnV.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-B6C8m-t_.js","shallow-BG4cT0fH.js","getApiPlaygroundDisplay-CgEPrE-D.js","CodeSnippet-CU8JyZ9N.js","CodeSnippets-BnxHU32T.js","Page-D6S0Yh6q.js","getPastedJson-CwiYOonh.js","icon-DYDpWmDf.js","MethodPill-C-J-l7_c.js","DuplicateIcon-B6ARwg9w.js","createIcon-Dsv4MtDq.js","DynamicMarkdown-CtasenyM.js","SectionHeading-YNcgYwjB.js","axios-vUo_bRtp.js","Markdown-CwLx6PAg.js","clsx-C3kuh_dz.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CmKHfscc.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-U3mI6Ljh.js"]}