{"openapi":"3.1.0","info":{"title":"Scrunch Data API","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/{brand_id}/query":{"get":{"summary":"Query","description":"Query the data API to retrieve aggregated observation data across multiple dimensions and metrics. This endpoint dynamically generates SQL queries based on the requested fields, allowing flexible aggregation for analytics and reporting workflows.\n\nThe query endpoint returns pre-aggregated metrics grouped by the specified dimensions. Results are optimized for BI tools, reporting pipelines, and dashboards.","operationId":"query","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for the query range (inclusive). Format: YYYY-MM-DD. Defaults to 30 days ago.","title":"Start Date"},"description":"Start date for the query range (inclusive). Format: YYYY-MM-DD. Defaults to 30 days ago."},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for the query range (inclusive). Format: YYYY-MM-DD. Defaults to today.","title":"End Date"},"description":"End date for the query range (inclusive). Format: YYYY-MM-DD. Defaults to today."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":90000,"minimum":1,"description":"Maximum number of rows to return. Use with offset for pagination.","default":50000,"title":"Limit"},"description":"Maximum number of rows to return. Use with offset for pagination."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of rows to skip for pagination.","default":0,"title":"Offset"},"description":"Number of rows to skip for pagination."},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of dimensions and/or metrics to include in the query results. If omitted, all dimensions are returned.\n\n**Supported Dimensions:**\n- `date` - Daily timestamp (YYYYMMDD)\n- `date_week` - ISO week (YYYYWW)\n- `date_month` - Month (YYYYMM)\n- `date_quarter` - Quarter (YYYYQ#)\n- `date_year` - Year (YYYY)\n- `prompt_id` - Prompt ID (Integer)\n- `prompt` - Prompt text (String)\n- `persona_id` - Persona ID (Integer)\n- `persona_name` - Persona name (String)\n- `ai_platform` - AI platform name (String, mapped)\n- `ai_platform_search_enabled` - Search mode enabled (Boolean)\n- `tag` - Prompt tag (String)\n- `source_url` - Citation URL (String)\n- `source_type` - Citation type (brand, competitor, other)\n- `source_domain` - Citation host (String, www-stripped)\n- `competitor_id` - Competitor ID (Integer)\n- `competitor_name` - Competitor name (String)\n- `branded` - Branded prompt (Boolean)\n- `stage` - Journey stage (Display name)\n- `prompt_topic` - Topic name (String)\n- `country` - Geography (Country code)\n- `position_bucket` - Brand position bucket (top/middle/bottom)\n- `sentiment_band` - Brand sentiment band (positive/mixed/negative/none)\n\n**Supported Metrics:**\n- `responses` - Total responses (COUNT of distinct observations)\n- `brand_presence_percentage` - Brand mention rate (0-1 scale)\n- `brand_position_score` - Brand positioning (0-100 scale: top=100, middle=50, bottom=0)\n- `brand_sentiment_score` - Brand sentiment (0-100 scale: positive=100, mixed=50, negative=0)\n- `competitor_presence_percentage` - Competitor mention rate (0-1 scale)\n- `competitor_position_score` - Competitor positioning (0-100 scale)\n- `competitor_sentiment_score` - Competitor sentiment (0-100 scale)\n- `brand_citation_rate` / `competitor_citation_rate` - Share of responses citing an entity-owned source (0-1)\n- `brand_citation_share_of_voice` / `competitor_citation_share_of_voice` - Of responses that cite anything, share that cite an entity-owned source (0-1)\n- `citation_count` - Total citation occurrences across responses\n- `citation_unique_responses` - Distinct responses with at least one citation\n- `citation_unique_domains` - Distinct citation hosts (www-stripped)\n- `citation_unique_response_domains` - Distinct (response, domain, owner) triples; the legacy Citations page's composition grain. Group it by `owner` or `domain` (or any response-grain dimension). Grouping by `source_url` puts the URL back in the key and inflates the total by ~30-37%; `citation_segment` can place one triple in two segments\n\n**Example:** `fields=date,ai_platform,brand_presence_percentage`","title":"Fields"},"description":"Comma-separated list of dimensions and/or metrics to include in the query results. If omitted, all dimensions are returned.\n\n**Supported Dimensions:**\n- `date` - Daily timestamp (YYYYMMDD)\n- `date_week` - ISO week (YYYYWW)\n- `date_month` - Month (YYYYMM)\n- `date_quarter` - Quarter (YYYYQ#)\n- `date_year` - Year (YYYY)\n- `prompt_id` - Prompt ID (Integer)\n- `prompt` - Prompt text (String)\n- `persona_id` - Persona ID (Integer)\n- `persona_name` - Persona name (String)\n- `ai_platform` - AI platform name (String, mapped)\n- `ai_platform_search_enabled` - Search mode enabled (Boolean)\n- `tag` - Prompt tag (String)\n- `source_url` - Citation URL (String)\n- `source_type` - Citation type (brand, competitor, other)\n- `source_domain` - Citation host (String, www-stripped)\n- `competitor_id` - Competitor ID (Integer)\n- `competitor_name` - Competitor name (String)\n- `branded` - Branded prompt (Boolean)\n- `stage` - Journey stage (Display name)\n- `prompt_topic` - Topic name (String)\n- `country` - Geography (Country code)\n- `position_bucket` - Brand position bucket (top/middle/bottom)\n- `sentiment_band` - Brand sentiment band (positive/mixed/negative/none)\n\n**Supported Metrics:**\n- `responses` - Total responses (COUNT of distinct observations)\n- `brand_presence_percentage` - Brand mention rate (0-1 scale)\n- `brand_position_score` - Brand positioning (0-100 scale: top=100, middle=50, bottom=0)\n- `brand_sentiment_score` - Brand sentiment (0-100 scale: positive=100, mixed=50, negative=0)\n- `competitor_presence_percentage` - Competitor mention rate (0-1 scale)\n- `competitor_position_score` - Competitor positioning (0-100 scale)\n- `competitor_sentiment_score` - Competitor sentiment (0-100 scale)\n- `brand_citation_rate` / `competitor_citation_rate` - Share of responses citing an entity-owned source (0-1)\n- `brand_citation_share_of_voice` / `competitor_citation_share_of_voice` - Of responses that cite anything, share that cite an entity-owned source (0-1)\n- `citation_count` - Total citation occurrences across responses\n- `citation_unique_responses` - Distinct responses with at least one citation\n- `citation_unique_domains` - Distinct citation hosts (www-stripped)\n- `citation_unique_response_domains` - Distinct (response, domain, owner) triples; the legacy Citations page's composition grain. Group it by `owner` or `domain` (or any response-grain dimension). Grouping by `source_url` puts the URL back in the key and inflates the total by ~30-37%; `citation_segment` can place one triple in two segments\n\n**Example:** `fields=date,ai_platform,brand_presence_percentage`"},{"name":"filters","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter rows by dimension values **before** aggregation. Each filter uses the format `field:value`. Multiple values are joined with `|` for an IN match (e.g. `ai_platform:ChatGPT|Claude`). Prefix the value with `!` for negation (e.g. `branded:!true`). The `filters` parameter can be repeated to apply multiple filters; they are combined with AND.\n\nFilterable dimensions: `prompt_id`, `persona_id`, `persona_name`, `ai_platform`, `ai_platform_search_enabled`, `tag`, `competitor_id`, `competitor_name`, `branded`, `stage`, `prompt_topic`, `country`, `position_bucket`, `sentiment_band`, `date`, `date_week`, `date_month`, `date_quarter`, `date_year`.\n\n**Example:** `filters=ai_platform:ChatGPT&filters=branded:true`","title":"Filters"},"description":"Filter rows by dimension values **before** aggregation. Each filter uses the format `field:value`. Multiple values are joined with `|` for an IN match (e.g. `ai_platform:ChatGPT|Claude`). Prefix the value with `!` for negation (e.g. `branded:!true`). The `filters` parameter can be repeated to apply multiple filters; they are combined with AND.\n\nFilterable dimensions: `prompt_id`, `persona_id`, `persona_name`, `ai_platform`, `ai_platform_search_enabled`, `tag`, `competitor_id`, `competitor_name`, `branded`, `stage`, `prompt_topic`, `country`, `position_bucket`, `sentiment_band`, `date`, `date_week`, `date_month`, `date_quarter`, `date_year`.\n\n**Example:** `filters=ai_platform:ChatGPT&filters=branded:true`"},{"name":"having","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter **aggregated** metric values after GROUP BY. Each entry uses `metric:operator:value` format.\n\n**Operators:** `gt`, `gte`, `lt`, `lte`, `eq`, `neq`.\n\n**Example:** `having=brand_presence_percentage:gt:0&having=responses:gte:10`","title":"Having"},"description":"Filter **aggregated** metric values after GROUP BY. Each entry uses `metric:operator:value` format.\n\n**Operators:** `gt`, `gte`, `lt`, `lte`, `eq`, `neq`.\n\n**Example:** `having=brand_presence_percentage:gt:0&having=responses:gte:10`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/prompts":{"get":{"summary":"List Prompts","description":"Returns a paginated list of prompts for the specified brand, including their variants, tags, and topics. Defaults to active prompts; pass `status=archived` to return archived prompts, or `status=all` to include active, paused, and archived prompts.","operationId":"listPrompts","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Maximum number of prompts to return per page.","default":100,"title":"Limit"},"description":"Maximum number of prompts to return per page."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of prompts to skip for pagination.","default":0,"title":"Offset"},"description":"Number of prompts to skip for pagination."},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter prompts by journey stage — the name of one of the brand's stages (custom stage names included). Default sets:\n- `Advice` - Prompts seeking recommendations or guidance\n- `Awareness` - Prompts exploring a topic or problem space\n- `Evaluation` - Prompts assessing specific options\n- `Comparison` - Prompts comparing multiple options\n- `Other` - Prompts that don't fit other categories","title":"Stage"},"description":"Filter prompts by journey stage — the name of one of the brand's stages (custom stage names included). Default sets:\n- `Advice` - Prompts seeking recommendations or guidance\n- `Awareness` - Prompts exploring a topic or problem space\n- `Evaluation` - Prompts assessing specific options\n- `Comparison` - Prompts comparing multiple options\n- `Other` - Prompts that don't fit other categories"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["active","paused","archived"],"type":"string"},{"const":"all","type":"string"}],"description":"Filter prompts by lifecycle status. Defaults to `active`.\n\n- `active` - Only currently tracked prompts\n- `paused` - Prompts whose collection is paused; their history stays visible\n- `archived` - Only soft-deleted prompts\n- `all` - Active, paused, and archived prompts","default":"active","title":"Status"},"description":"Filter prompts by lifecycle status. Defaults to `active`.\n\n- `active` - Only currently tracked prompts\n- `paused` - Prompts whose collection is paused; their history stays visible\n- `archived` - Only soft-deleted prompts\n- `all` - Active, paused, and archived prompts"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_PromptListing_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Prompt","description":"Creates a new prompt with variants for the specified platforms. Requires the `configure` scope.\n\n**Behavior:**\n- Auto-categorizes the journey stage using an LLM if not provided\n- Creates variants for each specified platform\n- Reactivates an archived prompt if a duplicate exists\n- Dispatches collection events to begin tracking","operationId":"createPrompt","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIPromptInputModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/prompts/{prompt_id}":{"get":{"summary":"Get Prompt","description":"Returns a single prompt by its ID, including all associated metadata such as platforms, tags, and topics. Paused and archived prompts are returned with their lifecycle status; check the field if you only want active ones.","operationId":"getPrompt","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"prompt_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the prompt","title":"Prompt Id"},"description":"The unique identifier for the prompt"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Archive Prompt","description":"Archives a prompt (soft delete). The prompt will no longer be tracked but historical data is preserved. Requires the `configure` scope.","operationId":"archivePrompt","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"prompt_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the prompt to archive","title":"Prompt Id"},"description":"The unique identifier for the prompt to archive"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brands":{"get":{"summary":"List Brands","description":"List available brands","operationId":"listBrands","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_BrandListing_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Brand","description":"Create a new brand","operationId":"createBrand","security":[{"HTTPBearer":["create-brand"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICreateBrandInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICreateBrandResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brands/{brand_id}":{"get":{"summary":"Get Brand","description":"Get a brand by ID","operationId":"getBrand","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIBrandListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Brand","description":"Partially update a brand. Only fields included in the request body are modified. For competitors and personas, the provided list uses **replace semantics**: the list you send represents the complete desired state. Include an `id` to update an existing record, omit `id` to create a new one. **Any existing competitors or personas not included in the list will be archived.** To leave competitors or personas unchanged, omit the field entirely from the request.","operationId":"patchBrand","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIBrandPatchInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIBrandListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Archive Brand","description":"Archive a brand","operationId":"archiveBrand","security":[{"HTTPBearer":["create-brand"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/collections":{"post":{"summary":"Create Collection Request","description":"Triggers on-demand collection for a prompt across the specified AI platforms. Each platform will be queried and the response evaluated independently.\n\nRequires the `configure` scope. The prompt must be active and have active variants for the requested platforms; paused or archived prompts cannot be collected.","operationId":"createCollection","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brands/{brand_id}/competitors":{"get":{"summary":"List Competitors","description":"List competitors for a brand","operationId":"listCompetitors","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_APICompetitorListing_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Competitor","description":"Create a new competitor","operationId":"createCompetitor","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICompetitorCreateInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICompetitorListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brands/{brand_id}/competitors/{competitor_id}":{"get":{"summary":"Get Competitor","description":"Get a competitor by ID","operationId":"getCompetitor","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"competitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Competitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICompetitorListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Competitor","description":"Update a competitor","operationId":"updateCompetitor","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"competitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Competitor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICompetitorUpdateInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICompetitorListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Archive Competitor","description":"Archive a competitor","operationId":"archiveCompetitor","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"competitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Competitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brands/{brand_id}/personas":{"get":{"summary":"List Personas","description":"List personas for a brand","operationId":"listPersonas","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_APIPersonaListing_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Persona","description":"Create a new persona","operationId":"createPersona","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIPersonaCreateInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIPersonaListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/brands/{brand_id}/personas/{persona_id}":{"get":{"summary":"Get Persona","description":"Get a persona by ID","operationId":"getPersona","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"integer","title":"Persona Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIPersonaListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Persona","description":"Update a persona","operationId":"updatePersona","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"integer","title":"Persona Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIPersonaUpdateInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIPersonaListing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Archive Persona","description":"Archive a persona. Its active prompts are paused (not archived): collection stops but their collected history stays available on the API, and they can be resumed after the persona is restored or the prompts reassigned.","operationId":"archivePersona","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"persona_id","in":"path","required":true,"schema":{"type":"integer","title":"Persona Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/responses":{"get":{"summary":"List Responses","description":"Returns AI responses (observations) with full evaluation data, citations, and competitor analysis. Each response represents a single AI-generated answer to a tracked prompt.\n\nThis endpoint provides the raw response data needed for deep analysis, audits, and research. For aggregated metrics, use the Query API instead.\n\n**Response data includes:**\n- Full response text from the AI platform\n- Brand evaluation (presence, sentiment, position)\n- Competitor evaluations with individual metrics\n- Citations with source classification (brand/competitor/other)\n- Prompt and persona context","operationId":"listResponses","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"enum":["chatgpt","claude","google_ai_overviews","perplexity","meta","google_ai_mode","google_gemini","copilot","grok"],"type":"string"},{"type":"null"}],"description":"Filter responses by AI platform.\n\n**Supported platforms:**\n- `chatgpt` - OpenAI ChatGPT\n- `claude` - Anthropic Claude\n- `google_ai_overviews` - Google AI Overviews (Search)\n- `perplexity` - Perplexity AI\n- `meta` - Meta AI\n- `google_ai_mode` - Google AI Mode\n- `google_gemini` - Google Gemini\n- `copilot` - Microsoft Copilot","title":"Platform"},"description":"Filter responses by AI platform.\n\n**Supported platforms:**\n- `chatgpt` - OpenAI ChatGPT\n- `claude` - Anthropic Claude\n- `google_ai_overviews` - Google AI Overviews (Search)\n- `perplexity` - Perplexity AI\n- `meta` - Meta AI\n- `google_ai_mode` - Google AI Mode\n- `google_gemini` - Google Gemini\n- `copilot` - Microsoft Copilot"},{"name":"prompt_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter responses to a specific prompt by its ID","title":"Prompt Id"},"description":"Filter responses to a specific prompt by its ID"},{"name":"persona_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter responses to a specific persona by its ID","title":"Persona Id"},"description":"Filter responses to a specific persona by its ID"},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter responses by customer journey stage — the name of one of the brand's stages (custom stage names included). Default sets:\n- `Advice` - Seeking recommendations\n- `Awareness` - Exploring a topic\n- `Evaluation` - Assessing options\n- `Comparison` - Comparing alternatives\n- `Other` - Other prompt types","title":"Stage"},"description":"Filter responses by customer journey stage — the name of one of the brand's stages (custom stage names included). Default sets:\n- `Advice` - Seeking recommendations\n- `Awareness` - Exploring a topic\n- `Evaluation` - Assessing options\n- `Comparison` - Comparing alternatives\n- `Other` - Other prompt types"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only return responses collected on or after this date (inclusive). Format: YYYY-MM-DD","title":"Start Date"},"description":"Only return responses collected on or after this date (inclusive). Format: YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only return responses collected before this date (exclusive). Format: YYYY-MM-DD","title":"End Date"},"description":"Only return responses collected before this date (exclusive). Format: YYYY-MM-DD"},{"name":"has_shopping_data","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter responses by shopping data presence. True returns only responses with shopping results, False returns only responses without.","title":"Has Shopping Data"},"description":"Filter responses by shopping data presence. True returns only responses with shopping results, False returns only responses without."},{"name":"has_sponsored_ads","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter responses by sponsored-ad presence. True returns only responses that displayed sponsored ads (matching the sponsored_ads field), False returns only responses without.","title":"Has Sponsored Ads"},"description":"Filter responses by sponsored-ad presence. True returns only responses that displayed sponsored ads (matching the sponsored_ads field), False returns only responses without."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Maximum number of responses to return per page","default":100,"title":"Limit"},"description":"Maximum number of responses to return per page"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of responses to skip for pagination","default":0,"title":"Offset"},"description":"Number of responses to skip for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_ResponseListing_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/page-audits":{"post":{"summary":"Create Page Audits","description":"Create one or more page audits","operationId":"createPageAudits","security":[{"HTTPBearer":["configure"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAuditCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageAuditRecord"},"title":"Response Createpageaudits"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Page Audits","description":"List page audits in reverse chronological order","operationId":"listPageAudits","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["pending","running","completed","failed"],"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by URL (partial match)","title":"Url"},"description":"Filter by URL (partial match)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Maximum number of results","default":100,"title":"Limit"},"description":"Maximum number of results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_PageTestListing_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/page-audits/{page_audit_id}":{"get":{"summary":"Get Page Audit","description":"Get a specific page audit by ID","operationId":"getPageAudit","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"page_audit_id","in":"path","required":true,"schema":{"type":"string","title":"Page Audit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/sites/{site_id}/agent-traffic":{"get":{"tags":["agent-traffic"],"summary":"Get Agent Traffic","description":"Retrieve aggregated bot and AI agent traffic data for a specific site.\n\nThis endpoint provides visibility into how AI agents and bots are accessing your web properties. Use it to analyze traffic patterns, identify top agents, and understand crawl behavior over time.\n\n## Available Dimensions\n\nThe following dimensions can be included in the `fields` parameter to group results:\n\n| Field | Description |\n|-------|-------------|\n| `date` | Daily timestamp for the traffic record |\n| `site` | The site domain being analyzed |\n| `path` | URL path on the site |\n| `agent_source` | The source/origin of the agent (e.g., OpenAI, Google, Anthropic) |\n| `agent_type` | Classification of the agent type |\n\n## Metrics\n\nTraffic counts are automatically included in the response based on the selected dimensions.","operationId":"getAgentTraffic","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"site_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","minLength":26,"maxLength":26,"pattern":"[0-7][0123456789ABCDEFGHJKMNPQRSTVWXYZ]{25}"},{"type":"string","contentMediaType":"application/octet-stream","minLength":16,"maxLength":16}],"description":"The unique identifier of the site to retrieve agent traffic for.","title":"Site Id"},"description":"The unique identifier of the site to retrieve agent traffic for."},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Start date for the query range (inclusive). Format: YYYY-MM-DD.","title":"Start Date"},"description":"Start date for the query range (inclusive). Format: YYYY-MM-DD."},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"End date for the query range (inclusive). Format: YYYY-MM-DD.","title":"End Date"},"description":"End date for the query range (inclusive). Format: YYYY-MM-DD."},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of dimensions to include in the response. Available dimensions: `date`, `site`, `path`, `agent_source`, `agent_type`. If not specified, returns aggregated totals.","title":"Fields"},"description":"Comma-separated list of dimensions to include in the response. Available dimensions: `date`, `site`, `path`, `agent_source`, `agent_type`. If not specified, returns aggregated totals."},{"name":"time_bucket","in":"query","required":false,"schema":{"enum":["day","week"],"type":"string","description":"Time aggregation bucket for grouping results. Options: `day`, `week`. Defaults to `day`.","default":"day","title":"Time Bucket"},"description":"Time aggregation bucket for grouping results. Options: `day`, `week`. Defaults to `day`."},{"name":"path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter results to a specific URL path or path prefix.","title":"Path"},"description":"Filter results to a specific URL path or path prefix."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"Maximum number of rows to return. Use with offset for pagination.","default":10000,"title":"Limit"},"description":"Maximum number of rows to return. Use with offset for pagination."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of rows to skip before returning results. Use with limit for pagination.","default":0,"title":"Offset"},"description":"Number of rows to skip before returning results. Use with limit for pagination."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTrafficResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/sitemap/pages":{"get":{"tags":["sitemap"],"summary":"List Sitemap Pages","description":"List pages in the brand's sitemap with their title, description, and audit score. Data comes from the most recent completed crawl. Supports filtering by URL depth and path prefix.","operationId":"listSitemapPages","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by domain (for brands with multiple sites)","title":"Domain"},"description":"Filter by domain (for brands with multiple sites)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"max_depth","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum URL path depth to include (0 = root only)","title":"Max Depth"},"description":"Maximum URL path depth to include (0 = root only)"},{"name":"path_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by URL path prefix (e.g. /blog)","title":"Path Prefix"},"description":"Filter by URL path prefix (e.g. /blog)"},{"name":"is_priority","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to (or exclude) pages flagged as priority for the brand","title":"Is Priority"},"description":"Filter to (or exclude) pages flagged as priority for the brand"},{"name":"has_optimized_content","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to (or exclude) pages with active AXP optimized content","title":"Has Optimized Content"},"description":"Filter to (or exclude) pages with active AXP optimized content"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive substring match on the page URL or title — mirrors the 'Find pages...' input in the UI.","title":"Search"},"description":"Case-insensitive substring match on the page URL or title — mirrors the 'Find pages...' input in the UI."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapPagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/sitemap/pages/{page_id}":{"get":{"tags":["sitemap"],"summary":"Get Sitemap Page","description":"Get detailed information about a single page in the brand's sitemap.","operationId":"getSitemapPage","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","description":"The page identifier","title":"Page Id"},"description":"The page identifier"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapPageDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/sitemap/pages/{page_id}/metrics":{"get":{"tags":["sitemap"],"summary":"Get Sitemap Page Metrics","description":"Get time-series performance metrics (citations, AI referrals, agent traffic) for a single page.","operationId":"getSitemapPageMetrics","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","description":"The page identifier","title":"Page Id"},"description":"The page identifier"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (YYYY-MM-DD). Defaults to 30 days ago.","title":"Start Date"},"description":"Start date (YYYY-MM-DD). Defaults to 30 days ago."},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (YYYY-MM-DD). Defaults to today.","title":"End Date"},"description":"End date (YYYY-MM-DD). Defaults to today."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitemapPageMetricsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/sitemap/export":{"get":{"tags":["sitemap"],"summary":"Export Sitemap Pages","description":"Download every page in the brand's sitemap as CSV or XLSX. Same filters as the listing endpoint, no pagination. With include_metrics (default true), each row also includes totals over the selected date range for agent_traffic, citations, and ai_referrals, plus percent change from the first bucket to the last bucket — matching the totals and trend % shown in the sitemap UI.","operationId":"exportSitemapPages","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","description":"The unique identifier for the brand","title":"Brand Id"},"description":"The unique identifier for the brand"},{"name":"format","in":"query","required":false,"schema":{"enum":["csv","xlsx"],"type":"string","description":"Output format: csv or xlsx","default":"csv","title":"Format"},"description":"Output format: csv or xlsx"},{"name":"mapped_site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Explicit sitemap (mapped_site_id) to export. The FE passes this so the export operates on the sitemap the user is currently viewing, even if it isn't the latest finished crawl for the domain. Defaults to the latest finished crawl for the brand (and optionally the supplied domain).","title":"Mapped Site Id"},"description":"Explicit sitemap (mapped_site_id) to export. The FE passes this so the export operates on the sitemap the user is currently viewing, even if it isn't the latest finished crawl for the domain. Defaults to the latest finished crawl for the brand (and optionally the supplied domain)."},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by domain (for brands with multiple sites)","title":"Domain"},"description":"Filter by domain (for brands with multiple sites)"},{"name":"max_depth","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum URL path depth to include (0 = root only)","title":"Max Depth"},"description":"Maximum URL path depth to include (0 = root only)"},{"name":"path_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by URL path prefix (e.g. /blog)","title":"Path Prefix"},"description":"Filter by URL path prefix (e.g. /blog)"},{"name":"is_priority","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to (or exclude) pages flagged as priority","title":"Is Priority"},"description":"Filter to (or exclude) pages flagged as priority"},{"name":"has_optimized_content","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to (or exclude) pages with active AXP content","title":"Has Optimized Content"},"description":"Filter to (or exclude) pages with active AXP content"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive substring match on the page URL or title — mirrors the 'Find pages...' input in the UI.","title":"Search"},"description":"Case-insensitive substring match on the page URL or title — mirrors the 'Find pages...' input in the UI."},{"name":"include_metrics","in":"query","required":false,"schema":{"type":"boolean","description":"Include per-page totals for agent_traffic, citations, ai_referrals (summed over the selected date range), plus percent-change from the first bucket to the last bucket of the same series — matching the trend % shown next to each metric in the sitemap UI.","default":true,"title":"Include Metrics"},"description":"Include per-page totals for agent_traffic, citations, ai_referrals (summed over the selected date range), plus percent-change from the first bucket to the last bucket of the same series — matching the trend % shown next to each metric in the sitemap UI."},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics start date (YYYY-MM-DD). Defaults to 30 days ago.","title":"Start Date"},"description":"Metrics start date (YYYY-MM-DD). Defaults to 30 days ago."},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics end date (YYYY-MM-DD). Defaults to today.","title":"End Date"},"description":"Metrics end date (YYYY-MM-DD). Defaults to today."},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User's IANA timezone (e.g. 'America/Denver'). When provided, the export drops the trailing weekly bucket that falls on today in that timezone — matching the sitemap UI's chart filter so totals and change_pct line up with what the user sees on screen. Omit for external API consumers who want the raw date range.","title":"Tz"},"description":"User's IANA timezone (e.g. 'America/Denver'). When provided, the export drops the trailing weekly bucket that falls on today in that timezone — matching the sitemap UI's chart filter so totals and change_pct line up with what the user sees on screen. Omit for external API consumers who want the raw date range."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/signals":{"get":{"tags":["signals"],"summary":"List Signals","description":"List detected signals for a brand — statistically-tested movements (level changes and trends) in AI-visibility metrics, produced by the nightly detection sweep.\n\n## Population\n\nBy default only user-facing signals are returned: the confidence tiers `high`, `confident`, `worth_a_look`, and `provisional`. Pass an explicit `tier` to select a single tier, including the noise-floor tiers. An ongoing signal is re-detected daily under the same `fingerprint`; a multi-day date range returns only the latest detection per signal identity, so you never see day-by-day duplicates of the same issue.\n\n## Tracking one issue over time\n\nA signal's `fingerprint` is its durable identity: it survives nightly re-detections *and* direction flips of the same underlying issue. To follow an issue after remediation, filter by `fingerprint` with a wide `anchor_from` — a later detection in the opposite `direction` on the same fingerprint is the recovery (or regression) of the original movement. Combine with `direction` to fetch each side separately.\n\n## Sorting\n\n`sort=score_desc` (default) orders by engine priority, `delta_desc` by largest absolute change, `detected_desc` by newest detection date.","operationId":"listSignals","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"enum":["account","account_platform","topic","topic_platform"],"type":"string"},{"type":"null"}],"description":"Slice granularity the signal was detected on: `account` (whole brand), `account_platform` (brand on one AI platform), `topic`, or `topic_platform`.","title":"Scope"},"description":"Slice granularity the signal was detected on: `account` (whole brand), `account_platform` (brand on one AI platform), `topic`, or `topic_platform`."},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"AI platform the signal was detected on (e.g. `OpenAI`). Multi-platform signals carry the `(multi)` sentinel; the response `slice.platforms` lists the real platforms.","title":"Platform"},"description":"AI platform the signal was detected on (e.g. `OpenAI`). Multi-platform signals carry the `(multi)` sentinel; the response `slice.platforms` lists the real platforms."},{"name":"metric","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metric the signal fired on. Known values: `presence_rate`, `position_top_rate`, `cited_domain_rate` (new metrics may be added).","title":"Metric"},"description":"Metric the signal fired on. Known values: `presence_rate`, `position_top_rate`, `cited_domain_rate` (new metrics may be added)."},{"name":"alert_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["level_change","trend"],"type":"string"},{"type":"null"}],"description":"Detection kind: `level_change` (step shift) or `trend` (sustained drift).","title":"Alert Type"},"description":"Detection kind: `level_change` (step shift) or `trend` (sustained drift)."},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"enum":["up","down","none"],"type":"string"},{"type":"null"}],"description":"Direction of the movement: `up`, `down`, or `none`.","title":"Direction"},"description":"Direction of the movement: `up`, `down`, or `none`."},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"enum":["high","confident","worth_a_look","provisional","low_confidence","underpowered","untested"],"type":"string"},{"type":"null"}],"description":"Confidence tier. When omitted, only the default user-facing tiers are returned (`high`, `confident`, `worth_a_look`, `provisional`); pass an explicit tier to see a single tier, including the noise-floor tiers (`low_confidence`, `underpowered`, `untested`).","title":"Tier"},"description":"Confidence tier. When omitted, only the default user-facing tiers are returned (`high`, `confident`, `worth_a_look`, `provisional`); pass an explicit tier to see a single tier, including the noise-floor tiers (`low_confidence`, `underpowered`, `untested`)."},{"name":"subject_kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["brand","competitor"],"type":"string"},{"type":"null"}],"description":"Whose movement the signal describes: your `brand` or a `competitor`.","title":"Subject Kind"},"description":"Whose movement the signal describes: your `brand` or a `competitor`."},{"name":"anchor_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Earliest `detected_for_date` to include (inclusive, YYYY-MM-DD).","title":"Anchor From"},"description":"Earliest `detected_for_date` to include (inclusive, YYYY-MM-DD)."},{"name":"anchor_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Latest `detected_for_date` to include (inclusive, YYYY-MM-DD).","title":"Anchor To"},"description":"Latest `detected_for_date` to include (inclusive, YYYY-MM-DD)."},{"name":"fingerprint","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}],"description":"Only signals with this stable identity (`fingerprint`). A fingerprint survives nightly re-detections and direction flips of the same underlying issue, so filtering on one — with a wide `anchor_from` — tracks how that issue evolved after remediation. Combine with `direction` to separate the original movement from its recovery.","title":"Fingerprint"},"description":"Only signals with this stable identity (`fingerprint`). A fingerprint survives nightly re-detections and direction flips of the same underlying issue, so filtering on one — with a wide `anchor_from` — tracks how that issue evolved after remediation. Combine with `direction` to separate the original movement from its recovery."},{"name":"mover_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":2048},{"type":"null"}],"description":"Case-insensitive substring matched against the URLs in the signal's `url_movers` evidence (per-URL citation movers, emitted for `cited_domain_rate` signals). Only signals with at least one matching mover URL are returned; signals without URL movers never match.","title":"Mover Url"},"description":"Case-insensitive substring matched against the URLs in the signal's `url_movers` evidence (per-URL citation movers, emitted for `cited_domain_rate` signals). Only signals with at least one matching mover URL are returned; signals without URL movers never match."},{"name":"sort","in":"query","required":false,"schema":{"enum":["score_desc","delta_desc","detected_desc"],"type":"string","description":"Sort order: `score_desc` (engine priority, default), `delta_desc` (largest absolute change first), or `detected_desc` (newest first).","default":"score_desc","title":"Sort"},"description":"Sort order: `score_desc` (engine priority, default), `delta_desc` (largest absolute change first), or `detected_desc` (newest first)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum number of signals to return.","default":50,"title":"Limit"},"description":"Maximum number of signals to return."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of signals to skip (pagination).","default":0,"title":"Offset"},"description":"Number of signals to skip (pagination)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_APISignal_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/signals/anchors":{"get":{"tags":["signals"],"summary":"List Signal Anchor Dates","description":"List recent distinct detection dates (`detected_for_date`) that produced user-facing signals, newest first. Useful for building date pickers or polling for new detection runs — the population matches `listSignals` with default filters, so every returned day has at least one signal.","operationId":"listSignalAnchors","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Maximum number of dates to return.","default":90,"title":"Limit"},"description":"Maximum number of dates to return."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APISignalAnchors"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/signals/reactions":{"get":{"tags":["signals"],"summary":"List Signal Reactions","description":"List reactions users have set on this brand's signals, newest first. This is **brand-wide** — it returns every user's reactions, not just the caller's — so an integration can export the team's aggregate feedback. Filter by `fingerprint` to get reactions for one signal identity, or by `reaction` to get e.g. everything marked `useful`.","operationId":"listSignalReactions","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"fingerprint","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only reactions on this signal fingerprint.","title":"Fingerprint"},"description":"Only reactions on this signal fingerprint."},{"name":"reaction","in":"query","required":false,"schema":{"anyOf":[{"enum":["useful","not_useful","dismissed","actioned"],"type":"string"},{"type":"null"}],"description":"Only reactions with this value.","title":"Reaction"},"description":"Only reactions with this value."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum number of reactions to return.","default":50,"title":"Limit"},"description":"Maximum number of reactions to return."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of reactions to skip (pagination).","default":0,"title":"Offset"},"description":"Number of reactions to skip (pagination)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_APISignalReaction_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/signals/{signal_id}":{"get":{"tags":["signals"],"summary":"Get Signal","description":"Fetch one signal by ID, including its full narrative (what happened, why it matters, what to do) when available. Returns 404 for IDs that exist but are not user-facing (non-fired or cluster-child rows) — the same population rule as `listSignals`.","operationId":"getSignal","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"signal_id","in":"path","required":true,"schema":{"type":"integer","title":"Signal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APISignal"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/signals/{signal_id}/reaction":{"put":{"tags":["signals"],"summary":"Set Signal Reaction","description":"Set (or replace) the calling user's reaction on a signal. Reactions are keyed on the signal's stable `fingerprint`, so a reaction survives the nightly re-detection of the same underlying issue.\n\nRequires a **user token** (JWT) — API keys have no user identity to attribute the reaction to and receive 403.","operationId":"setSignalReaction","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"signal_id","in":"path","required":true,"schema":{"type":"integer","title":"Signal Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APISignalReactionUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APISignalReaction"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["signals"],"summary":"Clear Signal Reaction","description":"Remove the calling user's reaction on a signal's stable identity. Requires a **user token** (JWT); API keys receive 403.","operationId":"clearSignalReaction","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"signal_id","in":"path","required":true,"schema":{"type":"integer","title":"Signal Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/site-diagnostics":{"get":{"tags":["site-diagnostics"],"summary":"List Site Diagnostics","description":"List the latest diagnostics per page for a brand — its AI-visibility scores, the opportunities to improve it (`opportunities`), and what it already does well (`strengths`).\n\nPass one or more `path` params (e.g. `?path=/about&path=/pricing`) to scope to specific pages; omit them to page through every audited path. Paths are matched normalized (case-insensitive, trailing slash ignored). Each path returns only its most recent audit.","operationId":"listSiteDiagnostics","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"path","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Restrict to these page paths. Repeat for multiple.","title":"Path"},"description":"Restrict to these page paths. Repeat for multiple."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum number of pages to return.","default":50,"title":"Limit"},"description":"Maximum number of pages to return."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of pages to skip (pagination).","default":0,"title":"Offset"},"description":"Number of pages to skip (pagination)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_PathDiagnostics_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/site-diagnostics/optimization":{"get":{"tags":["site-diagnostics"],"summary":"Get Page Optimization Detail","description":"Fetch the latest optimization run for one page: a summary of how many content blocks were transformed / enriched / removed, the optimized token total, and every block's before/after content.\n\nBy default only **reviewed** runs are returned (`completed`, `staged`, `deployed`, `acknowledged`) — i.e. optimizations a human accepted — not raw unreviewed optimizer output. Pass one or more `status` params to opt into other lifecycle states (e.g. `?status=pending`). Each chunk carries its own `status`, so a `rejected` block (its `after` was not accepted) is distinguishable from an `approved` one. Returns 404 when the page has no run in the requested statuses.","operationId":"getSiteDiagnosticsOptimization","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"The page path, e.g. `/about`.","title":"Path"},"description":"The page path, e.g. `/about`."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["pending","completed","staged","deployed","retired","outdated","acknowledged"],"type":"string"}},{"type":"null"}],"description":"Restrict to these run statuses. Default: reviewed runs only.","title":"Status"},"description":"Restrict to these run statuses. Default: reviewed runs only."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathOptimization"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/site-diagnostics/optimization/apply":{"post":{"tags":["site-diagnostics"],"summary":"Apply Page Optimization","description":"Record that a page's optimization was **acted on off-platform** — for when the change was made outside Scrunch (e.g. in Sitecore), so no Scrunch review is needed.\n\nSend exactly one of: `approve_all: true` to accept every changed block, or a `reviews` list with per-block verdicts by chunk `id` (`approved` keeps our version, `rejected` keeps the original). A `reviews` list can be **partial** — un-verdicted blocks keep the run pending, so blocks can be resolved across several calls. The page is **acknowledged automatically once every changed block has a verdict**, matching the in-app flow that can't close a page with an unresolved block.\n\nApplies to the page's latest run. Returns the run (same shape as the optimization endpoint) — `acknowledged` once complete, otherwise still `pending`. Returns 422 when neither or both actions are given, 404 when the page has no run, and 409 for an edge-delivery (AXP-active) page — those go through the edge staging workflow.","operationId":"applySiteDiagnosticsOptimization","security":[{"HTTPBearer":["optimize"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyOptimizationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathOptimization"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/opportunities/by-type":{"get":{"tags":["opportunities"],"summary":"List Opportunity Types","description":"List a brand's optimization opportunities grouped by type — one row per best practice, with the projected site-score lift (`site_impact_pp`), how many pages it touches (`page_count`), and where those pages sit in the pipeline (`pending`/`reviewed`/`staged`/`deployed` counts).\n\nCounts and lift span the whole brand and match each type's detail view. Ordered most-affected first.","operationId":"listOpportunityTypes","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OptimizationTypeSummary"},"title":"Response Listopportunitytypes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/opportunities/by-type/{best_practice_id}":{"get":{"tags":["opportunities"],"summary":"Get Opportunity Type Detail","description":"One opportunity type's detail: the whole-type header (projected lift and per-state page counts) plus one paginated window of its affected pages, each with its pipeline `state` and the before/after content chunks inline.\n\nUse `state` to filter the page window (`all`, `pending`, `reviewed`, `staged`, `deployed`) and `limit`/`offset` to page through it — the header counts always span the whole type. Returns 404 when the brand has no opportunities of this type.","operationId":"getOpportunityTypeDetail","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"best_practice_id","in":"path","required":true,"schema":{"type":"string","title":"Best Practice Id"}},{"name":"state","in":"query","required":false,"schema":{"enum":["all","pending","reviewed","staged","deployed"],"type":"string","description":"Restrict the affected-page window to this pipeline state.","default":"all","title":"State"},"description":"Restrict the affected-page window to this pipeline state."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpportunityTypeDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{brand_id}/audit-scores/pages":{"get":{"tags":["audit-scores"],"summary":"List Page Audit Scores","description":"The latest AI-visibility score per page for a brand — retrievability and citability, each page's `url`, when it was scored (`generated_at`), its headroom (open work by severity), and the sitemap page it maps to (`mapped_page_id`, null when unmatched).\n\nPage through the whole brand with `limit` (max 1000) and `offset`. Ordered by page `url` (stable for pagination), not by score.","operationId":"listPageAuditScores","security":[{"HTTPBearer":["query"]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"integer","title":"Brand Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse_PageScoreModel_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"APIBrandListing":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"website":{"type":"string","title":"Website"},"status":{"type":"string","title":"Status"},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names","default":[]},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","default":[]},"alternative_websites":{"items":{"type":"string"},"type":"array","title":"Alternative Websites","default":[]},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false},"competitors":{"items":{"$ref":"#/components/schemas/APICompetitorListing"},"type":"array","title":"Competitors","default":[]},"personas":{"items":{"$ref":"#/components/schemas/APIPersonaListing"},"type":"array","title":"Personas","default":[]},"key_topics":{"items":{"type":"string"},"type":"array","title":"Key Topics","default":[]}},"type":"object","required":["id","name","description","website","status"],"title":"APIBrandListing"},"APIBrandPatchInput":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Brand display name."},"alternative_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alternative Names","description":"Alternative names or aliases for the brand."},"excluded_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Excluded Names","description":"Phrases that must never count as a mention of this brand, e.g. brand \"Caliber\" excluding \"Caliber Auto Wash\"."},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Primary website URL."},"alternative_websites":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alternative Websites","description":"Additional website URLs for the brand."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Short description of the brand."},"competitors":{"anyOf":[{"items":{"$ref":"#/components/schemas/APICompetitorPatchInput"},"type":"array"},{"type":"null"}],"title":"Competitors","description":"Full desired list of competitors. Existing competitors not in this list are archived."},"personas":{"anyOf":[{"items":{"$ref":"#/components/schemas/APIPersonaPatchInput"},"type":"array"},{"type":"null"}],"title":"Personas","description":"Full desired list of personas. Existing personas not in this list are archived."},"key_topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Topics","description":"Key topics associated with the brand."},"status":{"anyOf":[{"type":"string","enum":["lead","prospect","customer"]},{"type":"null"}],"title":"Status","description":"Brand status. Allowed values: lead, customer."},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive","description":"When true, the brand name and alternative_names are matched against AI responses with exact case. When false, matching is case-insensitive."}},"additionalProperties":true,"type":"object","title":"APIBrandPatchInput","description":"Partial update payload for a brand.\n\nOnly fields present in the request body are updated. Omitted fields are left unchanged.\nFor competitors and personas, the provided list replaces the current state:\nexisting records not included in the list are archived."},"APICompetitorCreateInput":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Display name of the competitor."},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names","description":"Alternative names or aliases for the competitor."},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","description":"Phrases that must never count as a mention of this competitor, e.g. a competitor 'Caliber' excluding 'Caliber Auto Wash'."},"websites":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","title":"Websites","description":"Website URLs associated with the competitor.","default":[]},"case_sensitive":{"type":"boolean","title":"Case Sensitive","description":"When true, name and alternative_names are matched against AI responses with exact case. Defaults to case-insensitive matching.","default":false}},"type":"object","required":["name"],"title":"APICompetitorCreateInput","description":"Input model for creating a competitor."},"APICompetitorInput":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names"},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","description":"Phrases that must never count as a mention of this competitor, e.g. a competitor 'Caliber' excluding 'Caliber Auto Wash'."},"websites":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","title":"Websites","default":[]},"case_sensitive":{"type":"boolean","title":"Case Sensitive","description":"When true, name and alternative_names are matched against AI responses with exact case. Defaults to case-insensitive matching.","default":false}},"type":"object","required":["name"],"title":"APICompetitorInput"},"APICompetitorListing":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names","default":[]},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","default":[]},"websites":{"items":{"type":"string"},"type":"array","title":"Websites","default":[]},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false}},"type":"object","required":["id","name"],"title":"APICompetitorListing"},"APICompetitorPatchInput":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"ID of an existing competitor to update. Omit to create a new competitor."},"name":{"type":"string","minLength":1,"title":"Name","description":"Display name of the competitor."},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names","description":"Alternative names or aliases for the competitor."},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","description":"Phrases that must never count as a mention of this competitor, e.g. a competitor 'Caliber' excluding 'Caliber Auto Wash'."},"websites":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","title":"Websites","description":"Website URLs associated with the competitor.","default":[]},"case_sensitive":{"type":"boolean","title":"Case Sensitive","description":"When true, name and alternative_names are matched against AI responses with exact case. Defaults to case-insensitive matching.","default":false}},"type":"object","required":["name"],"title":"APICompetitorPatchInput","description":"A competitor to create or update within a brand patch request."},"APICompetitorUpdateInput":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Display name of the competitor."},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names","description":"Alternative names or aliases for the competitor."},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","description":"Phrases that must never count as a mention of this competitor, e.g. a competitor 'Caliber' excluding 'Caliber Auto Wash'."},"websites":{"items":{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},"type":"array","title":"Websites","description":"Website URLs associated with the competitor.","default":[]},"case_sensitive":{"type":"boolean","title":"Case Sensitive","description":"When true, name and alternative_names are matched against AI responses with exact case. Defaults to case-insensitive matching.","default":false}},"type":"object","required":["name"],"title":"APICompetitorUpdateInput","description":"Input model for updating a competitor (full replace)."},"APICreateBrandInput":{"properties":{"name":{"type":"string","title":"Name"},"alternative_names":{"items":{"type":"string"},"type":"array","title":"Alternative Names"},"excluded_names":{"items":{"type":"string"},"type":"array","title":"Excluded Names","description":"Phrases that must never count as a mention of this brand, e.g. a brand 'Caliber' excluding 'Caliber Auto Wash'."},"website":{"type":"string","title":"Website"},"alternative_websites":{"items":{"type":"string"},"type":"array","title":"Alternative Websites","default":[]},"description":{"type":"string","title":"Description"},"competitors":{"items":{"$ref":"#/components/schemas/APICompetitorInput"},"type":"array","title":"Competitors","default":[]},"personas":{"items":{"$ref":"#/components/schemas/APIPersonaInput"},"type":"array","title":"Personas","default":[]},"key_topics":{"items":{"type":"string"},"type":"array","title":"Key Topics","default":[]},"status":{"type":"string","enum":["lead","prospect","customer"],"title":"Status","default":"customer"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","description":"When true, the brand name and alternative_names are matched against AI responses with exact case. Defaults to case-insensitive matching.","default":false}},"type":"object","required":["name","website","description"],"title":"APICreateBrandInput"},"APICreateBrandResponse":{"properties":{"id":{"type":"integer","title":"Id"}},"type":"object","required":["id"],"title":"APICreateBrandResponse"},"APIPersonaCreateInput":{"properties":{"name":{"type":"string","title":"Name","description":"Display name of the persona."},"description":{"type":"string","title":"Description","description":"Description of the persona."}},"type":"object","required":["name","description"],"title":"APIPersonaCreateInput","description":"Input model for creating a persona."},"APIPersonaInput":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"}},"type":"object","required":["name","description"],"title":"APIPersonaInput"},"APIPersonaListing":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","name","description"],"title":"APIPersonaListing"},"APIPersonaPatchInput":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"ID of an existing persona to update. Omit to create a new persona."},"name":{"type":"string","title":"Name","description":"Display name of the persona."},"description":{"type":"string","title":"Description","description":"Description of the persona."}},"type":"object","required":["name","description"],"title":"APIPersonaPatchInput","description":"A persona to create or update within a brand patch request."},"APIPersonaUpdateInput":{"properties":{"name":{"type":"string","title":"Name","description":"Display name of the persona."},"description":{"type":"string","title":"Description","description":"Description of the persona."}},"type":"object","required":["name","description"],"title":"APIPersonaUpdateInput","description":"Input model for updating a persona (full replace)."},"APIPromptInputModel":{"properties":{"text":{"type":"string","title":"Text","description":"The prompt text to track across AI platforms"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"Optional persona ID to associate with this prompt for segmented analysis"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"The customer journey stage this prompt represents. Must be the name of one of the brand's active stages (custom stage names included); omit to auto-categorize with an LLM against the brand's stage definitions. Default sets:\n- `Advice` - Seeking recommendations or guidance\n- `Awareness` - Exploring a topic or problem space\n- `Evaluation` - Assessing specific options\n- `Comparison` - Comparing multiple options\n- `Other` - Doesn't fit other categories"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Custom tags for categorizing and filtering prompts","default":[]},"key_topics":{"items":{"type":"string"},"type":"array","title":"Key Topics","description":"Key topics to associate with this prompt from the brand's topic list","default":[]},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Lowercase ISO 639-1 code of the language the prompt text is written in (e.g. `pt`). If omitted, the language is detected from the text, falling back to the brand's default language."},"platforms":{"items":{"type":"string","enum":["chatgpt","claude","google_ai_overviews","perplexity","meta","google_ai_mode","google_gemini","copilot","grok"]},"type":"array","title":"Platforms","description":"AI platforms to track this prompt on. If empty, defaults to all supported platforms.\n\n**Supported platforms:**\n- `chatgpt` - OpenAI ChatGPT\n- `claude` - Anthropic Claude\n- `google_ai_overviews` - Google AI Overviews (Search)\n- `perplexity` - Perplexity AI\n- `meta` - Meta AI\n- `google_ai_mode` - Google AI Mode\n- `google_gemini` - Google Gemini\n- `copilot` - Microsoft Copilot","default":[]}},"type":"object","required":["text"],"title":"APIPromptInputModel","description":"Input model for creating a new prompt to track AI visibility."},"APISignal":{"properties":{"id":{"type":"integer","title":"Id","description":"Signal ID. Stable within one detection; use for `getSignal`."},"detected_for_date":{"type":"string","format":"date","title":"Detected For Date","description":"Anchor date the nightly detection ran for (YYYY-MM-DD)."},"fingerprint":{"type":"string","title":"Fingerprint","description":"Stable identity of the underlying issue across nightly re-detections (hash of the slice + metric). An ongoing signal is re-raised daily under the same fingerprint; reactions are keyed on it."},"subject_kind":{"type":"string","enum":["brand","competitor"],"title":"Subject Kind","description":"Whose movement the signal describes: your `brand` or a `competitor`."},"alert_type":{"type":"string","enum":["level_change","trend"],"title":"Alert Type","description":"Detection kind: `level_change` (step shift) or `trend` (sustained drift)."},"scope":{"type":"string","enum":["account","account_platform","topic","topic_platform"],"title":"Scope","description":"Slice granularity: `account`, `account_platform`, `topic`, or `topic_platform`."},"metric":{"type":"string","title":"Metric","description":"Metric the signal fired on (e.g. `presence_rate`, `position_top_rate`, `cited_domain_rate`)."},"platform":{"type":"string","title":"Platform","description":"AI platform the signal was detected on. `(multi)` means the slice spans several platforms — see `slice.platforms` for the real list."},"direction":{"type":"string","enum":["up","down","none"],"title":"Direction","description":"Direction of the movement: `up`, `down`, `none`."},"tier":{"type":"string","enum":["high","confident","worth_a_look","provisional","low_confidence","underpowered","untested"],"title":"Tier","description":"Confidence tier, best first: `high`, `confident`, `worth_a_look`, `provisional`, then noise-floor tiers `low_confidence`, `underpowered`, `untested` (hidden by default)."},"current_value":{"type":"number","title":"Current Value","description":"Metric value over the current window (0-1 rate)."},"baseline_value":{"type":"number","title":"Baseline Value","description":"Metric value over the baseline window (0-1 rate)."},"delta_absolute":{"type":"number","title":"Delta Absolute","description":"`current_value - baseline_value` (positive = up)."},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Engine priority score used for the default sort; null for legacy rows."},"narrative_what":{"type":"string","title":"Narrative What","description":"One-line headline of what changed."},"narrative":{"anyOf":[{"$ref":"#/components/schemas/APISignalNarrative"},{"type":"null"}],"description":"Full narrative (what happened / why it matters / what to do), when available."},"slice":{"$ref":"#/components/schemas/APISignalSlice","description":"The data slice the signal was detected on."},"window_current_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Window Current Start","description":"Start of the current comparison window."},"window_current_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Window Current End","description":"End of the current comparison window."},"baseline_definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Definition","description":"Human-readable definition of the baseline window."},"url_movers":{"items":{"$ref":"#/components/schemas/APISignalUrlMover"},"type":"array","title":"Url Movers","description":"Per-URL citation movers behind the signal: the brand/competitor URLs whose distinct-response citation counts moved most between the baseline and current windows. Emitted for `cited_domain_rate` signals; empty for other metrics and older signals. Filterable via `mover_url`."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the signal row was created (UTC)."}},"type":"object","required":["id","detected_for_date","fingerprint","subject_kind","alert_type","scope","metric","platform","direction","tier","current_value","baseline_value","delta_absolute","narrative_what","slice","created_at"],"title":"APISignal","description":"A detected, statistically-tested movement in an AI-visibility metric."},"APISignalAnchors":{"properties":{"dates":{"items":{"type":"string","format":"date"},"type":"array","title":"Dates","description":"Distinct `detected_for_date` days with user-facing signals, newest first. Same population as `listSignals` with default filters."}},"type":"object","required":["dates"],"title":"APISignalAnchors","description":"Recent distinct detection dates that produced signals."},"APISignalNarrative":{"properties":{"what_happened":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"What Happened","description":"Plain-language description of the detected change."},"why_it_matters":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why It Matters","description":"Why the change is significant for the brand."},"what_to_do":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"What To Do","description":"Suggested next step or investigation."}},"type":"object","title":"APISignalNarrative","description":"Engine-generated narrative for a signal."},"APISignalReaction":{"properties":{"user_id":{"type":"integer","title":"User Id","description":"ID of the user the reaction belongs to."},"insight_id":{"type":"integer","title":"Insight Id","description":"Signal ID the reaction was last set on."},"fingerprint":{"type":"string","title":"Fingerprint","description":"Stable signal identity the reaction follows across re-detections."},"reaction":{"type":"string","enum":["useful","not_useful","dismissed","actioned"],"title":"Reaction","description":"The reaction value."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Free-text reason, when provided."},"surface":{"type":"string","enum":["in_app","email","slack","api"],"title":"Surface","description":"Where the reaction was set: `in_app`, `email`, `slack`, or `api`."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the reaction was first set (UTC)."},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the reaction was last changed (UTC)."}},"type":"object","required":["user_id","insight_id","fingerprint","reaction","surface","created_at","updated_at"],"title":"APISignalReaction","description":"A user's reaction to a signal's stable identity."},"APISignalReactionUpsert":{"properties":{"reaction":{"type":"string","enum":["useful","not_useful","dismissed","actioned"],"title":"Reaction","description":"Reaction to set: `useful`, `not_useful`, `dismissed`, or `actioned`."},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reason","description":"Optional free-text reason accompanying the reaction."}},"type":"object","required":["reaction"],"title":"APISignalReactionUpsert","description":"Request body for `setSignalReaction`."},"APISignalSlice":{"properties":{"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms","description":"AI platforms the slice covers. Empty means all platforms."},"topic_labels":{"items":{"type":"string"},"type":"array","title":"Topic Labels","description":"Topic labels the slice covers. Empty means all topics."},"geo_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Country","description":"Country the slice is restricted to, when geo-scoped."}},"type":"object","title":"APISignalSlice","description":"The data slice a signal was detected on."},"APISignalUrlMover":{"properties":{"normalized_url":{"type":"string","title":"Normalized Url","description":"Normalized cited URL (scheme and tracking params stripped)."},"owner":{"type":"string","enum":["brand","competitor"],"title":"Owner","description":"Whose domain the URL belongs to: `brand` or `competitor`."},"competitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competitor Id","description":"Competitor ID for `competitor`-owned URLs."},"competitor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Competitor Name","description":"Competitor name for `competitor`-owned URLs."},"current_responses":{"type":"integer","title":"Current Responses","description":"Distinct responses citing the URL in the current window."},"baseline_responses":{"type":"integer","title":"Baseline Responses","description":"Distinct responses citing the URL in the baseline window."},"current_prompts":{"type":"integer","title":"Current Prompts","description":"Distinct prompts whose responses cite the URL in the current window."},"baseline_prompts":{"type":"integer","title":"Baseline Prompts","description":"Distinct prompts whose responses cite the URL in the baseline window."},"contribution":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contribution","description":"Exact share of the signal's metric delta attributed to this URL. Brand-owned URLs only; null on competitor entries and older signals."}},"type":"object","required":["normalized_url","owner","current_responses","baseline_responses","current_prompts","baseline_prompts"],"title":"APISignalUrlMover","description":"A per-URL citation mover backing a `cited_domain_rate` signal."},"AgentTrafficMeta":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date","description":"Start date of the query range."},"end_date":{"type":"string","format":"date","title":"End Date","description":"End date of the query range."},"time_bucket":{"type":"string","enum":["day","week"],"title":"Time Bucket","description":"Time aggregation bucket used for grouping results."}},"type":"object","required":["start_date","end_date","time_bucket"],"title":"AgentTrafficMeta","description":"Metadata about the agent traffic query results."},"AgentTrafficResponse":{"properties":{"meta":{"$ref":"#/components/schemas/AgentTrafficMeta","description":"Query metadata including fields and date range."},"data":{"items":{"$ref":"#/components/schemas/AgentTrafficRow"},"type":"array","title":"Data","description":"Array of agent traffic records matching the query criteria."}},"type":"object","required":["meta","data"],"title":"AgentTrafficResponse","description":"Response containing agent traffic data with metadata and aggregated traffic records."},"AgentTrafficRow":{"properties":{"requests":{"type":"integer","title":"Requests","description":"Number of requests/hits for this combination of dimensions."},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date","description":"Date of the traffic record in YYYY-MM-DD format."},"site":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site","description":"The site domain being analyzed."},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"URL path on the site."},"agent_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Source","description":"The source/origin of the agent (e.g., OpenAI, Google, Anthropic, Microsoft)."},"agent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Type","description":"Classification of the agent type (e.g., GPTBot, ClaudeBot, Google-Extended, Googlebot)."}},"additionalProperties":true,"type":"object","required":["requests"],"title":"AgentTrafficRow","description":"A single row of agent traffic data.\n\nFields present depend on the dimensions requested in the query."},"AggregationGranularity":{"type":"string","enum":["daily","weekly","monthly"]},"ApplyOptimizationRequest":{"properties":{"path":{"type":"string","minLength":1,"title":"Path","description":"The page path, e.g. `/about`."},"approve_all":{"type":"boolean","title":"Approve All","description":"Accept every changed block. Mutually exclusive with `reviews`.","default":false},"reviews":{"anyOf":[{"items":{"$ref":"#/components/schemas/OptimizationReview"},"type":"array"},{"type":"null"}],"title":"Reviews","description":"Per-block verdicts, keyed by chunk `id` — a verdict for every changed block (`approved` keeps our version, `rejected` keeps the original). Mutually exclusive with `approve_all`."}},"type":"object","required":["path"],"title":"ApplyOptimizationRequest","description":"Body for acknowledging a page's optimization as acted on off-platform.\n\nExactly one of ``approve_all`` or ``reviews`` — closing a page is a declared action, so there's\nno implicit \"accept everything\" default."},"Assistant":{"properties":{"name":{"type":"string","title":"Name","description":"The name of the assistant, such as ChatGPT or Perplexity."},"does_training":{"type":"boolean","title":"Does Training","description":"Whether the assistant operates its own training data collection. Excludes assistants that use models from other providers or that train on third party corpuses, such as CommonCrawl."},"does_retrieval":{"type":"boolean","title":"Does Retrieval","description":"Whether the assistant can retrieve web content."},"does_search_indexing":{"type":"boolean","title":"Does Search Indexing","description":"Whether the assistant can search the web."},"can_cite":{"type":"boolean","title":"Can Cite","description":"Whether the assistant can cite web content."},"search_agents":{"items":{"$ref":"#/components/schemas/UserAgent"},"type":"array","title":"Search Agents","default":[]},"retrieval_agents":{"items":{"$ref":"#/components/schemas/UserAgent"},"type":"array","title":"Retrieval Agents","default":[]},"training_agents":{"items":{"$ref":"#/components/schemas/UserAgent"},"type":"array","title":"Training Agents","default":[]}},"type":"object","required":["name","does_training","does_retrieval","does_search_indexing","can_cite"],"title":"Assistant","description":"Represents an AI assistant, such as ChatGPT or Perplexity. We care primarily about assistants that can do web searches and return citations.\nIn order for a web page to be citable by an assistant, it must be indexable by a search user agent and retrievable by a retrieval user agent."},"AssistantStatus":{"properties":{"assistant":{"$ref":"#/components/schemas/Assistant"},"trainable":{"type":"string","enum":["ok","failed","not_applicable","unknown"],"title":"Trainable","readOnly":true},"findable":{"type":"string","enum":["ok","failed","not_applicable","unknown"],"title":"Findable","readOnly":true},"retrievable":{"type":"string","enum":["ok","failed","not_applicable","unknown"],"title":"Retrievable","readOnly":true},"sample_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Title","readOnly":true},"sample_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Description","readOnly":true},"sample_final_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Final Url","readOnly":true},"can_retrieve":{"type":"boolean","title":"Can Retrieve","readOnly":true},"retrieval_response_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retrieval Response Time","readOnly":true},"retrieval_block_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieval Block Reason","readOnly":true}},"type":"object","required":["assistant","trainable","findable","retrievable","sample_title","sample_description","sample_final_url","can_retrieve","retrieval_response_time","retrieval_block_reason"],"title":"AssistantStatus"},"BrandListing":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"website":{"type":"string","title":"Website"}},"type":"object","required":["id","name","website"],"title":"BrandListing"},"CitationPipeline":{"properties":{"search":{"$ref":"#/components/schemas/UserAgentStatusPipeline"},"retrieval":{"$ref":"#/components/schemas/UserAgentStatusPipeline"}},"type":"object","required":["search","retrieval"],"title":"CitationPipeline"},"CollectionCreateResponse":{"properties":{"prompt_id":{"type":"integer","title":"Prompt Id","description":"The prompt ID that collection was triggered for"},"events":{"items":{"$ref":"#/components/schemas/CollectionEventResult"},"type":"array","title":"Events","description":"List of triggered collection events, one per platform"}},"type":"object","required":["prompt_id","events"],"title":"CollectionCreateResponse","description":"Response from triggering on-demand collection."},"CollectionEventResult":{"properties":{"platform":{"type":"string","title":"Platform","description":"The platform collection was triggered for"},"inngest_event_id":{"type":"string","title":"Inngest Event Id","description":"The Inngest event ID for tracking"}},"type":"object","required":["platform","inngest_event_id"],"title":"CollectionEventResult","description":"Result of a triggered collection event."},"CollectionRequest":{"properties":{"prompt_id":{"type":"integer","title":"Prompt Id","description":"The ID of the prompt to collect"},"platforms":{"items":{"type":"string","enum":["chatgpt","claude","google_ai_overviews","perplexity","meta","google_ai_mode","google_gemini","copilot","grok"]},"type":"array","minItems":1,"title":"Platforms","description":"AI platforms to trigger collection on.\n\n**Supported platforms:**\n- `chatgpt` - OpenAI ChatGPT\n- `claude` - Anthropic Claude\n- `google_ai_overviews` - Google AI Overviews (Search)\n- `perplexity` - Perplexity AI\n- `meta` - Meta AI\n- `google_ai_mode` - Google AI Mode\n- `google_gemini` - Google Gemini\n- `copilot` - Microsoft Copilot"}},"type":"object","required":["prompt_id","platforms"],"title":"CollectionRequest","description":"Request to trigger on-demand collection for a prompt across specified platforms."},"CollectionResponse_APICompetitorListing_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/APICompetitorListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[APICompetitorListing]"},"CollectionResponse_APIPersonaListing_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/APIPersonaListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[APIPersonaListing]"},"CollectionResponse_APISignalReaction_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/APISignalReaction"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[APISignalReaction]"},"CollectionResponse_APISignal_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/APISignal"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[APISignal]"},"CollectionResponse_BrandListing_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/BrandListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[BrandListing]"},"CollectionResponse_PageScoreModel_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/PageScoreModel"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[PageScoreModel]"},"CollectionResponse_PageTestListing_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/PageTestListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[PageTestListing]"},"CollectionResponse_PathDiagnostics_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/PathDiagnostics"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[PathDiagnostics]"},"CollectionResponse_PromptListing_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/PromptListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[PromptListing]"},"CollectionResponse_ResponseListing_":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/ResponseListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]}},"type":"object","required":["total","items"],"title":"CollectionResponse[ResponseListing]"},"ContentNode":{"properties":{"type":{"type":"string","const":"html","title":"Type","default":"html"},"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"ContentNode","description":"A single renderable unit of content. Only `html` is supported (per the RFC)."},"DiagnosticOpportunity":{"properties":{"best_practice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Practice Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"bucket":{"type":"string","enum":["hygiene","transformation","enrichment"],"title":"Bucket"},"bucket_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bucket Label"},"recommended_change":{"type":"string","title":"Recommended Change"},"expected_lift_pp":{"type":"number","title":"Expected Lift Pp"},"severity":{"type":"string","enum":["low","medium","high"],"title":"Severity"},"heading_path":{"items":{"type":"string"},"type":"array","title":"Heading Path","default":[]}},"type":"object","required":["bucket","recommended_change","expected_lift_pp","severity"],"title":"DiagnosticOpportunity","description":"A recommended change for a page — the \"what to improve\" list."},"DiagnosticStrength":{"properties":{"best_practice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Practice Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"message":{"type":"string","title":"Message"},"contribution_pp":{"type":"number","title":"Contribution Pp"},"heading_path":{"items":{"type":"string"},"type":"array","title":"Heading Path","default":[]}},"type":"object","required":["message","contribution_pp"],"title":"DiagnosticStrength","description":"Something a page already does well — the \"what's working\" list."},"DisplayedScore":{"properties":{"retrievability":{"type":"number","title":"Retrievability"},"citability":{"type":"number","title":"Citability"}},"type":"object","required":["retrievability","citability"],"title":"DisplayedScore","description":"The two numbers we put on screen, both 0-100. citability is vs the winning page (50 = parity\nwith it); the loser-side floor stays a diagnostic and isn't surfaced here."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IntentVsPage":{"properties":{"intent_of_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent Of Page","description":"The intent of the page based on the provided title, description, and URL."},"markdown_respresents_intent":{"type":"boolean","title":"Markdown Respresents Intent","description":"Whether the intent of the page is represented in the provided Markdown."},"difference_explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difference Explanation","description":"If the intent is not represented in the Markdown, explain why."}},"type":"object","required":["markdown_respresents_intent"],"title":"IntentVsPage"},"MetricRowModel":{"properties":{"date":{"type":"string","title":"Date","description":"Date in ISO 8601 format (YYYY-MM-DD)"},"count_by_platform":{"additionalProperties":{"type":"integer"},"type":"object","title":"Count By Platform","description":"Counts keyed by AI platform name (e.g. OpenAI, Perplexity, Gemini)"}},"type":"object","required":["date","count_by_platform"],"title":"MetricRowModel","description":"A single time-series data point with counts broken down by AI platform."},"NetworkUserAgentResult":{"properties":{"identifier":{"type":"string","title":"Identifier"},"concrete_identifier":{"type":"string","title":"Concrete Identifier"},"raw_response":{"anyOf":[{"$ref":"#/components/schemas/UserAgentResponse"},{"type":"null"}]},"status":{"type":"string","enum":["allowed","blocked","unknown","not_applicable"],"title":"Status","readOnly":true}},"type":"object","required":["identifier","concrete_identifier","status"],"title":"NetworkUserAgentResult","description":"The status of a particular user agent and URL.\nIt's possible we don't request for a particular user agent and URL, in which case the status is \"not_applicable\".\nOtherwise, this wraps the UserAgentResponse and adds additional computed context."},"OpportunityTypeChunkDiff":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"original_html":{"type":"string","title":"Original Html"},"optimized_html":{"type":"string","title":"Optimized Html"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"verdict":{"anyOf":[{"type":"string","enum":["approved","rejected"]},{"type":"null"}],"title":"Verdict"}},"type":"object","required":["chunk_id","original_html","optimized_html"],"title":"OpportunityTypeChunkDiff","description":"One before/after block of a page, scoped to the opportunity type under review."},"OpportunityTypeDetail":{"properties":{"best_practice_id":{"type":"string","title":"Best Practice Id"},"name":{"type":"string","title":"Name"},"checking":{"type":"string","title":"Checking"},"bucket":{"type":"string","enum":["hygiene","transformation","enrichment"],"title":"Bucket"},"action":{"type":"string","title":"Action"},"site_impact_pp":{"type":"number","title":"Site Impact Pp"},"page_count":{"type":"integer","title":"Page Count"},"pending_count":{"type":"integer","title":"Pending Count"},"reviewed_count":{"type":"integer","title":"Reviewed Count"},"staged_count":{"type":"integer","title":"Staged Count"},"deployed_count":{"type":"integer","title":"Deployed Count"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"},"filtered_total":{"type":"integer","title":"Filtered Total"},"pages":{"items":{"$ref":"#/components/schemas/OpportunityTypePageReview"},"type":"array","title":"Pages"}},"type":"object","required":["best_practice_id","name","checking","bucket","action","site_impact_pp","page_count","pending_count","reviewed_count","staged_count","deployed_count","offset","limit","filtered_total","pages"],"title":"OpportunityTypeDetail","description":"One opportunity type's detail view: catalog header, per-state counts, and a page of its\naffected pages. The header and every count span the WHOLE type (independent of the state filter\nand pagination); only `pages` is the sliced, state-filtered window that carries chunk diffs."},"OpportunityTypePageReview":{"properties":{"opportunity_id":{"type":"string","title":"Opportunity Id"},"target_url":{"type":"string","title":"Target Url"},"path":{"type":"string","title":"Path"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"state":{"type":"string","enum":["pending","reviewed","staged","deployed","rejected"],"title":"State"},"expected_lift_pp":{"type":"number","title":"Expected Lift Pp"},"chunks":{"items":{"$ref":"#/components/schemas/OpportunityTypeChunkDiff"},"type":"array","title":"Chunks"}},"type":"object","required":["opportunity_id","target_url","path","state","expected_lift_pp"],"title":"OpportunityTypePageReview","description":"A page affected by one opportunity type, with its optimizer_v2 run state and the type's diffs."},"OptimizationChunk":{"properties":{"id":{"type":"string","title":"Id"},"order":{"type":"integer","title":"Order"},"category":{"anyOf":[{"type":"string","enum":["enriched","transformed","removed"]},{"type":"null"}],"title":"Category"},"status":{"anyOf":[{"type":"string","enum":["pending","approved","rejected"]},{"type":"null"}],"title":"Status"},"before":{"items":{"$ref":"#/components/schemas/ContentNode"},"type":"array","title":"Before","default":[]},"after":{"items":{"$ref":"#/components/schemas/ContentNode"},"type":"array","title":"After","default":[]}},"type":"object","required":["id","order"],"title":"OptimizationChunk","description":"One content block's before/after. `category` is null for an unchanged block; `status` is the\nreviewer's verdict (`approved`/`rejected`) or `pending` when the run isn't reviewed — a rejected\nblock's `after` was NOT accepted, so it must be distinguishable from an approved one."},"OptimizationReview":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["approved","rejected"],"title":"Status"}},"type":"object","required":["id","status"],"title":"OptimizationReview","description":"A per-block verdict for the apply body: `approved` keeps our optimized block, `rejected`\nkeeps the page's original."},"OptimizationSummary":{"properties":{"transformed":{"type":"integer","title":"Transformed"},"enriched":{"type":"integer","title":"Enriched"},"removed":{"type":"integer","title":"Removed"},"tokens_after":{"type":"integer","title":"Tokens After"}},"type":"object","required":["transformed","enriched","removed","tokens_after"],"title":"OptimizationSummary","description":"Per-category chunk counts and the optimized token total for a run."},"OptimizationTypeSummary":{"properties":{"best_practice_id":{"type":"string","title":"Best Practice Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"bucket":{"type":"string","enum":["hygiene","transformation","enrichment"],"title":"Bucket"},"bucket_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bucket Label"},"bucket_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bucket Description"},"action":{"type":"string","title":"Action"},"site_impact_pp":{"type":"number","title":"Site Impact Pp"},"page_count":{"type":"integer","title":"Page Count"},"pending_count":{"type":"integer","title":"Pending Count"},"reviewed_count":{"type":"integer","title":"Reviewed Count"},"staged_count":{"type":"integer","title":"Staged Count"},"deployed_count":{"type":"integer","title":"Deployed Count"}},"type":"object","required":["best_practice_id","name","bucket","action","site_impact_pp","page_count","pending_count","reviewed_count","staged_count","deployed_count"],"title":"OptimizationTypeSummary","description":"One opportunity type's row in the Optimizations by-type list: the same header its detail view\nshows — counts and projected lift computed server-side over the WHOLE type — so the list and the\ndetail always agree, with no client-side cap. Only types with a reviewable change are listed."},"OwnerTimeSeriesPoint":{"properties":{"time_bucket":{"type":"string","title":"Time Bucket","description":"Date string for the time bucket (YYYY-MM-DD)"},"brand":{"type":"integer","title":"Brand","description":"Observation count for brand-owned domains"},"competitor":{"type":"integer","title":"Competitor","description":"Observation count for competitor-owned domains"},"other":{"type":"integer","title":"Other","description":"Observation count for third-party domains"}},"type":"object","required":["time_bucket","brand","competitor","other"],"title":"OwnerTimeSeriesPoint","description":"A single time bucket with observation counts by owner type."},"PageAuditCreateRequest":{"properties":{"urls":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Urls","description":"URLs to audit"}},"type":"object","required":["urls"],"title":"PageAuditCreateRequest","description":"Request to create one or more page audits."},"PageAuditRecord":{"properties":{"url":{"type":"string","title":"Url"},"page_audit_id":{"type":"string","title":"Page Audit Id"}},"type":"object","required":["url","page_audit_id"],"title":"PageAuditRecord","description":"A single page audit record."},"PageHeadroomModel":{"properties":{"high":{"type":"integer","title":"High"},"medium":{"type":"integer","title":"Medium"},"low":{"type":"integer","title":"Low"}},"type":"object","required":["high","medium","low"],"title":"PageHeadroomModel","description":"How much optimization work is still open on one page: a plain count of its\nsurfaced opportunities, broken out by severity.\n\nDeliberately independent of the page's audit score. The score frames the goal as \"get to 100\",\nwhich is the framing this metric exists to replace — so headroom neither reads the score nor is\ncapped against it. It answers \"how much is there to do here\", not \"how far from perfect is this\".\n\nCounts, not modeled point-gains: `expected_lift_pp` is a per-recommendation estimate, and\nsumming several of them treats overlapping fixes as independent. A count makes no claim the\ndata can't support.\n\nA page with no surfaced opportunity carries zeroes — nothing left to do. That differs from a\npage never audited, which has no headroom at all (see `PageScoreModel.headroom`)."},"PageScoreModel":{"properties":{"url":{"type":"string","title":"Url"},"model_version":{"type":"string","title":"Model Version"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"score":{"$ref":"#/components/schemas/DisplayedScore"},"mapped_page_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mapped Page Id"},"headroom":{"anyOf":[{"$ref":"#/components/schemas/PageHeadroomModel"},{"type":"null"}]}},"type":"object","required":["url","model_version","generated_at","score"],"title":"PageScoreModel","description":"One page's latest score for the brand."},"PageScores":{"properties":{"retrievability":{"type":"number","title":"Retrievability"},"citeability":{"type":"number","title":"Citeability"}},"type":"object","required":["retrievability","citeability"],"title":"PageScores","description":"Page-level AI-visibility scores as percentages (0-100)."},"PageTestCheckResult":{"properties":{"section":{"type":"string","enum":["access_controls","content_delivery","content_quality"],"title":"Section"},"check_id":{"type":"string","enum":["robots_txt_present","robots_txt_critical_allowed","robots_txt_explicit_allow","network_bots_allowed","network_bot_blocking_explicit","page_works_without_js","page_loads_in_under_5s","meaningful_title_and_description","missing_javascript","substantial_image_content","mostly_video_content","page_length_ok","chatgpt_prerendered_content"],"title":"Check Id"},"check_outcome":{"type":"string","enum":["passed","failed","skipped","warning"],"title":"Check Outcome"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"help_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Help Text"},"check_score":{"type":"integer","title":"Check Score","readOnly":true},"check_description":{"type":"string","title":"Check Description","readOnly":true}},"type":"object","required":["section","check_id","check_outcome","check_score","check_description"],"title":"PageTestCheckResult"},"PageTestListing":{"properties":{"request_id":{"type":"string","title":"Request Id"},"brand_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Brand Id"},"url":{"type":"string","title":"Url"},"status":{"type":"string","enum":["pending","running","completed","failed"],"title":"Status"},"orchestration_status":{"anyOf":[{"type":"string","enum":["audit","optimizing","deploying","completed","failed"]},{"type":"null"}],"title":"Orchestration Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["request_id","url","status","created_at","updated_at"],"title":"PageTestListing"},"PageTestResponse":{"properties":{"url":{"type":"string","title":"Url"},"status":{"type":"string","enum":["pending","running","completed","failed"],"title":"Status"},"result":{"anyOf":[{"$ref":"#/components/schemas/PageTestResult"},{"type":"null"}]},"orchestration_status":{"anyOf":[{"type":"string","enum":["audit","optimizing","deploying","completed","failed"]},{"type":"null"}],"title":"Orchestration Status"},"optimization_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Optimization Run Id"},"axp_version_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Axp Version Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"is_robots_txt_accessible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Robots Txt Accessible"}},"type":"object","required":["url","status","result","created_at","updated_at"],"title":"PageTestResponse"},"PageTestResult":{"properties":{"version":{"type":"integer","enum":[1,2],"title":"Version","default":1},"checks":{"items":{"$ref":"#/components/schemas/PageTestCheckResult"},"type":"array","title":"Checks"},"visitor_preview_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visitor Preview Image Url"},"ai_preview_markdown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Preview Markdown"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"final_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Url"},"assistant_statuses":{"items":{"$ref":"#/components/schemas/AssistantStatus"},"type":"array","title":"Assistant Statuses"},"screenshot_vs_page":{"anyOf":[{"$ref":"#/components/schemas/ScreenshotVsPage"},{"type":"null"}]},"intent_vs_page":{"anyOf":[{"$ref":"#/components/schemas/IntentVsPage"},{"type":"null"}]},"key_question_answers":{"items":{"$ref":"#/components/schemas/QuestionAnswer"},"type":"array","title":"Key Question Answers"},"access_controls_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Access Controls Score","readOnly":true},"content_delivery_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Content Delivery Score","readOnly":true},"content_quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Content Quality Score","readOnly":true},"access_controls_succeeded":{"type":"integer","title":"Access Controls Succeeded","readOnly":true},"content_delivery_succeeded":{"type":"integer","title":"Content Delivery Succeeded","readOnly":true},"content_quality_succeeded":{"type":"integer","title":"Content Quality Succeeded","readOnly":true},"access_controls_failed":{"type":"integer","title":"Access Controls Failed","readOnly":true},"content_delivery_failed":{"type":"integer","title":"Content Delivery Failed","readOnly":true},"content_quality_failed":{"type":"integer","title":"Content Quality Failed","readOnly":true},"access_controls_total":{"type":"integer","title":"Access Controls Total","readOnly":true},"content_delivery_total":{"type":"integer","title":"Content Delivery Total","readOnly":true},"content_quality_total":{"type":"integer","title":"Content Quality Total","readOnly":true}},"type":"object","required":["access_controls_score","content_delivery_score","content_quality_score","access_controls_succeeded","content_delivery_succeeded","content_quality_succeeded","access_controls_failed","content_delivery_failed","content_quality_failed","access_controls_total","content_delivery_total","content_quality_total"],"title":"PageTestResult"},"PathDiagnostics":{"properties":{"path":{"type":"string","title":"Path"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"content_sha1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Sha1"},"model_version":{"type":"string","title":"Model Version"},"scores":{"$ref":"#/components/schemas/PageScores"},"opportunities":{"items":{"$ref":"#/components/schemas/DiagnosticOpportunity"},"type":"array","title":"Opportunities","default":[]},"strengths":{"items":{"$ref":"#/components/schemas/DiagnosticStrength"},"type":"array","title":"Strengths","default":[]},"optimization_status":{"anyOf":[{"type":"string","enum":["pending","completed","staged","deployed","retired","outdated","acknowledged"]},{"type":"null"}],"title":"Optimization Status"},"acknowledged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Acknowledged At"}},"type":"object","required":["path","generated_at","model_version","scores"],"title":"PathDiagnostics","description":"Endpoint 1 item: one page's latest audit."},"PathOptimization":{"properties":{"path":{"type":"string","title":"Path"},"status":{"type":"string","enum":["pending","completed","staged","deployed","retired","outdated","acknowledged"],"title":"Status"},"summary":{"$ref":"#/components/schemas/OptimizationSummary"},"chunks":{"items":{"$ref":"#/components/schemas/OptimizationChunk"},"type":"array","title":"Chunks","default":[]}},"type":"object","required":["path","status","summary"],"title":"PathOptimization","description":"Endpoint 2 response: a page's latest optimization run with before/after chunks."},"PromptListing":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier for the prompt"},"text":{"type":"string","title":"Text","description":"The prompt text being tracked"},"stage":{"type":"string","title":"Stage","description":"The customer journey stage this prompt represents — one of the brand's stages (custom stage names included)"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"ID of the associated persona, if any"},"platforms":{"items":{"type":"string","enum":["chatgpt","claude","google_ai_overviews","perplexity","meta","google_ai_mode","google_gemini","copilot","grok"]},"type":"array","title":"Platforms","description":"AI platforms this prompt is tracked on"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Custom tags assigned to this prompt"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics","description":"Auto-detected or assigned topics for this prompt"},"branded":{"type":"boolean","title":"Branded","description":"Whether this prompt explicitly mentions the brand"},"favorite":{"type":"boolean","title":"Favorite","description":"Whether this prompt is marked as a favorite"},"status":{"type":"string","enum":["active","paused","archived"],"title":"Status","description":"Lifecycle status of the prompt (`active`, `paused`, or `archived`)"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Timestamp when the prompt was created"}},"type":"object","required":["id","text","stage","persona_id","platforms","tags","topics","branded","favorite","status","created_at"],"title":"PromptListing","description":"Represents a prompt being tracked for AI visibility, including its configuration and metadata."},"QueryFanout":{"properties":{"queries":{"items":{"type":"string"},"type":"array","title":"Queries"},"engine_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Engine Metadata"}},"type":"object","required":["queries"],"title":"QueryFanout","description":"Query fan-out data: search queries an AI engine used internally."},"QuestionAnswer":{"properties":{"question":{"type":"string","title":"Question"},"answer":{"type":"string","title":"Answer"},"rationale":{"type":"string","title":"Rationale"}},"type":"object","required":["question","answer","rationale"],"title":"QuestionAnswer"},"ResponseCitation":{"properties":{"url":{"type":"string","title":"Url","description":"The full URL of the cited source"},"domain":{"type":"string","title":"Domain","description":"The extracted registered domain from the URL"},"source_type":{"type":"string","title":"Source Type","description":"Classification of the citation source based on domain ownership:\n- `brand` - URL belongs to the tracked brand\n- `competitor` - URL belongs to a configured competitor\n- `other` - URL belongs to neither brand nor competitor"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The page title from the citation, when available"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet","description":"A text snippet or description from the citation, when available"}},"type":"object","required":["url","domain","source_type"],"title":"ResponseCitation","description":"A citation (source URL) referenced in an AI response, with automatic source classification."},"ResponseCompetitorListing":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier for the competitor"},"name":{"type":"string","title":"Name","description":"Display name of the competitor"},"present":{"type":"boolean","title":"Present","description":"Whether the competitor was mentioned in this response"},"position":{"anyOf":[{"type":"string","enum":["top","middle","bottom"]},{"type":"null"}],"title":"Position","description":"Where the competitor appeared in the response:\n- `top` - Mentioned in the first third of the response\n- `middle` - Mentioned in the middle third\n- `bottom` - Mentioned in the last third"},"sentiment":{"anyOf":[{"type":"string","enum":["positive","mixed","negative","none"]},{"type":"null"}],"title":"Sentiment","description":"The sentiment of how the competitor was described:\n- `positive` - Favorable or recommending tone\n- `mixed` - Neutral or balanced tone\n- `negative` - Unfavorable or critical tone\n- `none` - Mentioned without sentiment"}},"type":"object","required":["id","name","present"],"title":"ResponseCompetitorListing","description":"Evaluation data for a competitor mentioned in an AI response."},"ResponseListing":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique identifier for this response"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Timestamp when the response was collected"},"prompt_id":{"type":"integer","title":"Prompt Id","description":"ID of the prompt that generated this response"},"prompt":{"type":"string","title":"Prompt","description":"The prompt text that was sent to the AI platform"},"persona_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Persona Id","description":"ID of the persona used for this response, if any"},"persona_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persona Name","description":"Display name of the persona, if any"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country code for the geographic context of this response"},"stage":{"type":"string","title":"Stage","description":"Customer journey stage of the prompt — one of the brand's stages (custom stage names included)"},"branded":{"type":"boolean","title":"Branded","description":"Whether the prompt explicitly mentions the brand"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Custom tags associated with the prompt","default":[]},"key_topics":{"items":{"type":"string"},"type":"array","title":"Key Topics","description":"Topics associated with the prompt","default":[]},"platform":{"type":"string","title":"Platform","description":"The AI platform that generated this response (e.g., chatgpt, claude, perplexity)"},"brand_present":{"type":"boolean","title":"Brand Present","description":"Whether the brand was mentioned in the AI response"},"brand_sentiment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Sentiment","description":"Sentiment of the brand mention:\n- `positive` - Favorable or recommending tone\n- `mixed` - Neutral or balanced tone\n- `negative` - Unfavorable or critical tone\n- `none` - Mentioned without sentiment"},"brand_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Position","description":"Where the brand appeared in the response:\n- `top` - Mentioned in the first third\n- `middle` - Mentioned in the middle third\n- `bottom` - Mentioned in the last third"},"competitors_present":{"items":{"type":"string"},"type":"array","title":"Competitors Present","description":"List of competitor names mentioned in the response","default":[]},"response_text":{"type":"string","title":"Response Text","description":"The full text of the AI-generated response"},"citations":{"items":{"$ref":"#/components/schemas/ResponseCitation"},"type":"array","title":"Citations","description":"URLs cited by the AI platform in this response, with source classification","default":[]},"competitors":{"items":{"$ref":"#/components/schemas/ResponseCompetitorListing"},"type":"array","title":"Competitors","description":"Detailed evaluation data for each configured competitor","default":[]},"query_fanout":{"anyOf":[{"$ref":"#/components/schemas/QueryFanout"},{"type":"null"}],"description":"Search queries generated by the AI platform during query fan-out turns"},"shopping_results":{"items":{"$ref":"#/components/schemas/ShoppingResult"},"type":"array","title":"Shopping Results","description":"Shopping product listings surfaced by the AI platform in this response, if any","default":[]},"sponsored_ads":{"items":{"$ref":"#/components/schemas/SponsoredAd"},"type":"array","title":"Sponsored Ads","description":"Sponsored ads the AI platform displayed with this response, if any. Excludes auction candidates that were served but never displayed.","default":[]}},"type":"object","required":["id","created_at","prompt_id","prompt","persona_id","stage","branded","platform","brand_present","response_text"],"title":"ResponseListing","description":"A complete AI response (observation) with evaluation data, citations, and competitor analysis.\n\nRepresents a single answer from an AI platform to a tracked prompt."},"RobotsTxtUserAgentResult":{"properties":{"identifier":{"type":"string","title":"Identifier"},"concrete_identifier":{"type":"string","title":"Concrete Identifier"},"status":{"type":"string","enum":["allowed","blocked","unknown","not_applicable"],"title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"relevant_entries":{"items":{"type":"string"},"type":"array","title":"Relevant Entries"}},"type":"object","required":["identifier","concrete_identifier","status"],"title":"RobotsTxtUserAgentResult","description":"Represents the result of checking a particular user agent and URL against the robots.txt file."},"ScreenshotVsPage":{"properties":{"screenshot_is_representative":{"type":"boolean","title":"Screenshot Is Representative","description":"Whether the screenshot has materially the same text content as the provided Markdown. If the screenshot is cut off at the bottom, that's OK. Compare the content you can see. Ignore illustrations and graphic images in the screenshot."},"difference_explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difference Explanation","description":"If the screenshot does not match the Markdown, explain why."},"missing_content_from_markdown":{"items":{"type":"string"},"type":"array","title":"Missing Content From Markdown","description":"If the screenshot is missing content that is present in the Markdown, explain what is missing."},"importance_of_missing_content":{"type":"string","enum":["critical","important","minor","irrelevant"],"title":"Importance Of Missing Content","description":"The importance of the missing content to the user's experience of the page.","default":"critical"}},"type":"object","required":["screenshot_is_representative"],"title":"ScreenshotVsPage"},"SegmentTotal":{"properties":{"name":{"type":"string","title":"Name"},"observation_count":{"type":"integer","title":"Observation Count"}},"type":"object","required":["name","observation_count"],"title":"SegmentTotal","description":"Observation count for a citation segment, computed server-side."},"ShoppingPurchasingOption":{"properties":{"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"merchant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merchant"}},"type":"object","title":"ShoppingPurchasingOption"},"ShoppingResult":{"properties":{"url":{"type":"string","title":"URL","description":"The URL of the shopping result"},"title":{"type":"string","title":"Title","description":"The title of the shopping result"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"all_images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"All Images"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"reviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviews"},"purchasing_options":{"anyOf":[{"items":{"$ref":"#/components/schemas/ShoppingPurchasingOption"},"type":"array"},{"type":"null"}],"title":"Purchasing Options"}},"type":"object","required":["url","title"],"title":"ShoppingResult"},"SitemapPageDetail":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique page identifier"},"url":{"type":"string","title":"Url","description":"Full URL of the page"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"HTML title of the page"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Meta description of the page"},"depth":{"type":"integer","title":"Depth","description":"URL path depth (0 = root)"},"audit_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audit Score","description":"AI search readiness score (0-100)"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"The canonical URL if different from this page's URL"},"is_priority":{"type":"boolean","title":"Is Priority","description":"Whether this page matches a priority_page/priority_path override for the brand"},"has_optimized_content":{"type":"boolean","title":"Has Optimized Content","description":"Whether this page has active AXP optimized content deployed"},"last_indexed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Indexed","description":"When the page content was last indexed"},"content_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Content Updated At","description":"When the cached page content was last updated"}},"type":"object","required":["id","url","title","description","depth","audit_score","canonical_url","is_priority","has_optimized_content","last_indexed","content_updated_at"],"title":"SitemapPageDetail","description":"Extended page details including indexing metadata."},"SitemapPageListing":{"properties":{"id":{"type":"integer","title":"Id","description":"Unique page identifier"},"url":{"type":"string","title":"Url","description":"Full URL of the page"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"HTML title of the page"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Meta description of the page"},"depth":{"type":"integer","title":"Depth","description":"URL path depth (0 = root)"},"audit_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audit Score","description":"AI search readiness score (0-100)"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"The canonical URL if different from this page's URL"},"is_priority":{"type":"boolean","title":"Is Priority","description":"Whether this page matches a priority_page/priority_path override for the brand"},"has_optimized_content":{"type":"boolean","title":"Has Optimized Content","description":"Whether this page has active AXP optimized content deployed"}},"type":"object","required":["id","url","title","description","depth","audit_score","canonical_url","is_priority","has_optimized_content"],"title":"SitemapPageListing","description":"A page discovered in the brand's sitemap."},"SitemapPageMetricsResponse":{"properties":{"granularity":{"type":"string","title":"Granularity","description":"Time-series granularity: daily or weekly"},"metrics":{"$ref":"#/components/schemas/UrlMetricsModel"}},"type":"object","required":["granularity","metrics"],"title":"SitemapPageMetricsResponse","description":"Time-series metrics for a single page."},"SitemapPagesResponse":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"items":{"items":{"$ref":"#/components/schemas/SitemapPageListing"},"type":"array","title":"Items"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/TimeSeriesMetadata"},{"type":"null"}]},"domain":{"type":"string","title":"Domain","description":"The domain these pages belong to"},"last_crawl_completed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Crawl Completed","description":"When the most recent completed crawl finished"}},"type":"object","required":["total","items","domain","last_crawl_completed"],"title":"SitemapPagesResponse","description":"Paginated list of sitemap pages with crawl metadata."},"SponsoredAd":{"properties":{"advertiser":{"type":"string","title":"Advertiser"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price"},"advertiser_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advertiser Url"},"target_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Url"},"rendered":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rendered"},"format":{"type":"string","enum":["sources_text","sources_logo","geo_local","shopping","base64_logo","unanchored","ads_api","image_card_v2","card_unknown"],"title":"Format"},"index":{"type":"integer","title":"Index"}},"type":"object","required":["advertiser","format","index"],"title":"SponsoredAd","description":"One structured entry parsed from a stripped ChatGPT sponsored-ad block.\n\nProduced by ``text_utils.parse_sponsored_ads`` from the raw block preserved\nat ``extra_data[\"sponsored_content\"]``; persisted as\n``extra_data[\"sponsored_ads\"]``."},"TimeSeriesMetadata":{"properties":{"aggregation_granularity":{"$ref":"#/components/schemas/AggregationGranularity","description":"The aggregation granularity: daily, weekly, or monthly"},"period_count":{"type":"integer","title":"Period Count","description":"The number of periods in the time series"},"start_date":{"type":"string","format":"date-time","title":"Start Date","description":"The start date of the time series"},"end_date":{"type":"string","format":"date-time","title":"End Date","description":"The end date of the time series"},"top_domains":{"anyOf":[{"$ref":"#/components/schemas/TopDomainsMetadata"},{"type":"null"}],"description":"Top domains metadata (only populated by sources/domains endpoints)"}},"type":"object","required":["aggregation_granularity","period_count","start_date","end_date"],"title":"TimeSeriesMetadata"},"TopDomainSummary":{"properties":{"domain":{"type":"string","title":"Domain"},"domain_owner":{"type":"string","title":"Domain Owner"},"observation_count":{"type":"integer","title":"Observation Count"}},"type":"object","required":["domain","domain_owner","observation_count"],"title":"TopDomainSummary"},"TopDomainsMetadata":{"properties":{"domains":{"items":{"$ref":"#/components/schemas/TopDomainSummary"},"type":"array","title":"Domains","description":"Top domains by observation count (always domain-level aggregated)"},"grand_total":{"type":"integer","title":"Grand Total","description":"Total observation count across all domains (for calculating 'Other')"},"owner_totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Owner Totals","description":"Observation counts by owner type (brand, competitor, other)"},"owner_time_series":{"anyOf":[{"items":{"$ref":"#/components/schemas/OwnerTimeSeriesPoint"},"type":"array"},{"type":"null"}],"title":"Owner Time Series","description":"Time series data by owner type for trend visualization"},"segment_totals":{"items":{"$ref":"#/components/schemas/SegmentTotal"},"type":"array","title":"Segment Totals","description":"Server-side observation counts per citation segment (covers all domains, not just top-N)"}},"type":"object","required":["domains","grand_total","owner_totals"],"title":"TopDomainsMetadata","description":"Metadata about top domains, used by sources/domains endpoints."},"UrlMetricsModel":{"properties":{"citations":{"items":{"$ref":"#/components/schemas/MetricRowModel"},"type":"array","title":"Citations","description":"Citation counts over time by AI platform"},"ai_referrals":{"items":{"$ref":"#/components/schemas/MetricRowModel"},"type":"array","title":"Ai Referrals","description":"AI referral counts over time by AI platform"},"agent_traffic":{"items":{"$ref":"#/components/schemas/MetricRowModel"},"type":"array","title":"Agent Traffic","description":"AI agent traffic counts over time by AI platform"}},"type":"object","required":["citations","ai_referrals","agent_traffic"],"title":"UrlMetricsModel","description":"Performance metrics for a single URL."},"UserAgent":{"properties":{"identifier":{"type":"string","title":"Identifier","description":"The robots.txt control identifier for the user agent, such as Googlebot or ChatGPT-User. This does not necessarily match the user agent string one would see in logs."},"sample_user_agent":{"type":"string","title":"Sample User Agent","description":"A sample user agent string that could be found in logs -- the actual HTTP user agent string that would be sent to the server."},"owner":{"type":"string","enum":["Google","Bing","Perplexity","OpenAI","Amazon","Apple","CommonCrawl","DuckDuckGo","Anthropic","Meta"],"title":"Owner","description":"The owner of the user agent, such as Google or OpenAI."},"purposes":{"items":{"type":"string","enum":["Search Indexing","Training Data Collection","Retrieval","Other"]},"type":"array","uniqueItems":true,"title":"Purposes","description":"The purposes of the user agent, such as Search Indexing or Retrieval."},"critical":{"type":"boolean","title":"Critical","description":"Whether allowing this user agent is critical to the site being findable/citable by search engines or AI assistants. If it is, we want to ensure it is allowed.","default":false},"collects_training_data":{"type":"boolean","title":"Collects Training Data","readOnly":true}},"type":"object","required":["identifier","sample_user_agent","owner","purposes","collects_training_data"],"title":"UserAgent","description":"Represents a programmatic user agent, such as a search indexer or content retriever.\nFor example: Googlebot or ChatGPT-User."},"UserAgentResponse":{"properties":{"final_url":{"type":"string","title":"Final Url"},"redirect_chain":{"items":{"type":"string"},"type":"array","title":"Redirect Chain"},"timed_out":{"type":"boolean","title":"Timed Out"},"response_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Response Time"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers"},"server_software":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Software","readOnly":true},"title":{"type":"string","title":"Title","readOnly":true},"description":{"type":"string","title":"Description","readOnly":true},"uncleaned_markdown":{"type":"string","title":"Uncleaned Markdown","readOnly":true},"cookies_set":{"type":"string","title":"Cookies Set","readOnly":true},"has_cloudflare_bot_management_cookie":{"type":"boolean","title":"Has Cloudflare Bot Management Cookie","readOnly":true},"blocked":{"type":"boolean","title":"Blocked","readOnly":true},"block_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Block Reason","readOnly":true}},"type":"object","required":["final_url","timed_out","server_software","title","description","uncleaned_markdown","cookies_set","has_cloudflare_bot_management_cookie","blocked","block_reason"],"title":"UserAgentResponse","description":"Represents the concrete result of requesting a URL with a particular user agent."},"UserAgentStatusPipeline":{"properties":{"robots_status":{"$ref":"#/components/schemas/RobotsTxtUserAgentResult"},"retrieval_status":{"$ref":"#/components/schemas/NetworkUserAgentResult"},"status":{"type":"string","enum":["allowed","blocked","unknown"],"title":"Status","readOnly":true},"robots_ok":{"type":"boolean","title":"Robots Ok","readOnly":true},"retrieval_ok":{"type":"boolean","title":"Retrieval Ok","readOnly":true},"robots_blocked":{"type":"boolean","title":"Robots Blocked","readOnly":true},"retrieval_blocked":{"type":"boolean","title":"Retrieval Blocked","readOnly":true},"retrieval_blocked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieval Blocked Reason","readOnly":true}},"type":"object","required":["robots_status","retrieval_status","status","robots_ok","retrieval_ok","robots_blocked","retrieval_blocked","retrieval_blocked_reason"],"title":"UserAgentStatusPipeline"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantListing":{"properties":{"id":{"type":"integer","title":"Id"},"platform":{"type":"string","title":"Platform"},"scenario":{"type":"string","title":"Scenario"}},"type":"object","required":["id","platform","scenario"],"title":"VariantListing"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"servers":[{"url":"/v1"}]}