Skip to main content
Glama

Server Details

AI brand visibility, competitor mentions and citation evidence for agents. Cleotic account required.

Ownership verified
Status
Healthy
Uptime
11.1% over 22 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.7/5.0

Scored across 44 tools

Disambiguation4/5

Most tools target a clearly distinct resource or action, and the descriptions do heavy lifting to separate near-neighbors (act_on_opportunity vs update_opportunities, get_page vs list_pages). A few pairs remain subtle, notably set_primary_brand vs update_brand (both create/edit the brand) and get_brand_overview vs get_brand_settings vs get_perception, but these are differentiated in prose.

Naming Consistency4/5

Names follow a predictable snake_case verb_noun pattern (get_*, list_*, create_*, update_*, delete_*, save_*, run_*, verify_*). Minor deviations exist, such as both save_* and create_* used for creating resources, and the act_on_/comment_on_ forms, but the convention stays readable and consistent overall.

Tool Count3/5

44 tools is heavy and well past the ideal 3-15 band, suggesting consolidation is possible across the many read views (traffic, readiness, citations, perception, overview). The product's scope is genuinely broad, so each tool roughly maps to a real function, but the surface is still borderline unwieldy.

Completeness4/5

The surface covers the full lifecycle across brands, competitors, segments, prompts, pages, and reports, with create/read/update/delete plus specialised operations like scans and verification. Gaps are minor (e.g. no direct report-content read), and agents can work around them.

Available Tools

44 tools
act_on_opportunityAct on opportunityAInspect

Record or start an opportunity's play, which moves it to watching. Use it rather than update_opportunities whenever the play was done, so the inbox knows what to watch for. fix_shipped: a readiness fix is live. pitched: a source gap's outreach was sent. optimised: a traffic gap's page was improved. track_prompts: track the chosen suggested questions as prompts. draft_outreach: draft a source gap's outreach; Cleotic never sends it. Cost: track_prompts uses one active prompt of plan capacity per question and model budget for their first answers; draft_outreach uses one Content Studio generation and model budget; the others are free.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
actionYes
opportunity_idYesOpportunity ID from list_opportunities.
suggestion_idsNotrack_prompts only: suggestion IDs from get_opportunity.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnly=false, destructive=false), and the description goes well beyond them: it discloses the state transition to watching, the cost model (track_prompts consumes an active prompt of plan capacity per question plus model budget; draft_outreach consumes a Content Studio generation), and a key side-effect guarantee ('Cleotic never sends it'). This is exactly the behavioral context an agent needs before mutating.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and the sibling contrast before enumerating actions, then closes with cost. Dense but nearly every clause earns its place; the action-by-action list is long but necessary given five undocumented enum values.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Given a 5-param mutation tool with plan-capacity side effects, the description covers purpose, alternative routing, per-action meaning, cost, and a side-effect guarantee — nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so brand, opportunity_id, suggestion_ids and idempotency_key are already documented. The description compensates for the one gap that matters: the action enum values carry no per-value schema description, and the description defines all five. That is meaningful added semantics above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Record or start an opportunity's play') and immediately gives the resulting state change ('moves it to watching'). It also names the sibling it replaces (update_opportunities), so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use it rather than update_opportunities 'whenever the play was done', and then spells out the selection condition for each of the five actions (fix_shipped, pitched, optimised, track_prompts, draft_outreach). When-to-use and the alternative are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

answer_page_questionsAnswer page questionsAInspect

Answer or skip a page's interview questions, the facts only you know. Once every question is answered or skipped, the plan is built; it returns pending until get_page shows it. Cost: model budget for the plan.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
answersNoAnswers to record.
page_idYesPage ID from list_pages or create_page.
skip_remainingNoSkip every question still open and build the plan.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavior beyond the annotations: the lifecycle consequence of completing all questions (plan is built) and the pending-until-visible state transition, plus the model-budget cost. Annotations cover mutation/open-world profile, but the description usefully supplies the async state and cost context they don't.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and followed by the lifecycle consequence and cost. No filler, though the phrasing is slightly compressed in places.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be spelled out, yet the description still conveys the pending/visible lifecycle and the completion trigger. It is complete enough for an agent to call correctly, with only the lack of explicit alternatives as a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents brand, answers, page_id, skip_remaining, and idempotency_key in detail. The description's 'facts only you know' adds tone but no parameter semantics beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Answer or skip a page's interview questions') and clarifies the scope ('the facts only you know'), which separates it from read-side siblings like get_answer/list_answers. It does not explicitly name an alternative, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear workflow context: once every question is answered or skipped the plan is built, and the tool returns pending until get_page shows it. This tells the agent where in the pipeline to call it, but it names no conditions for preferring it over siblings or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

approve_brand_setupApprove brand setupAInspect

Create the brand from a ready setup's proposals. List exactly the competitor and prompt proposals to keep; an empty list keeps none of that kind, and the primary brand is always kept. Confirm the brand's market with the user first and pass it as market; get_brand_setup's segment.market and market_label give its code and label. Cost: a brand, a segment and the kept prompts from plan capacity; model budget for each prompt's first answers and the site's first readiness scan.

ParametersJSON Schema
NameRequiredDescriptionDefault
marketNoThe market the user confirmed: kind country with its code, region with key and country_codes, or global. Start from get_brand_setup's segment.market and market_label.
setup_idYesSetup ID from start_brand_setup.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.
accepted_brand_proposal_idsYesCompetitor proposal IDs to keep, from get_brand_setup. [] keeps none.
accepted_prompt_proposal_idsYesPrompt proposal IDs to keep, from get_brand_setup. [] keeps none.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the write/non-destructive/open-world profile, and the description adds genuinely new context: the capacity cost (a brand, a segment, kept prompts from plan capacity) and model budget for first answers plus the site's readiness scan, and the invariant that the primary brand is always kept. This is meaningful behavioral disclosure beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all front-loaded with the core create action first, then selection semantics, then prerequisite, then cost. Dense but each clause carries information. Slightly long compound sentences keep it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema covering return values and annotations covering the safety profile, the description supplies what remains needed: selection semantics, the user-confirmation prerequisite for market, and capacity/model-cost implications. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: an empty list keeps none of that kind, the primary brand is always kept regardless, and market must be user-confirmed and sourced from get_brand_setup. These rules meaningfully augment the parameter docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource combination ('Create the brand from a ready setup's proposals') and implicitly distinguishes itself from start_brand_setup (which creates the setup) and get_brand_setup (which reads proposals). An agent can tell it apart from the sibling save_* tools that persist individual proposals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite to confirm the market with the user first and pass it as market, pointing to get_brand_setup's segment.market and market_label for the code and label. Also explains the keep/discard semantics of the lists. It does not, however, explicitly frame when to choose this over start_brand_setup, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

comment_on_opportunityComment on opportunityCInspect

Add a comment to an opportunity as you.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe comment.
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
opportunity_idYesOpportunity ID from list_opportunities.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the safety profile is partly covered. However, the description adds nothing beyond the bare action: it doesn't say whether comments are visible to other users, whether they can be edited or deleted, or what happens on duplicate submissions beyond what the schema's idempotency_key text explains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence that is front-loaded with the action. It is efficient, though it is arguably terse to the point of under-specification rather than optimally informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and all four parameters are fully documented in the schema. What is missing is context for a mutation tool: visibility of the comment and any usage conditions, leaving the definition adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (body, brand, opportunity_id, idempotency_key) is documented in the schema itself, so the baseline is 3. The description's only contribution, "as you", marginally clarifies attribution but adds no format or constraint detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a clear verb+resource pair ("Add a comment to an opportunity") that an agent can distinguish from siblings like get_opportunity or act_on_opportunity. It stops short of differentiating itself from other write tools or stating scope, but the core action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to comment versus posting via another tool, no prerequisites (e.g. needing a valid opportunity_id from list_opportunities), and no exclusions. The only hint is "as you", which implies the comment is attributed to the calling user.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_pageCreate pageAInspect

Start a Content Studio page, from a content gap opportunity (its draft_content play) or from a question. The page opens with its interview: get_page lists the questions to answer before its plan is built. Returns pending while the questions are written. Cost: model budget for the questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
titleNoOptional working title.
questionNoOr the question the page should answer.
opportunity_idNoA content gap opportunity ID from list_opportunities.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile, and the description adds value beyond them: the tool opens into an 'interview', returns a pending status while questions are written, and consumes model budget. That async/pending behavior and cost disclosure are not derivable from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and its sources, then the lifecycle behavior, then the cost. No filler and every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with an output schema, the description covers entry paths, the interview/pending lifecycle, and cost. Nothing critical is missing, though a note on the relationship to draft_page and on the eventual non-pending outcome would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds a little by framing opportunity_id as the 'content gap opportunity (its draft_content play)' and the question as an alternative initiation path, clarifying how the two optional inputs relate rather than just naming them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Start) and resource (a Content Studio page), plus the two entry paths: a content gap opportunity's draft_content play or a question. It names the follow-up sibling get_page, though it does not contrast itself with the nearby draft_page/redraft_page_section siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the two valid ways to initiate a page and directs the agent to get_page to retrieve the interview questions before the plan is built. It stops short of saying when to prefer this over draft_page for an existing page, so the routing guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_reportCreate reportAInspect

Save a shareable report of the brand's results for a date range. Returns its public link. Cost: one report of plan capacity; on plans with report narratives, model budget for its summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD. Defaults to today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days ago.
nameNo
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the write/open-world/idempotent-false profile, and the description adds genuinely non-structured behavior: the returned public link (an external exposure) and the consumption of plan report capacity plus model budget on narrative plans. It does not explain what happens to capacity on failure or retry, hence not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then the return, then the cost. No filler; each sentence adds a distinct fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be spelled out, and the schema covers most parameters; the description still conveys the shareable-link outcome and cost. A note on capacity exhaustion or duplicate-report behavior would fully close it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the schema already documents from/to defaults, brand resolution, and the idempotency_key replay contract. The description only echoes the date-range concept and adds no syntax or semantics beyond the schema – baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Save a shareable report of the brand's results for a date range') with a clear output ('Returns its public link'). It is distinguishable from siblings like list_reports and revoke_report, though it never names an alternative to sharpen the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies the usage context (producing a shareable snapshot over a date range) and gives plan-capacity cost guidance, but offers no explicit when-to-use/when-not or routing against list_reports or revoke_report.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_itemDelete itemA
Destructive
Inspect

Delete one competitor, segment, prompt, page, or report for good: pass exactly one of its IDs. It cannot be restored. Deleting a segment deletes its prompts and their answers; deleting a prompt deletes its answers. To stop tracking but keep the history, pause it with save_competitor, save_segment or save_prompt; to only kill a report's link, use revoke_report. Free, and frees the plan capacity the item used.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
page_idNoA Content Studio page, from list_pages.
segmentNoA segment ID or name, from get_brand_settings.
prompt_idNoA prompt, from list_prompts.
report_idNoA report, from list_reports.
competitor_idNoA competitor, from get_brand_settings.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds context annotations cannot: irreversibility ('It cannot be restored'), cascade semantics (deleting a segment deletes its prompts and answers; deleting a prompt deletes its answers), and billing effect ('Free, and frees the plan capacity the item used'). This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the one-ID rule, then cascade effects, then alternatives. Every sentence carries information, though the trailing 'Free, and frees the plan capacity the item used' is a slightly appended billing note rather than a core fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive multi-target tool with an output schema already covering return values, the description supplies the missing pieces an agent needs: mutual exclusivity of the ID parameters, irreversibility, cascade blast radius, and escape hatches. Nothing material is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so per-parameter meaning is already documented (baseline 3). The description adds a genuine cross-parameter constraint not expressible in the schema: exactly one ID must be supplied. It does not, however, elaborate on the brand/idempotency_key pairing beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete') and enumerates exactly which resources are deletable (competitor, segment, prompt, page, report), plus the constraint 'pass exactly one of its IDs'. It is immediately distinguishable from save_competitor, save_segment, save_prompt and revoke_report, which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-not guidance and routes to alternatives: pause via save_competitor/save_segment/save_prompt to keep history, or revoke_report to kill only a report's link. The selection conditions are stated, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

draft_pageDraft pageAInspect

Write the draft from a page's ready plan, section by section. Returns pending with sections drafted so far; follow it with get_operation or get_page. Cost: one of the plan's Content Studio generations and model budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
page_idYesPage ID from list_pages.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful behavior beyond annotations: the call is asynchronous and returns 'pending' with partial progress, and it consumes one Content Studio generation plus model budget, a real cost the annotations do not convey. Annotations already cover safety/mutability, so this disclosure of async semantics and budget cost is a genuine value-add.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: the action, the return/follow-up behavior, and the cost. The operation itself is front-loaded before the caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the action, the readiness prerequisite, the async pending pattern, the follow-up tools, and the cost. Since an output schema exists, return-value detail need not be repeated here, so nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself explains brand resolution, page_id sourcing, and idempotency-key replay semantics in detail. The description adds no parameter-level information beyond what the schema already provides, so the baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (write the draft) and resource (a page's ready plan, section by section), which clearly distinguishes this bulk page-drafting operation from the sibling redraft_page_section and from create_page. It does not explicitly name those alternatives, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition (the page must have a *ready* plan) and directs the agent to the right follow-up tools, get_operation or get_page. There is no explicit when-not clause, but the readiness gate effectively defines the context for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ai_trafficGet AI trafficA
Read-onlyIdempotent
Inspect

AI crawler visits and AI referrals to the brand's site, from its tracking; connected is false when tracking is not set up. view summary: totals, providers, crawlers, referral sources, pages to improve, by week. view pages: per-page traffic. view evidence: individual visits. Only pages and evidence are paged.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
pathNoOptional exact page path, for example /pricing.
viewNoDefaults to summary.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.
providerNoOptional AI provider, as the summary's systems name it, for example OpenAI; capitalisation does not matter. A provider with no traffic in the period is refused as unknown.
traffic_typeNoOptional filter.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description adds genuinely new behavior: connected=false when tracking is not set up, and that only pages and evidence are paged while summary is not.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource, then view semantics, then the paging caveat. The telegraphic style is dense but every clause carries information; nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full schema and an output schema present, the description need not explain parameters or returns. It fills the remaining gaps — view semantics, tracking-not-set-up handling, and paging scope — leaving little an agent must infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes beyond it by explaining what each view value actually yields and by clarifying the paging applicability per view, which the enum alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (AI crawler visits and AI referrals to the brand's site) and clarifies the data source (its tracking), plus the connected=false signal. No sibling tool covers AI traffic, so the agent can distinguish it immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It enumerates the three view modes and what each returns (summary totals, pages per-page, evidence individual visits), which effectively guides mode selection. It does not name explicit alternatives or when-not-to-use conditions, but no close sibling exists to route against.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_answerGet answerA
Read-onlyIdempotent
Inspect

One AI answer in full, with the brands it mentions, its recommendations, ranked list, outcome, and citations. Use it to read an answer_id from list_answers; to scan many answers use list_answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
answer_idYesAnswer ID from list_answers.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds what the response contains, but since an output schema exists that content is largely duplicated rather than additive. No auth, rate-limit, or error behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with what is returned and followed by the routing rule. No filler and nothing that fails to earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema handling return-value structure and annotations handling the safety profile, the description needs only to state identity and routing, which it does completely. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage, so the schema already documents answer_id fully. The description reinforces its provenance ('an answer_id from list_answers'), which adds a little origin context but no format or syntax detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (one AI answer) and enumerates the payload contents (brands, recommendations, ranked list, outcome, citations). This clearly distinguishes it from the sibling list_answers, which is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use this to read a single answer_id obtained from list_answers, and use list_answers instead to scan many answers. Both the when-to-use and the alternative are stated with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_brand_overviewGet brand overviewA
Read-onlyIdempotent
Inspect

The brand's Overview in one call: visibility, share of voice and recommendation with their basis and change, how the brand and its main competitors stand, and headline readiness, traffic, inbox and Content Studio status. For one slice in depth use get_perception, list_citations, get_ai_traffic or get_readiness. A segment filters the answer metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
segmentNoOptional segment ID or name. get_brand_settings lists the brand's segments.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds that this is a single aggregated call whose answer metrics can be narrowed by a segment, but discloses nothing further about cost, latency or ordering beyond what structured fields provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler, and the aggregation scope is front-loaded ahead of the alternative-routing sentence. The first sentence is long and comma-chained, but every listed metric carries information rather than repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the annotations cover safety; the description supplies scope, sibling routing and the segment effect, which is enough for correct invocation. Minor gaps such as retention/plan-limit behavior are already handled inside the parameter schema, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so date, brand and segment semantics (defaults, 180-day window, ID-or-name resolution) are already fully documented in the schema; the baseline is 3. The only added meaning is 'A segment filters the answer metrics', a marginal clarification of the segment parameter's effect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('The brand's Overview in one call') and enumerates the returned dimensions: visibility, share of voice, recommendation, competitor standing, readiness, traffic, inbox and Content Studio status. It explicitly names the siblings it is not (get_perception, list_citations, get_ai_traffic, get_readiness), so an agent can distinguish aggregation from single-slice tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: 'For one slice in depth use get_perception, list_citations, get_ai_traffic or get_readiness' — the condition (single-slice depth vs. all-in-one) that selects the alternative is named. It does not state a when-not case or prerequisites, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_brand_settingsGet brand settingsA
Read-onlyIdempotent
Inspect

Read the brand's settings: primary brand, competitors, segments (market, language, models), site tracking and CMS status, brand voice, and Content Studio skills. Use it to find the competitor_id and segment values other tools take, and to see the current state before changing a setting. For metrics use get_brand_overview.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by saying it exposes the current state before changes and listing the settings returned, though it does not cover auth or rate-limit details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences, front-loads what settings are returned, then gives usage and sibling routing. Every clause earns its place and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return structure. It provides enough purpose, usage, and sibling differentiation for a one-parameter read tool whose annotations already cover safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single brand parameter is fully documented in the schema as an ID from list_brands or an exact/unique-prefix name. The description adds no additional parameter syntax or format detail beyond what the schema already provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (“Read”) and resource (“brand's settings”) and enumerates the exact contents: primary brand, competitors, segments, site tracking/CMS status, brand voice, and Content Studio skills. It explicitly distinguishes itself from get_brand_overview by saying metrics belong there, so an agent can select it correctly among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states concrete uses: finding competitor_id and segment values other tools take, and checking current state before changing a setting. It also names the alternative for metrics (“For metrics use get_brand_overview”), giving explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_brand_setupGet brand setupA
Read-onlyIdempotent
Inspect

A brand setup's progress and, once it needs approval, its proposals: the brand, competitors, segment, and prompts, each with the proposal_id approve_brand_setup takes.

ParametersJSON Schema
NameRequiredDescriptionDefault
setup_idYesSetup ID from start_brand_setup.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds a genuine behavioral nuance beyond them: proposals are only present 'once it needs approval', so the payload is state-dependent. That is useful context an agent cannot get from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single compact sentence, so nothing is wasted, but the nested 'progress and, once it needs approval, its proposals' clause plus the trailing relative clause makes it dense and slightly awkward to parse. Front-loading the resource is good; the structure could be cleaner.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a rich annotation set and an existing output schema, the description need not enumerate return fields, and it correctly focuses on the setup lifecycle and proposal availability. Only minor gaps remain, such as behavior when the setup is not yet at the approval stage or when setup_id is invalid.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage, and the schema already tells the agent the id comes from start_brand_setup. The description alludes to 'a brand setup's' but adds no syntax or constraint detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific resource (a brand setup) and what is retrieved (progress, and its proposals once approval is needed), which distinguishes it from get_brand_overview and get_brand_settings. It is a noun fragment rather than a verb+resource statement, but an agent can still tell what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this to read a setup's progress, and once it reaches the approval stage to obtain proposal_ids. It names approve_brand_setup as the consumer of those ids, but gives no when-not guidance or explicit alternative for reading brand data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_citation_sourceGet citation sourceA
Read-onlyIdempotent
Inspect

One cited source. With domain: its citations, models, brands named, trend, and its most influential pages. With source_id: one page's citing prompts, models, brands named, recent snippets, and trend.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
domainNoA domain from list_citations.
source_idNoA page's source_id from list_citations view pages.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, idempotent, non-destructive, open-world lookup, so the safety profile is covered. The description adds useful behavioral context about what each mode yields (citations, models, brands named, snippets, trend), but says nothing about retention limits, rate limits, or permission requirements beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, zero filler, with the dual-mode structure front-loaded in the first clause. The clipped noun-phrase opener ('One cited source') is slightly less readable than a full verb phrase but is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering the safety profile and an output schema covering return structure, the description's job is limited to distinguishing the two lookup modes, which it does. Date-window behavior and the required brand come from the schema, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so domain, source_id, brand, from, and to are all documented in the schema itself (including where domain and source_id come from: list_citations). The description's domain-vs-source_id contrast is largely a restatement of the schema's own hints, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (a cited source) and clearly splits its behavior into two lookup modes — by domain and by source_id — with what each returns. It stops short of using an explicit verb like 'retrieve', but the resource and mode distinction make it differentiable from the sibling list_citations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage through the mode split (domain → domain-level rollup, source_id → single page detail), which tells the agent how to choose between the two parameter paths. However, it never states when to use this tool over list_citations, nor that brand is required, so the guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_docGet docA
Read-onlyIdempotent
Inspect

Fetch one public Cleotic documentation page by slug. Links inside a page are slugs this tool takes. Use search_docs first when you have no slug.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesDocumentation slug from search_docs, for example analytics/share-of-voice.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds only that the target is a 'public' page and that in-page links are valid slugs; it says nothing extra about failure modes or rate limits, and an output schema handles returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose, then input provenance, then the alternative-tool rule. No filler, no repetition of the name or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only fetch with rich annotations and a declared output schema, the description covers purpose, slug provenance, and tool routing. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with the slug documented as coming from search_docs, so the baseline is 3. The description goes further by explaining that links inside a page are themselves slugs this tool accepts, which adds a genuine discovery path beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (fetch) and resource (one public Cleotic documentation page) and scopes it to a single slug, which cleanly distinguishes it from sibling list/search tools like search_docs and list_pages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use search_docs first when you have no slug,' naming the alternative and the condition that selects it. That is exactly the when-to-use guidance an agent needs to pick between the two.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_operationGet operationA
Read-onlyIdempotent
Inspect

Follow a write: its live status (pending, completed, or failed) read from the resource itself, its progress, and how long to wait before checking again. Only the member and connection that made the write can read it.

ParametersJSON Schema
NameRequiredDescriptionDefault
operation_idYesOperation ID returned by a write tool.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is handled. The description adds a genuinely new behavioral constraint beyond structured data: 'Only the member and connection that made the write can read it,' which warns the agent about per-connection scoping and potential authorization failures. It stops short of describing failure behavior when the operation does not exist or is still pending.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, and front-loaded: the return payload is described first, then the access restriction. Every clause earns its place by telling the agent something actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be explained, and annotations cover the safety profile; the description still usefully names the status vocabulary and the caller-scoping rule. Complete enough to call correctly, with only minor gaps around terminal-state and not-found behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter at 100% schema description coverage, the schema already fully documents operation_id and its provenance. The description reinforces the polling purpose but adds no new format, syntax, or constraint detail for the parameter itself, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource ('Follow a write') and enumerates exactly what is returned: live status (pending/completed/failed), progress, and retry delay. No sibling tool in the list deals with async operation tracking, so the agent can immediately place it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'Follow a write' plus the schema note that operation_id comes from a write tool tells the agent this is the post-write polling endpoint, and 'how long to wait before checking again' hints at the polling loop. However, there is no explicit when-to-use framing, no statement of when to stop polling, and no named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_opportunityGet opportunityA
Read-onlyIdempotent
Inspect

One opportunity with its evidence (who is winning, verbatim excerpts, cited sources, trend), its play and the tool call that carries it out, before/after proof, timeline, and comments. Content gaps include each engine's latest answer. Read it before act_on_opportunity or create_page; to browse the inbox use list_opportunities.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
opportunity_idYesOpportunity ID from list_opportunities.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value by framing this as a prerequisite read before mutating actions and by disclosing the shape of the returned evidence (who is winning, excerpts, sources, trend, timeline). It stops short of noting any access, latency, or size constraints, but with annotations carrying safety that gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource and payload, then the routing guidance. The parenthetical list is dense but each item is a distinct piece of return content rather than filler; slight verbosity keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description still previews the payload for planning purposes. For a two-required-param read tool it covers purpose, routing, prerequisites, and content, leaving nothing an agent needs in order to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (brand, opportunity_id) are documented in the schema, including where to obtain each value. The description adds nothing about parameter format or interaction, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource ('One opportunity with its evidence') and enumerates the payload contents: evidence, play, tool call, before/after proof, timeline, comments. It also distinguishes itself from list_opportunities and from write siblings act_on_opportunity/create_page, so an agent can identify it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit sequencing ('Read it before act_on_opportunity or create_page') and an explicit alternative for the browse case ('to browse the inbox use list_opportunities'). Both when-to-use and when-not-to-use are covered, which is rare and directly actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pageGet pageA
Read-onlyIdempotent
Inspect

One Content Studio page: its question, interview questions, plan and sections, the draft's checks, the draft as Markdown (in parts when long), and results once live. Read it after create_page to see the interview and plan, and before draft_page; to find pages use list_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
cursorNomarkdown_next_cursor from the previous call, for the next part of a long draft.
page_idYesPage ID from list_pages.
include_preflightNoAlso run the publish preflight checks, which fetch the live page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds useful context beyond that: the draft is returned as Markdown 'in parts when long' (explaining the cursor pattern) and include_preflight notes that checks 'fetch the live page', which is a meaningful side effect. It stops short of detailing rate limits or auth, hence not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the returned payload before the workflow routing. The field enumeration is dense but earns its place by telling the agent what to expect, though it borders on a run-on list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with an output schema, the description correctly avoids re-explaining return values and instead covers when to call it and the pagination/branching behavior. Only minor gaps remain (e.g., no note on preflight cost or live-vs-draft behavior), but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents brand, page_id, cursor, and include_preflight. The description echoes the long-draft pagination idea ('in parts when long') but adds no syntax or format detail beyond the schema. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('One Content Studio page') and then enumerates the fields it returns (question, interview questions, plan/sections, checks, Markdown draft, results), so an agent knows exactly what it retrieves. It is clearly distinguishable from list_pages, which it names as the discovery tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit workflow routing: 'Read it after create_page to see the interview and plan, and before draft_page; to find pages use list_pages.' This gives when-to-use and names the alternative for the find case, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_perceptionGet perceptionA
Read-onlyIdempotent
Inspect

How AI answers describe the brand and its competitors: scores out of 10 on each dimension, by model, with the brand's evidence quotes and trend. Only analysis inside the period is used; has_data is false when there is none, and latest_analysis_at then says which period to ask for. Competitors are capped, best score first. Not included on every plan.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
max_competitorsNoCompetitors to include, best overall score first. Defaults to 8; the brand is always included.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so this is judged on added context. The description adds real behavioral detail: empty-period handling with has_data/latest_analysis_at, a cap on competitors ordered best-first, period-scoped analysis, and a plan-availability caveat — none of which the annotations express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded paragraph that leads with what is returned, then layers in the empty-data contract and plan caveat. Dense but every sentence carries distinct information; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it correctly focuses on gating (plan availability), empty-result behavior, and period scoping. An agent has almost everything needed; the only gap is explicit sibling routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so period bounds, retention limits, brand resolution, and the max_competitors cap/ordering are already fully documented in the schema. The description restates competitor capping and period scoping without adding syntax beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (perception of the brand and its competitors) and defines the return shape precisely: scores out of 10 per dimension, by model, with evidence quotes and trend. It does not, however, distinguish itself from nearby siblings such as get_brand_overview, so the agent must infer which tool to reach for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful operational context (analysis is scoped to the period, has_data is false when empty, latest_analysis_at points to a valid period) and warns it is not on every plan. But it never states when to choose this over alternatives like get_brand_overview — usage is implied rather than routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_planGet planA
Read-onlyIdempotent
Inspect

Read the organisation's plan: limits and their use (null limit = unlimited), included features, the Content Studio generation allowance, the model budget, and the AI models every segment collects from. Check it before a write that costs plan capacity, a generation, or model budget.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description goes beyond them by decoding a data semantic an agent cannot infer: 'null limit = unlimited'. It doesn't discuss freshness/caching of plan data, but the added interpretation earns a 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler; the content inventory comes first and the usage trigger second, so it is front-loaded correctly. The colon-separated inventory is slightly dense but every item listed is a distinct part of the response and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description is not obliged to describe return values, and it correctly spends its words on what the plan object covers and when checking it matters. Nothing an agent needs in order to call this zero-argument read tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No misleading parameter language is present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (the organisation's plan), then enumerates exactly what the payload contains: limits and their use, included features, generation allowance, model budget, and collected models. That enumeration cleanly separates it from neighbours like get_brand_settings and get_brand_overview without the agent opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete trigger: 'Check it before a write that costs plan capacity, a generation, or model budget.' That is a real when-to-use condition rather than generic filler. It stops short of naming an alternative or an explicit when-not, so it lands just under the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_readinessGet site readinessA
Read-onlyIdempotent
Inspect

The brand site's AI readiness scan. view summary: score, verdict, lens and pillar scores, and open findings by severity. view action_plan: open findings to fix, with the questions no page answers. view pages: pages the scan read, or with page_id one page's open findings. view history: past scans. view competitors: competitor scans, the checks they pass that the brand fails, and the plan's competitor limit and cooldown; competitor scans are started in the app, not through MCP.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoaction_plan order. Defaults to points.
viewNoDefaults to summary.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.
run_idNoOptional scan ID; defaults to the latest.
statusNoaction_plan filter. Defaults to open.
page_idNopages view: a page_id from the pages list, for that page's findings.
severityNoaction_plan filter: comma list of critical, major, minor, info.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint, so safety and mutability are covered. The description adds that competitor scans are started in the app, not via MCP, which is useful behavioral context. Beyond that, it doesn't disclose pagination behavior or rate limits, though the schema covers pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the tool's purpose, followed by a compact enumeration of views. It is reasonably concise, though the view list is long and could be slightly more structured (e.g., bulleted). No wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given nine parameters (one required), full schema coverage, an output schema, and comprehensive annotations, the description covers each view's return content and notes the out-of-band competitor scan behavior. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all nine parameters are already documented in the schema with defaults and constraints. The description maps view values to returned content, which is useful, but adds no syntax or format details beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the brand site's AI readiness scan and enumerates the five views (summary, action_plan, pages, history, competitors) with what each returns. It is distinguishable from siblings like get_readiness_finding and run_readiness_scan, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for each view and notes that competitor scans are started in the app, not through MCP (a useful exclusion). It does not explicitly state when to use get_readiness_finding or run_readiness_scan instead, but the view enumeration functions as usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_readiness_findingGet readiness findingA
Read-onlyIdempotent
Inspect

One readiness check: why it matters, its drafted fix, and where it fails. Pass check_request_id to follow a verify_readiness_fix re-check.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.
run_idNoOptional scan ID; defaults to the latest.
check_idYesCheck ID from get_readiness.
check_request_idNoOptional: the check_request_id from verify_readiness_fix, to include that re-check's status and result.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the shape of the finding (rationale, fix, failure location), which is genuine context, but says nothing about permissions, scoping to run_id, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no waste; the identifying content of the finding is front-loaded and the workflow hint follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the tool's content and its link to verify_readiness_fix. It is nearly complete, though the relationship to get_readiness and run_id scoping could be clearer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so brand, check_id, run_id, limit and cursor are already documented in the schema. The description only touches check_request_id, and even that repeats the schema text, so it adds little beyond structured data — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource ('one readiness check') and enumerates its contents (why it matters, drafted fix, where it fails), which distinguishes it from get_readiness (a list) and verify_readiness_fix (a re-check). It does not explicitly contrast itself with those siblings, keeping it short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies the follow-up workflow by stating 'Pass check_request_id to follow a verify_readiness_fix re-check', which is useful routing context. However, it never says when to call this versus get_readiness, nor any exclusion or prerequisite, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_answersList answersA
Read-onlyIdempotent
Inspect

AI answers, newest first. With prompt_id: that prompt's answers across models, with the brands they mention and recommend. Without: answers that mention the brand, with the mention in context; empty for a brand no answer mentions, while prompt_id shows a prompt's answers either way.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
modelNoOptional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews.
cursorNonext_cursor from the previous page. Leave out for the first page.
segmentNoOptional segment ID or name. get_brand_settings lists the brand's segments.
prompt_idNoA prompt ID from list_prompts. Leave out for answers mentioning the brand.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/openWorld, so the bar is lower. The description still adds genuine behavior: newest-first ordering, cross-model coverage in prompt mode, mention-in-context in brand mode, and the empty-result case for an unmentioned brand versus prompt_id always returning rows.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the resource and ordering, then the two modes in parallel. Dense but every clause carries meaning; the final 'while prompt_id shows a prompt's answers either way' clause is slightly tangled but resolves the empty-result ambiguity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained. The description covers the mode switch, ordering, and the empty-result edge case — the pieces an agent needs to call it correctly and interpret results. Date-window and pagination constraints are left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining the interaction between brand and prompt_id — which parameter governs which result mode — rather than describing each field in isolation, which the schema already does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the resource (AI answers) and the ordering (newest first), then precisely splits the tool into two modes keyed on prompt_id. This is specific and separable from siblings like get_answer (singular) and answer_page_questions, though the listing verb itself is only implied by the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The core when-to-use decision is spelled out: pass prompt_id to get a prompt's answers across models, omit it to get answers mentioning the brand. No sibling tool is named as an alternative and no explicit exclusions are given, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_brandsList brandsA
Read-onlyIdempotent
Inspect

List the brands and studies you can access, with visibility, share of voice and recommendation (each with the answers and models behind it and its change on the previous period), citations, site readiness, collection health, AI traffic, and the opportunity inbox's Now stage. Brands come in name order, so paging stays steady as brands are added. Start here to find a brand ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
kindNoOptional filter.
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds a genuinely useful non-schema behavioral trait: brands are returned in name order 'so paging stays steady as brands are added,' which informs pagination tuning. It omits auth, rate limits and response-size caveats like the schema's per-page row reduction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and the entry-point guidance are front-loaded, which is good. However, the first sentence is a 40+ word run-on enumerating every returned metric and sub-field ('each with the answers and models behind it...'), which duplicates the existing output schema and adds length without adding selection value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. Purpose, entry-point role, ordering behavior and the pagination-relevant ordering rationale are all present; only an explicit alternative/comparison with sibling listing tools is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all five parameters (from, to, kind, limit, cursor) are already fully documented in the schema. The description adds no syntax, format or default detail beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb+resource ('List the brands and studies you can access') and explicitly frames its role as the entry point ('Start here to find a brand ID'), which distinguishes it from siblings like get_brand_overview that require an existing brand ID. An agent can tell what it returns and why it would call it first.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Start here to find a brand ID' gives explicit when-to-use guidance for the discovery phase. It implies others such as get_brand_overview/get_brand_settings follow, but never names a when-not condition or an alternative for this specific listing, so it stops short of 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_citationsList citationsA
Read-onlyIdempotent
Inspect

The sources AI answers cite for this brand's prompts. view overview: totals by ownership and source type, by week. view domains: cited domains, with source gaps where competitors are cited and the brand is not. view pages: cited pages ranked by influence. Only domains and pages are paged.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
viewNoDefaults to overview.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.
domainNoOptional domain filter.
searchNoOptional text filter.
segmentNoOptional segment ID or name. get_brand_settings lists the brand's segments.
ownershipNoOptional filter.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive, so the bar is lower. The description adds a non-obvious behavioral fact: 'Only domains and pages are paged,' which tells the agent overview is not paginated. No auth/rate-limit context, but the paging asymmetry is meaningful added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight clauses: what it is, then the three views, then the paging caveat. Front-loaded, zero filler, every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-format details are unnecessary, and all 10 params are described in the schema. The view semantics and paging note round out the main ambiguities. Minor gap: no guidance on how 'influence' or 'source gaps' are computed, but that is arguably output-schema territory.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the enum by describing what each view returns (totals by ownership/source type, cited domains with gaps, pages ranked by influence) and clarifies paging applicability, which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('sources AI answers cite for this brand's prompts') and enumerates the three views it can return, making the scope concrete. It doesn't name a sibling tool to differentiate against, but the citation-specific scope is unambiguous against list_answers/list_prompts/list_pages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains what each view is for – overview for ownership/source-type totals by week, domains for competitor source gaps, pages for influence ranking. That is genuine selection guidance for the main decision (which view). No explicit when-not-to-use or alternative tools are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_opportunitiesList opportunitiesA
Read-onlyIdempotent
Inspect

The brand's opportunity inbox: content, readiness, source, traffic, and coverage gaps, each with its score, AI search demand, stage (now, in_flight, watching, won), and assignee, plus stage counts for the active inbox (counts.ready_to_win: watching items whose gap has closed). Start here to find an opportunity_id, read it with get_opportunity, and change it with act_on_opportunity or update_opportunities.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOptional filter.
viewNoDefaults to active.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
stageNoOptional filter.
cursorNonext_cursor from the previous page. Leave out for the first page.
segmentNoOptional segment ID or name. get_brand_settings lists the brand's segments.
assigneeNoOptional: me, or a member ID (none is not accepted here). No tool lists members: take an ID from an opportunity's assignee.member_id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds context annotations cannot: the returned fields, stage vocabulary, and the semantics of counts.ready_to_win (watching items whose gap has closed). It omits anything about auth or rate limits, but adds real behavioral value over the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what the tool returns and then the routing advice. The first sentence is a dense run-on that packs fields, stages and counts together, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be re-explained; the 8-parameter schema is fully described. Combined with the explicit follow-up workflow, an agent has enough to call this correctly, though nothing covers the active/view default interaction or pagination caveats.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all filtering params (kind, view, stage, segment, assignee, limit, cursor) are documented in the schema itself. The description restates the stage values but adds no syntax, defaults, or interactions beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (the brand's opportunity inbox) and enumerates its contents: content, readiness, source, traffic and coverage gaps with score, demand, stage and assignee. It also names sibling tools (get_opportunity, act_on_opportunity, update_opportunities), so an agent can distinguish it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the tool as the entry point: 'Start here to find an opportunity_id, read it with get_opportunity, and change it with act_on_opportunity or update_opportunities.' That is a clear workflow with named alternatives. It stops short of stating when-not to use it (e.g., when the ID is already known).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pagesList pagesA
Read-onlyIdempotent
Inspect

The brand's Content Studio pages by lane: in_progress, live, or needs_refresh, with drafting progress and, once live, AI crawler reads and the answers that name or cite the brand. Start here to find a page_id for get_page.

ParametersJSON Schema
NameRequiredDescriptionDefault
laneNoOptional filter.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish this as a safe, idempotent, read-only listing, so the description's remaining job is to add context, which it does: it discloses what the rows contain (drafting progress, and for live pages AI crawler reads and brand-naming/citing answers) and that lane membership reflects page lifecycle stage. It stops short of describing ordering or how many rows to expect, but that is minor and partly covered by the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence, front-loaded with the verb and resource, followed immediately by the follow-up action. No filler, no restatement of the title, and every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain the return shape, and it correctly focuses on purpose, lane semantics, and the get_page handoff. Pagination (limit/cursor/next_cursor) is left entirely to the schema, which is acceptable but leaves the listing-lifecycle behavior slightly unstated in prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description earns above baseline by giving semantic meaning to the lane enum values: it explains that 'live' pages surface crawler reads and cited answers, and that needs_refresh signals staleness, which the raw enum strings do not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('list the brand's Content Studio pages') and scopes it by lane. It is immediately distinguishable from get_page, create_page, and draft_page in the sibling list because it is the enumeration tool, and it explicitly frames itself as the entry point ('Start here to find a page_id for get_page').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context: use this first to obtain a page_id for get_page, and it enumerates the three lane values an agent can filter by. It does not state exclusions (e.g., when to prefer list_brands or search_docs instead), but the routing intent is explicit rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_promptsList promptsA
Read-onlyIdempotent
Inspect

The brand's tracked prompts, highest AI search demand first, with segment, status, labels, monthly AI searches, and how many answers in the period mentioned the brand. Use it to find a prompt_id for list_answers; suggest_prompts proposes new prompts and save_prompt adds them.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today.
fromNoStart date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention.
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
limitNoRows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor.
cursorNonext_cursor from the previous page. Leave out for the first page.
statusNoOptional filter.
segmentNoOptional segment ID or name. get_brand_settings lists the brand's segments.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description goes further by disclosing the return shape and ordering (segment, status, labels, monthly AI searches, mention counts), which is real context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste: the first front-loads what is returned and in what order, the second handles routing to siblings. Nothing is redundant or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be spelled out, yet the description summarizes them helpfully. With annotations covering safety and a fully documented schema, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (to, from, brand, limit, cursor, status, segment) is already documented with defaults, formats, and pagination behavior. The description adds nothing about parameter usage; the fields it lists (segment, status, labels, searches) describe output rather than inputs, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (brand's tracked prompts) and immediately disambiguates with sort order (highest AI search demand first) and the fields returned. It is clearly distinguished from siblings suggest_prompts and save_prompt, which are named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says the tool is for finding a prompt_id for list_answers, and names suggest_prompts and save_prompt as the creation-path alternatives. That covers when to use it and which siblings do the adjacent jobs, though it doesn't state when-not to use it (e.g., versus list_answers' own filtering).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reportsList reportsA
Read-onlyIdempotent
Inspect

The brand's saved reports, with their date ranges and public share links. Use it to find a report to revoke_report; create_report makes a new one.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered by structured data. The description adds return-content context (date ranges, share links) but says nothing about pagination, result volume, or rate limits, so it is only modestly additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, zero filler, with the inventory of the resource front-loaded before the routing guidance for related tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation, and annotations cover the safety profile. The description is essentially complete for a simple one-param list tool, with only pagination/result-size behavior unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter with 100% schema description coverage; the schema already explains that brand accepts an ID from list_brands or an exact/unique-prefix name. The description adds no format or syntax detail beyond that, so the baseline 3 is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific resource ('the brand's saved reports') and its scope, plus what the listing carries (date ranges, public share links). It explicitly differentiates from both revoke_report and create_report, so an agent can place it among siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use condition ('find a report to revoke_report') and routes the create case to create_report. The alternative tools and the condition selecting each are named rather than left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_page_publishedMark page publishedAInspect

Record that a drafted page is live at a URL, published outside a connected CMS. Cleotic then tracks whether AI engines read, mention, and cite it.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe live page's address.
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
page_idYesPage ID from list_pages.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the write (readOnlyHint=false) and non-destructive (destructiveHint=false) profile, so the safety bar is lower. The description still adds genuine downstream context that annotations do not carry: the call triggers ongoing tracking of whether AI engines read, mention and cite the URL.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and scope, with the second sentence covering consequence. No filler, no restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers purpose plus the downstream tracking effect. The main remaining gap is routing guidance against sibling tools, which is minor for a narrowly scoped write.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with brand, page_id, url and the idempotency replay semantics all documented in the schema itself. The description adds no syntax, format, or constraint detail beyond that, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: recording that a drafted page is live, with the key scope qualifier that it was published outside a connected CMS. An agent can distinguish this from draft_page/create_page, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'a drafted page is live' - you call it after drafting when the page goes live off-platform - but there is no explicit when-to-use, when-not-to-use, or named alternative (e.g. versus a CMS-connected publish path or create_page).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redraft_page_sectionRedraft page sectionAInspect

Rewrite one section of a drafted page, optionally steered by an instruction. Returns pending while it is rewritten. Cost: model budget; no Content Studio generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
steerNoOptional instruction, for example: shorter, with a pricing example.
page_idYesPage ID from list_pages.
section_idYesA section ID from get_page's plan.sections.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds real value beyond them: the asynchronous nature ('Returns pending while it is rewritten') and the cost model ('model budget; no Content Studio generation'). It does not explain what happens to the prior section text or the interaction between the required idempotency key and the idempotentHint=false annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences with no wasted framing; the core action comes first. 'No Content Studio generation' is slightly jargon-dependent, but it still earns its place as a cost caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description still notes the pending status usefully. For a mutation tool with full schema coverage and annotations, the gaps (prerequisites, prior-text fate) are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including a full explanation of idempotency_key replay semantics, so the schema does the heavy lifting and baseline 3 applies. The description only gestures at 'steer' generically and adds no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Rewrite one section of a drafted page', with the optional steering input named. This distinguishes it from the whole-page sibling draft_page, but it never names that sibling explicitly, so an agent must infer the boundary itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage through 'one section of a drafted page' and 'optionally steered', so the context is inferable, but there is no explicit when-to-use-this-vs-draft_page guidance, no prerequisite (e.g. page must be drafted first), and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_reportRevoke reportA
Destructive
Inspect

Kill a report's public link. A revoked link stays dead: it cannot be restored, so create_report makes a new report with a new link. The report stays listed with revoked: true. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
report_idYesReport ID from list_reports or create_report.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description adds meaningful detail beyond them: the link cannot be restored, the report persists with revoked: true rather than being deleted, and the call is free. It does not address the tension between idempotentHint=false and the idempotency_key parameter, which the schema handles instead.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action, then permanence, then the fallback path, then cost. Every sentence carries distinct information with no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. The description covers what is destroyed, what survives, irreversibility and cost — everything an agent needs to invoke this mutation safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so brand, report_id and idempotency_key are already fully documented in the schema. The description adds no parameter-level information. Baseline 3 is appropriate when the schema carries the full burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with precision: 'Kill a report's public link.' It also implicitly distinguishes itself from create_report, which it names as the alternative path. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for choosing this tool — it destroys a public link irreversibly — and routes the agent to create_report when they actually want a working link. No explicit trigger conditions for when revocation is appropriate, but the alternative is named clearly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_readiness_scanRun readiness scanAInspect

Start a full site readiness scan of the brand's website. Owners and admins only. Only the first scan, or a retry while none has completed, can be started by hand; later scans run weekly, and the call is then refused with scheduled_only and next_run_at (get_readiness shows can_start_scan). verify_readiness_fix re-checks one issue. Returns pending; follow it with get_operation or get_readiness. Cost: one full scan, counted for the month; scans have no monthly allowance.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly=false, destructive=false, openWorld=true), while the description adds substantial undisclosed behavior: permission requirements, the weekly scheduling constraint and its refusal payload, the cost model ('one full scan, counted for the month'), and the pending return state with follow-up tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Highly front-loaded and every sentence carries information (permissions, eligibility, refusal payload, cost, follow-up). Slightly dense with parenthetical clauses, which costs a little readability, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating, open-world tool with an output schema and full parameter coverage, the description supplies everything else an agent needs: authorization scope, the refused-call branch, quota accounting, and what to call next (get_operation or get_readiness).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already fully documented in the schema, including the idempotency replay semantics. The description adds scheduling context around when a scan may be started but no additional parameter syntax or format, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Start a full site readiness scan of the brand's website.' It is clearly distinguishable from siblings like get_readiness (read state) and verify_readiness_fix (re-check one issue), both of which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states who may call it (owners and admins only), when it can be called (first scan, or a retry while none has completed), and what happens otherwise (refused with scheduled_only and next_run_at). It also routes the agent to get_readiness for can_start_scan and names verify_readiness_fix as the alternative for issue-level re-checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_competitorSave competitorAInspect

Add a competitor, or with competitor_id edit one or pause and resume tracking it. A change to how answers name it re-reads existing answers automatically; it returns pending until that finishes. Cost: a new competitor is one tracked brand of plan capacity.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
domainNo
statusNo
aliasesNoThe full list of other names answers use for it. Replaces the current aliases, so include the existing ones; [] clears them.
competitor_idNoEdit this competitor, from get_brand_settings. Leave out to add one.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds genuinely non-obvious behavior: renaming triggers an automatic re-read of existing answers, the operation reports 'pending' during that work, and adding a competitor consumes one tracked-brand slot of plan capacity. Permission requirements and the effect of pausing on retained data are still unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences that front-load the primary create/edit/pause action before moving to side effects and cost. No filler, though the cost sentence is compressed enough that an agent must parse 'one tracked brand of plan capacity' carefully.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape details are unnecessary, and the description still adds the meaningful 'returns pending' interim state. Combined with annotations and idempotency semantics in the schema, an agent has enough to call this correctly; only the pause semantics and permission prerequisites are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 57%, so the description must compensate for several undocumented parameters. It clarifies competitor_id's role (edit vs. add) and status behavior (pause/resume), and notes that a name change re-reads answers. The 'name' and 'domain' parameters remain unexplained in both places, keeping it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the resource (competitor) and enumerates the distinct operations it performs: create, edit via competitor_id, and pause/resume tracking. The tool is unambiguous against siblings such as save_prompt, save_segment, and update_brand, which operate on different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the condition that selects edit mode ('with competitor_id edit one') versus creation, and calls out pause/resume tracking. It also flags the plan-capacity cost of adding a competitor, which informs the decision. It stops short of naming alternative tools for related tasks, so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_promptSave promptAInspect

Add a prompt to a segment, or with prompt_id edit one. Changing an existing prompt's text replaces it, keeping the old prompt's answers in its history. Cost: an active prompt is plan capacity; new, replaced and resumed prompts get an answer from every model straight away, using model budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
textNo
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
marketNoA free-text label stored on the prompt. It does not change where the prompt is collected: the segment's geo does.
statusNo
personaNo
segmentNoThe segment (ID or name) for a new prompt.
categoryNo
languageNo
prompt_idNoEdit this prompt, from list_prompts. Leave out to add one.
intent_typeNo
funnel_stageNo
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety flags; the description goes well beyond them by disclosing the replacement semantics ('changing an existing prompt's text replaces it, keeping the old prompt's answers in its history') and the cost model (plan capacity, immediate answers from every model, model budget). These are exactly the side effects an agent needs before mutating state, and they reconcile with destructiveHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the create/edit distinction before the cost detail. The final cost sentence is a dense run-on packing in three separate behaviors ('new, replaced and resumed prompts get an answer from every model straight away, using model budget'), but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter mutation with an output schema already covering return values, the description handles behavior and cost well but is thin on the bulk of the optional metadata fields. An agent can safely decide whether to call it, but cannot reliably fill tags, persona, category, language, intent_type or funnel_stage from this definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 38% (brand, market, segment, prompt_id, idempotency_key), so eight parameters — tags, text, status, persona, category, language, intent_type, funnel_stage — are undocumented in the schema. The description adds meaning only for text (replacement behavior), status (active/paused cost) and the segment target; the remaining five-plus metadata fields are left entirely unexplained, so it only partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource and clearly splits the two modes: 'Add a prompt to a segment, or with prompt_id edit one.' An agent can tell create from edit without opening the schema. It does not, however, name or distinguish itself from siblings such as suggest_prompts or list_prompts, which matters for an agent choosing between generating, listing and saving prompts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear conditional guidance: omit prompt_id to add, supply it to edit, and it notes the cost consequence that selects one path over another ('an active prompt is plan capacity'). What is missing is any when-not guidance or explicit pointer to the alternative tools (suggest_prompts, list_prompts) for the same job.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_segmentSave segmentAInspect

Add a segment (a market and language to track), or with segment edit one or pause and resume it. Cost: an active segment is plan capacity and collects from every plan model on Mondays, Wednesdays and Fridays, using model budget. Resuming one answers prompts that missed the latest collection straight away.

ParametersJSON Schema
NameRequiredDescriptionDefault
geoNoCountry code, for example GB, or global: where this segment's answers are collected from.
nameNo
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
statusNo
segmentNoEdit this segment (ID or name). Leave out to add one.
languageNoLanguage code, for example en.
prompt_limitNo
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the annotations (readOnlyHint=false, idempotentHint=false) by disclosing operational cost semantics: active segments consume plan capacity, collect from all plan models on specific days, and use model budget. It also explains that resuming triggers immediate collection of missed prompts. This is valuable context not present in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loading the primary action ('Add a segment') before detailing edit/pause/resume and cost implications. Every sentence adds value about behavior or cost. It could be slightly more structured with bullets, but it remains readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multi-mode operation, cost model, scheduling) and the presence of an output schema (which needn't be explained), the description covers key behavioral aspects: creation, editing, pausing/resuming, and cost/collection details. It omits explicit mention of required parameters `brand` and `idempotency_key`, but these are documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 63%, meaning some parameters (e.g., `name`, `prompt_limit`, `language`) lack descriptions. The tool description does not add semantic detail for these parameters. It does clarify the role of `segment` (edit vs. add) and `status` (pause/resume), but this is largely inferable from the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's multi-modal purpose: add a segment by default, or edit/pause/resume an existing one when the `segment` parameter is supplied. It names the specific resource ('segment') and distinguishes the create and update modes. However, it doesn't differentiate from all siblings like save_competitor or save_prompt, though these are clearly different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use create vs. edit/pause/resume based on whether the `segment` parameter is provided, but it doesn't explicitly state when to use this tool versus alternatives like update_brand or set_primary_brand. No explicit exclusions or prerequisites are given beyond the cost/routing note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_docsSearch docsA
Read-onlyIdempotent
Inspect

Search the public Cleotic documentation by keyword and return matching pages. Use it when you do not know which page you need; use get_doc when you already have a slug.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return. Defaults to 5, max 10.
queryYesSearch query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds that the search targets public documentation and returns matching pages, but does not add rate limits, result behavior, or ranking details beyond what the annotations and output schema provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with the main action and the usage decision front-loaded. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, full schema descriptions, and presence of an output schema, the description provides enough context to select and invoke the tool correctly without repeating structured data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the input schema. The description mentions keyword search but adds no syntax, matching rules, or limit behavior beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (Search) and resource (public Cleotic documentation), and distinguishes the tool from the sibling get_doc by contrasting keyword search with slug lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: use search when you do not know which page you need, and use get_doc when you already have a slug. The alternative is named directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_primary_brandSet primary brandAInspect

Create or edit the brand being tracked: its name, domain, and aliases. Pass at least one; what you leave out stays as it is. To add a competitor use save_competitor; to rename a brand or study, or pause it, use update_brand. A change to how answers name the brand re-reads existing answers automatically; it returns pending until that finishes. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe brand's name as answers name it.
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
domainNoThe brand's website domain, for example example.com.
aliasesNoThe full list of other names answers use for the brand. Replaces the current aliases, so include the existing ones; [] clears them.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare write/not-read-only, non-destructive, open-world, and non-idempotent. The description adds genuinely non-structured behavior: editing how answers name the brand triggers an automatic re-read of existing answers and the call returns 'pending' until it completes, plus that it is free. It does not restate annotation-covered facts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the action and the partial-update rule, followed by sibling routing and the async/status caveat. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation, and the description covers the async 'pending' lifecycle and cost. For a mutation tool, the remaining gap is the unresolved overlap with update_brand on renaming, which an agent may need to disambiguate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema baseline is 3, but the description adds PATCH-style semantics not present in the schema: 'Pass at least one; what you leave out stays as it is.' That meaningfully changes how an agent constructs the args beyond the field-level docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — create or edit the tracked brand — and enumerates the editable surface (name, domain, aliases). It explicitly distinguishes itself from save_competitor and update_brand by name, so an agent can separate it from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names two alternatives with explicit routing conditions ('to add a competitor use save_competitor; to rename a brand or study, or pause it, use update_brand'). However, this leaves a real ambiguity: the description also says this tool edits the brand's name, while update_brand is said to rename a brand — the boundary between the two is not fully resolved.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_brand_setupStart brand setupAInspect

Add a brand the way the app does: Cleotic reads the website and proposes the brand, competitors, a segment, and prompts. Returns pending while it reads; poll get_brand_setup until it needs approval, review the proposals with the user, then approve_brand_setup. Cost: model budget to read the site.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe brand's website.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true but say nothing about lifecycle or cost. The description adds that it returns pending while reading (async behavior) and that it consumes model budget to read the site — valuable context an agent cannot get from the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then the async/poll/approve flow, then the cost caveat. Every sentence carries a distinct, actionable piece of information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async, multi-step, open-world mutation with an output schema already present, the description supplies the missing pieces: async semantics, the polling target, the approval handoff, and cost. Nothing an agent needs to invoke or sequence it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both url and idempotency_key are fully documented in the schema. The description adds no syntax or semantic detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (start/"add a brand") and resource, then describes exactly what the tool does: reads the website and proposes brand, competitors, segment, and prompts. This clearly distinguishes it from siblings get_brand_setup and approve_brand_setup, which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Lays out the full workflow: call this, poll get_brand_setup until approval is needed, review with the user, then call approve_brand_setup. Both the timing and the alternatives are explicit, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_promptsSuggest promptsA
Read-onlyIdempotent
Inspect

Suggest prompts for a segment about a topic. Ranked by AI search demand only when the demand provider has data; monthly_ai_searches null or 0 means none was found. Saves nothing and returns no IDs: add the ones you want with save_prompt (text, tags, category, intent_type). Cost: one AI model call from the model budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its name (exact or a unique prefix).
countNoHow many to suggest. Defaults to 8.
topicYesWhat the prompts should be about.
segmentYesSegment ID or name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses ranking behavior (ranked by AI search demand only when the provider has data), how to interpret null/0 values, that nothing is persisted and no IDs are returned, and the cost (one AI model call). That's rich context an agent cannot get from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense, front-loaded sentences with no filler; the persistence caveat and cost are packed efficiently. Slightly information-dense but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be spelled out, yet the description still clarifies the null/0 semantics of monthly_ai_searches and the cost/handoff behavior. Complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so brand/segment/topic/count are already documented in the schema. The description adds no parameter-level syntax or defaults beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Suggest prompts') plus scope ('for a segment about a topic'), which cleanly distinguishes it from list_prompts and save_prompt without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It routes the agent explicitly: 'Saves nothing and returns no IDs: add the ones you want with save_prompt.' This names the follow-up tool and its params. It doesn't contrast against list_prompts, so it stops short of a full when/when-not matrix, but the actionable handoff is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_brandUpdate brandAInspect

Rename a brand or study, or pause or resume it. Cost: resuming restarts collection on Mondays, Wednesdays and Fridays, and answers prompts that missed the latest collection straight away, using plan capacity and model budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
statusNo
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, openWorldHint=true and destructiveHint=false, so the description is not required to re-establish the safety profile. It goes further by disclosing that resuming restarts collection on Mondays/Wednesdays/Fridays, fires missed prompts immediately, and consumes plan capacity and model budget — real operational consequences beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core capability before the cost caveat. The second sentence is dense but every clause (collection days, immediate prompt answering, capacity/budget consumption) carries distinct decision-relevant information. Minimal waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. For a mutation tool, the description covers the operations and a notable side-effect of resuming. It stops short of permissions/authorization requirements and of clarifying behavior when name and status are provided together, but the essential calling information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: 'brand' and 'idempotency_key' are documented in the schema, while 'name' and 'status' are not. The description loosely maps 'rename' to name and 'pause or resume' to status (active/paused), which adds a little semantic glue, but it never spells out the name/status-to-parameter mapping or interaction when both are supplied. This only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific set of verbs and the resource: rename a brand or study, or pause/resume it. An agent can immediately distinguish this from siblings like update_brand_voice, get_brand_settings, or approve_brand_setup. It also names both target objects (brand/study), matching the 'brand' parameter's dual nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states what the operations are but gives no explicit when-to-use-vs-alternative guidance: nothing routes the agent away from update_brand_voice for voice changes or toward get_brand_settings to inspect state first. The cost note for resuming implies caution but does not frame it as a decision rule. Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_brand_voiceUpdate brand voiceAInspect

Set the default tone for the brand's Content Studio pages, or none to clear it. It applies to the next draft of every page; drafts already written are not rewritten.

ParametersJSON Schema
NameRequiredDescriptionDefault
toneYes
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false), so the bar is lower. The description adds genuinely useful behavior the annotations cannot convey: that setting 'none' clears the tone and that the change is forward-only, not retroactive. It does not mention the caller-supplied idempotency mechanism, but that is documented in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the primary action front-loaded and the non-retroactive caveat immediately after. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering the safety profile and an output schema covering return values, the description need only cover scope and semantics, which it does. The one remaining gap is any explicit routing versus sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the schema already documents brand and idempotency_key, so the baseline is 3. The description goes beyond the schema on the tone parameter by explaining that the 'none' enum value means 'clear it' — an enum member the schema lists without explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set the default tone for the brand's Content Studio pages') and even covers the clearing case ('or none to clear it'). It is clear enough to distinguish from update_brand, though it never explicitly contrasts itself with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a real scope rule — it affects the next draft of every page and does not rewrite existing drafts — which tells the agent the effect window. However, it offers no explicit when-to-use vs. alternatives guidance (e.g., relative to draft_page or redraft_page_section), leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_opportunitiesUpdate opportunitiesAInspect

Triage inbox opportunities: move one or more to a stage, assign, snooze, dismiss, or restore them. All listed opportunities change together or none do. To record a play that was done, such as a fix shipped or outreach sent, use act_on_opportunity instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
stageNoMove to this stage.
dismissNoDismiss the opportunities.
restoreNoBring snoozed or dismissed opportunities back to the inbox.
assigneeNome (yourself), none (unassign), or a member ID. No tool lists members: take an ID from an opportunity's assignee.member_id.
snooze_untilNoHide until this date (YYYY-MM-DD, taken as 09:00 UTC) or RFC 3339 time.
dismiss_reasonNoOptional reason when dismissing.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.
opportunity_idsYesOpportunity IDs from list_opportunities.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds genuine non-schema behavior: 'All listed opportunities change together or none do' discloses batch atomicity, and listing restore implies dismiss/snooze are reversible rather than destructive. It does not cover auth requirements or rate limits, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero waste: core action first, the batch-atomicity constraint second, the sibling routing rule last. Every sentence carries load and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the action set, atomicity, and alternative routing. The remaining gap is whether the action parameters combine (e.g., setting a stage while dismissing) or are mutually exclusive, which an agent must infer from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description enumerates the action verbs that map onto the stage/assignee/snooze_until/dismiss/restore parameters, which reinforces intent, but it adds no format, default, or mutual-exclusivity detail beyond what the schema already states for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Triage inbox opportunities' followed by the exact action set (stage, assign, snooze, dismiss, restore). It names the sibling act_on_opportunity and the condition that separates them, so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule: 'To record a play that was done, such as a fix shipped or outreach sent, use act_on_opportunity instead.' It states the when-to-use for this tool (triage/state change) and the exclusion with the alternative named, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_readiness_fixVerify readiness fixAInspect

Re-check a fix without a full scan. With opportunity_id, re-checks an inbox readiness task; the result updates the task. With check_id, re-checks that open finding on its affected pages. Returns pending with the re-check's id; follow it with get_operation or get_readiness_finding's check_request_id. Cost: by opportunity_id free, once every 10 minutes; by check_id one of the plan's monthly re-checks.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesBrand or study: its ID from list_brands, or its exact name. A partial name is refused.
check_idNoA check ID from get_readiness.
opportunity_idNoA readiness opportunity ID from list_opportunities.
idempotency_keyYesA unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
generated_atYesRFC 3339 time the response was made.
schema_versionYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context the annotations do not: the write side effect (the result updates the task), the returned pending state and its id, the follow-up call chain, and exact cost/rate limits (free once per 10 minutes by opportunity_id; one monthly re-check by check_id). This is exactly the disclosure burden for a non-readOnly, non-idempotent tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and scope, then branches into the two modes, then states cost last. Dense but every sentence carries distinct, needed information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description need not explain return values, yet it still signals the pending status and the correct follow-up tools, and it covers cost and side effects. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the mutually-exclusive semantics of opportunity_id vs check_id and what each produces, which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (re-check) and resource (a fix), and immediately differentiates itself from the bulk sibling with 'without a full scan', which rules out run_readiness_scan. The two operating modes are named concretely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent which parameter selects which behavior (opportunity_id re-checks an inbox readiness task; check_id re-checks an open finding) and names the follow-up tools (get_operation, get_readiness_finding). It lacks an explicit 'do not use when...' clause, but the routing is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updates
    • Changedget_brand_overview15 fields changed
      • addedOutput schema / properties / data / properties / recommendation / properties / calibrating
        Added value: +{
        +  "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / recommendation / properties / changed
        Added value: +{
        +  "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / recommendation / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / recommendation / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • changedOutput schema / properties / data / properties / recommendation / required
        Previous value: -[
        -  "value",
        -  "change",
        -  "answers",
        -  "models_collecting",
        -  "models_expected",
        -  "period"
        -]New value: +[
        +  "value",
        +  "change",
        +  "changed",
        +  "calibrating",
        +  "answers",
        +  "models_collecting",
        +  "models_expected",
        +  "period"
        +]
      • addedOutput schema / properties / data / properties / share_of_voice / properties / calibrating
        Added value: +{
        +  "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / share_of_voice / properties / changed
        Added value: +{
        +  "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / share_of_voice / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / share_of_voice / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • changedOutput schema / properties / data / properties / share_of_voice / required
        Previous value: -[
        -  "value",
        -  "change",
        -  "answers",
        -  "models_collecting",
        -  "models_expected",
        -  "period"
        -]New value: +[
        +  "value",
        +  "change",
        +  "changed",
        +  "calibrating",
        +  "answers",
        +  "models_collecting",
        +  "models_expected",
        +  "period"
        +]
      • addedOutput schema / properties / data / properties / visibility / properties / calibrating
        Added value: +{
        +  "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / visibility / properties / changed
        Added value: +{
        +  "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / visibility / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / visibility / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • changedOutput schema / properties / data / properties / visibility / required
        Previous value: -[
        -  "value",
        -  "change",
        -  "answers",
        -  "models_collecting",
        -  "models_expected",
        -  "period"
        -]New value: +[
        +  "value",
        +  "change",
        +  "changed",
        +  "calibrating",
        +  "answers",
        +  "models_collecting",
        +  "models_expected",
        +  "period"
        +]
    • Changedget_opportunity6 fields changed
      • addedOutput schema / properties / data / properties / proof / properties / after / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / proof / properties / after / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / proof / properties / before / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / proof / properties / before / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / proof / properties / changed
        Added value: +{
        +  "description": "Whether the after rate differs from the before rate by more than chance. Until then: too early to tell.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / data / properties / proof / required
        Previous value: -[
        -  "since",
        -  "metric",
        -  "before",
        -  "after",
        -  "gap_closed_at",
        -  "suggest_won"
        -]New value: +[
        +  "since",
        +  "metric",
        +  "before",
        +  "after",
        +  "changed",
        +  "gap_closed_at",
        +  "suggest_won"
        +]
    • Changedlist_brands15 fields changed
      • addedOutput schema / properties / data / properties / brands / items / properties / recommendation / properties / calibrating
        Added value: +{
        +  "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / recommendation / properties / changed
        Added value: +{
        +  "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / recommendation / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / recommendation / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • changedOutput schema / properties / data / properties / brands / items / properties / recommendation / required
        Previous value: -[
        -  "value",
        -  "change",
        -  "answers",
        -  "models_collecting",
        -  "models_expected",
        -  "period"
        -]New value: +[
        +  "value",
        +  "change",
        +  "changed",
        +  "calibrating",
        +  "answers",
        +  "models_collecting",
        +  "models_expected",
        +  "period"
        +]
      • addedOutput schema / properties / data / properties / brands / items / properties / share_of_voice / properties / calibrating
        Added value: +{
        +  "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / share_of_voice / properties / changed
        Added value: +{
        +  "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / share_of_voice / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / share_of_voice / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • changedOutput schema / properties / data / properties / brands / items / properties / share_of_voice / required
        Previous value: -[
        -  "value",
        -  "change",
        -  "answers",
        -  "models_collecting",
        -  "models_expected",
        -  "period"
        -]New value: +[
        +  "value",
        +  "change",
        +  "changed",
        +  "calibrating",
        +  "answers",
        +  "models_collecting",
        +  "models_expected",
        +  "period"
        +]
      • addedOutput schema / properties / data / properties / brands / items / properties / visibility / properties / calibrating
        Added value: +{
        +  "description": "The value rests on fewer than 10 answers, so it may move a lot as answers come in.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / visibility / properties / changed
        Added value: +{
        +  "description": "Whether the change is more than chance: larger than 1.96 standard errors of the difference, with neither period calibrating. When false, call it no real change, whatever change says.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / visibility / properties / high
        Added value: +{
        +  "description": "High end of the range the value likely sits in (95%).",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • addedOutput schema / properties / data / properties / brands / items / properties / visibility / properties / low
        Added value: +{
        +  "description": "Low end of the range the value likely sits in (95%). AI answers vary run to run, so quote the range with the value.",
        +  "type": [
        +    "null",
        +    "number"
        +  ]
        +}
      • changedOutput schema / properties / data / properties / brands / items / properties / visibility / required
        Previous value: -[
        -  "value",
        -  "change",
        -  "answers",
        -  "models_collecting",
        -  "models_expected",
        -  "period"
        -]New value: +[
        +  "value",
        +  "change",
        +  "changed",
        +  "calibrating",
        +  "answers",
        +  "models_collecting",
        +  "models_expected",
        +  "period"
        +]
  2. 1 tool update
    • Changedget_plan1 field changed
      • changedOutput schema / properties / data / properties / plan / description
        Previous value: -"trial, starter, business, enterprise, or custom."New value: +"trial, starter, business, or custom."
  3. 1 tool update
    • Changedset_primary_brand2 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"The brand's website domain, for example example.com."
      • addedInput schema / properties / name / description
        Added value: +"The brand's name as answers name it."
  4. 1 tool update
    • Addeddelete_item
  5. 37 tool updates
    • Changedact_on_opportunity6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedanswer_page_questions6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedapprove_brand_setup8 fields changed
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedInput schema / properties / market / description
        Previous value: -"The market the user confirmed for this brand."New value: +"The market the user confirmed: kind country with its code, region with key and country_codes, or global. Start from get_brand_setup's segment.market and market_label."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
      • addedOutput schema / properties / data / properties / resource / properties / brand_name
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / resource / required
        Previous value: -[
        -  "setup_id",
        -  "status",
        -  "brand_id",
        -  "segment",
        -  "prompts"
        -]New value: +[
        +  "setup_id",
        +  "status",
        +  "brand_id",
        +  "brand_name",
        +  "segment",
        +  "prompts"
        +]
    • Changedcomment_on_opportunity6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedcreate_page6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedcreate_report6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changeddraft_page6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedget_ai_traffic4 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / provider / description
        Previous value: -"Optional AI provider, as the summary's systems name it, for example OpenAI."New value: +"Optional AI provider, as the summary's systems name it, for example OpenAI; capitalisation does not matter. A provider with no traffic in the period is refused as unknown."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
      • changedOutput schema / properties / data / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "ai_referrals": {
        -        "type": "integer"
        -      },
        -      "ai_share": {
        -        "description": "AI visits as a percentage of all visits.",
        -        "type": "number"
        -      },
        -      "ai_visits": {
        -        "type": "integer"
        -      },
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "connected": {
        -        "description": "Whether site tracking is set up; when false nothing is measured.",
        -        "type": "boolean"
        -      },
        -      "crawler_visits": {
        -        "type": "integer"
        -      },
        -      "crawlers": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "name": {
        -              "type": "string"
        -            },
        -            "pages": {
        -              "type": "integer"
        -            },
        -            "provider": {
        -              "type": "string"
        -            },
        -            "visits": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "name",
        -            "provider",
        -            "visits",
        -            "pages"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "latest_visit_at": {
        -        "type": "string"
        -      },
        -      "pages_reached": {
        -        "type": "integer"
        -      },
        -      "pages_to_improve": {
        -        "description": "Pages AI crawlers read but people rarely reach from AI answers.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "ai_referrals": {
        -              "type": "integer"
        -            },
        -            "ai_visits": {
        -              "type": "integer"
        -            },
        -            "change": {
        -              "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.",
        -              "type": [
        -                "null",
        -                "number"
        -              ]
        -            },
        -            "crawler_visits": {
        -              "type": "integer"
        -            },
        -            "path": {
        -              "type": "string"
        -            },
        -            "providers": {
        -              "items": {
        -                "type": "string"
        -              },
        -              "type": "array"
        -            },
        -            "total_visits": {
        -              "type": "integer"
        -            },
        -            "url": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "path",
        -            "url",
        -            "total_visits",
        -            "ai_visits",
        -            "crawler_visits",
        -            "ai_referrals",
        -            "providers",
        -            "change"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "period": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "from": {
        -            "description": "First day, YYYY-MM-DD.",
        -            "type": "string"
        -          },
        -          "to": {
        -            "description": "Last day, YYYY-MM-DD.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "from",
        -          "to"
        -        ],
        -        "type": "object"
        -      },
        -      "referral_sources": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "name": {
        -              "type": "string"
        -            },
        -            "pages": {
        -              "type": "integer"
        -            },
        -            "provider": {
        -              "type": "string"
        -            },
        -            "referrals": {
        -              "type": "integer"
        -            },
        -            "source": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "source",
        -            "name",
        -            "provider",
        -            "referrals",
        -            "pages"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "systems": {
        -        "description": "AI providers, by visits.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "ai_referrals": {
        -              "type": "integer"
        -            },
        -            "crawler_visits": {
        -              "type": "integer"
        -            },
        -            "pages": {
        -              "type": "integer"
        -            },
        -            "provider": {
        -              "description": "Pass as provider to filter.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "provider",
        -            "crawler_visits",
        -            "ai_referrals",
        -            "pages"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "total_visits": {
        -        "type": "integer"
        -      },
        -      "view": {
        -        "type": "string"
        -      },
        -      "weekly": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "ai_referrals": {
        -              "type": "integer"
        -            },
        -            "crawler_visits": {
        -              "type": "integer"
        -            },
        -            "week_start": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "week_start",
        -            "crawler_visits",
        -            "ai_referrals"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "period",
        -      "connected",
        -      "total_visits",
        -      "ai_visits",
        -      "ai_share",
        -      "crawler_visits",
        -      "ai_referrals",
        -      "pages_reached",
        -      "latest_visit_at",
        -      "systems",
        -      "crawlers",
        -      "referral_sources",
        -      "pages_to_improve",
        -      "weekly"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "connected": {
        -        "type": "boolean"
        -      },
        -      "pages": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "ai_referrals": {
        -              "type": "integer"
        -            },
        -            "ai_visits": {
        -              "type": "integer"
        -            },
        -            "change": {
        -              "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.",
        -              "type": [
        -                "null",
        -                "number"
        -              ]
        -            },
        -            "crawler_visits": {
        -              "type": "integer"
        -            },
        -            "path": {
        -              "type": "string"
        -            },
        -            "providers": {
        -              "items": {
        -                "type": "string"
        -              },
        -              "type": "array"
        -            },
        -            "total_visits": {
        -              "type": "integer"
        -            },
        -            "url": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "path",
        -            "url",
        -            "total_visits",
        -            "ai_visits",
        -            "crawler_visits",
        -            "ai_referrals",
        -            "providers",
        -            "change"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "pagination": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "next_cursor": {
        -            "description": "Pass as cursor to get the next page; empty on the last page.",
        -            "type": "string"
        -          },
        -          "total": {
        -            "description": "Items across all pages; null when not counted.",
        -            "type": [
        -              "null",
        -              "integer"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "next_cursor",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "period": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "from": {
        -            "description": "First day, YYYY-MM-DD.",
        -            "type": "string"
        -          },
        -          "to": {
        -            "description": "Last day, YYYY-MM-DD.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "from",
        -          "to"
        -        ],
        -        "type": "object"
        -      },
        -      "view": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "period",
        -      "connected",
        -      "pages",
        -      "pagination"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "connected": {
        -        "type": "boolean"
        -      },
        -      "pagination": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "next_cursor": {
        -            "description": "Pass as cursor to get the next page; empty on the last page.",
        -            "type": "string"
        -          },
        -          "total": {
        -            "description": "Items across all pages; null when not counted.",
        -            "type": [
        -              "null",
        -              "integer"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "next_cursor",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "period": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "from": {
        -            "description": "First day, YYYY-MM-DD.",
        -            "type": "string"
        -          },
        -          "to": {
        -            "description": "Last day, YYYY-MM-DD.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "from",
        -          "to"
        -        ],
        -        "type": "object"
        -      },
        -      "view": {
        -        "type": "string"
        -      },
        -      "visits": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "captured_at": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "description": "The crawler or referring AI product.",
        -              "type": "string"
        -            },
        -            "path": {
        -              "type": "string"
        -            },
        -            "provider": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "description": "crawler or referral.",
        -              "type": "string"
        -            },
        -            "url": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "path",
        -            "url",
        -            "provider",
        -            "name",
        -            "captured_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "period",
        -      "connected",
        -      "visits",
        -      "pagination"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "ai_referrals": {
        +        "type": "integer"
        +      },
        +      "ai_share": {
        +        "description": "AI visits as a percentage of all visits.",
        +        "type": "number"
        +      },
        +      "ai_visits": {
        +        "type": "integer"
        +      },
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "connected": {
        +        "description": "Whether site tracking is set up; when false nothing is measured.",
        +        "type": "boolean"
        +      },
        +      "crawler_visits": {
        +        "type": "integer"
        +      },
        +      "crawlers": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "name": {
        +              "type": "string"
        +            },
        +            "pages": {
        +              "type": "integer"
        +            },
        +            "provider": {
        +              "type": "string"
        +            },
        +            "visits": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "provider",
        +            "visits",
        +            "pages"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "latest_visit_at": {
        +        "type": "string"
        +      },
        +      "pages_reached": {
        +        "description": "Distinct pages an AI crawler or AI referral reached.",
        +        "type": "integer"
        +      },
        +      "pages_to_improve": {
        +        "description": "Pages AI crawlers read but people rarely reach from AI answers.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "ai_referrals": {
        +              "type": "integer"
        +            },
        +            "ai_visits": {
        +              "type": "integer"
        +            },
        +            "change": {
        +              "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "crawler_visits": {
        +              "type": "integer"
        +            },
        +            "path": {
        +              "type": "string"
        +            },
        +            "providers": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "total_visits": {
        +              "type": "integer"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "path",
        +            "url",
        +            "total_visits",
        +            "ai_visits",
        +            "crawler_visits",
        +            "ai_referrals",
        +            "providers",
        +            "change"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "period": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "First day, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "Last day, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to"
        +        ],
        +        "type": "object"
        +      },
        +      "referral_sources": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "name": {
        +              "type": "string"
        +            },
        +            "pages": {
        +              "type": "integer"
        +            },
        +            "provider": {
        +              "type": "string"
        +            },
        +            "referrals": {
        +              "type": "integer"
        +            },
        +            "source": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "source",
        +            "name",
        +            "provider",
        +            "referrals",
        +            "pages"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "systems": {
        +        "description": "AI providers, by visits.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "ai_referrals": {
        +              "type": "integer"
        +            },
        +            "crawler_visits": {
        +              "type": "integer"
        +            },
        +            "pages": {
        +              "type": "integer"
        +            },
        +            "provider": {
        +              "description": "Pass as provider to filter.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "provider",
        +            "crawler_visits",
        +            "ai_referrals",
        +            "pages"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "total_visits": {
        +        "type": "integer"
        +      },
        +      "view": {
        +        "type": "string"
        +      },
        +      "weekly": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "ai_referrals": {
        +              "type": "integer"
        +            },
        +            "crawler_visits": {
        +              "type": "integer"
        +            },
        +            "week_start": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "week_start",
        +            "crawler_visits",
        +            "ai_referrals"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "period",
        +      "connected",
        +      "total_visits",
        +      "ai_visits",
        +      "ai_share",
        +      "crawler_visits",
        +      "ai_referrals",
        +      "pages_reached",
        +      "latest_visit_at",
        +      "systems",
        +      "crawlers",
        +      "referral_sources",
        +      "pages_to_improve",
        +      "weekly"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "connected": {
        +        "type": "boolean"
        +      },
        +      "pages": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "ai_referrals": {
        +              "type": "integer"
        +            },
        +            "ai_visits": {
        +              "type": "integer"
        +            },
        +            "change": {
        +              "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "crawler_visits": {
        +              "type": "integer"
        +            },
        +            "path": {
        +              "type": "string"
        +            },
        +            "providers": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "total_visits": {
        +              "type": "integer"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "path",
        +            "url",
        +            "total_visits",
        +            "ai_visits",
        +            "crawler_visits",
        +            "ai_referrals",
        +            "providers",
        +            "change"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "pagination": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "next_cursor": {
        +            "description": "Pass as cursor to get the next page; empty on the last page.",
        +            "type": "string"
        +          },
        +          "total": {
        +            "description": "Items across all pages; null when not counted.",
        +            "type": [
        +              "null",
        +              "integer"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "next_cursor",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "period": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "First day, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "Last day, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to"
        +        ],
        +        "type": "object"
        +      },
        +      "view": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "period",
        +      "connected",
        +      "pages",
        +      "pagination"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "connected": {
        +        "type": "boolean"
        +      },
        +      "pagination": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "next_cursor": {
        +            "description": "Pass as cursor to get the next page; empty on the last page.",
        +            "type": "string"
        +          },
        +          "total": {
        +            "description": "Items across all pages; null when not counted.",
        +            "type": [
        +              "null",
        +              "integer"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "next_cursor",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "period": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "from": {
        +            "description": "First day, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "to": {
        +            "description": "Last day, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "from",
        +          "to"
        +        ],
        +        "type": "object"
        +      },
        +      "view": {
        +        "type": "string"
        +      },
        +      "visits": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "captured_at": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "description": "The crawler or referring AI product.",
        +              "type": "string"
        +            },
        +            "path": {
        +              "type": "string"
        +            },
        +            "provider": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "description": "crawler or referral.",
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "type",
        +            "path",
        +            "url",
        +            "provider",
        +            "name",
        +            "captured_at"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "period",
        +      "connected",
        +      "visits",
        +      "pagination"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_answer1 field changed
      • addedOutput schema / properties / data / properties / citations / items / properties / position / description
        Added value: +"Character offset of the citation in the answer text; null unless the provider gave spans."
    • Changedget_brand_overview6 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
      • changedOutput schema / properties / data / properties / competitors / description
        Previous value: -"Every tracked brand, including this one, by share of voice."New value: +"This brand and the competitors mentioned in the period, up to 10 of them, by mentions."
      • addedOutput schema / properties / data / properties / competitors_omitted
        Added value: +{
        +  "description": "Tracked competitors not listed: those with no mentions in the period, and any beyond the first 10. get_brand_settings lists them all.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / data / properties / competitors_total
        Added value: +{
        +  "description": "Competitors the brand tracks, mentioned or not.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / data / required
        Previous value: -[
        -  "brand",
        -  "kind",
        -  "segment",
        -  "period",
        -  "visibility",
        -  "share_of_voice",
        -  "recommendation",
        -  "by_model",
        -  "competitors",
        -  "outcomes",
        -  "top_cited_domains",
        -  "readiness",
        -  "collection",
        -  "traffic",
        -  "opportunities",
        -  "pages",
        -  "latest_reports",
        -  "retention"
        -]New value: +[
        +  "brand",
        +  "kind",
        +  "segment",
        +  "period",
        +  "visibility",
        +  "share_of_voice",
        +  "recommendation",
        +  "by_model",
        +  "competitors",
        +  "competitors_total",
        +  "competitors_omitted",
        +  "outcomes",
        +  "top_cited_domains",
        +  "readiness",
        +  "collection",
        +  "traffic",
        +  "opportunities",
        +  "pages",
        +  "latest_reports",
        +  "retention"
        +]
    • Changedget_brand_settings1 field changed
      • changedOutput schema / properties / data / properties / reanalysis / properties / status / description
        Previous value: -"queued, running, or failed."New value: +"queued, running, or failed; done once a write's operation shows the re-read finished."
    • Changedget_brand_setup4 fields changed
      • changedOutput schema / properties / data / properties / competitors / items / properties / status / description
        Previous value: -"pending; superseded when its site could not be assessed; accepted or rejected once approved."New value: +"pending, or accepted or rejected once approved. Superseded proposals are not listed while the setup is open."
      • addedOutput schema / properties / data / properties / segment / properties / market / description
        Added value: +"An upper-case country code such as AE, or global. Confirm it with the user: pass it as approve_brand_setup's market, with kind country and this code, or kind global."
      • addedOutput schema / properties / data / properties / segment / properties / market_label
        Added value: +{
        +  "description": "The market's name, for example United Arab Emirates; pass as market.label.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / segment / required
        Previous value: -[
        -  "name",
        -  "market",
        -  "language"
        -]New value: +[
        +  "name",
        +  "market",
        +  "market_label",
        +  "language"
        +]
    • Changedget_citation_source2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
    • Changedget_opportunity5 fields changed
      • addedOutput schema / properties / data / properties / app_url
        Added value: +{
        +  "description": "This opportunity in the Cleotic app.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / data / properties / omitted_competitors
        Added value: +{
        +  "description": "Content gaps: competitors named in the window but absent from every model's latest answer, so not listed in presence.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / data / properties / presence / description
        Previous value: -"Content gaps: how each model's latest answer treats each brand it names."New value: +"Content gaps: how each model's latest answer treats you and the competitors those answers name, up to six."
      • changedOutput schema / properties / data / properties / presence / items / properties / models / items / properties / presence / description
        Previous value: -"ranked, mentioned, caveated, or absent."New value: +"ranked (with rank), recommended (no rank position), mentioned, caveated, or absent."
      • changedOutput schema / properties / data / required
        Previous value: -[
        -  "brand",
        -  "id",
        -  "kind",
        -  "stage",
        -  "title",
        -  "signal",
        -  "segment",
        -  "monthly_ai_searches",
        -  "score",
        -  "assignee",
        -  "found_at",
        -  "stage_changed_at",
        -  "snoozed_until",
        -  "dismissed_at",
        -  "comment_count",
        -  "facts",
        -  "play",
        -  "presence",
        -  "excerpts",
        -  "engine_answers",
        -  "sources",
        -  "trend",
        -  "proof",
        -  "timeline",
        -  "comments"
        -]New value: +[
        +  "brand",
        +  "id",
        +  "kind",
        +  "stage",
        +  "title",
        +  "signal",
        +  "segment",
        +  "monthly_ai_searches",
        +  "score",
        +  "assignee",
        +  "found_at",
        +  "stage_changed_at",
        +  "snoozed_until",
        +  "dismissed_at",
        +  "comment_count",
        +  "app_url",
        +  "facts",
        +  "play",
        +  "presence",
        +  "omitted_competitors",
        +  "excerpts",
        +  "engine_answers",
        +  "sources",
        +  "trend",
        +  "proof",
        +  "timeline",
        +  "comments"
        +]
    • Changedget_perception14 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • addedInput schema / properties / max_competitors
        Added value: +{
        +  "description": "Competitors to include, best overall score first. Defaults to 8; the brand is always included.",
        +  "maximum": 20,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
      • addedOutput schema / properties / data / properties / analysed_at
        Added value: +{
        +  "description": "When the newest analysis in the period ran; empty without data.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / brands / description
        Previous value: -"The brand first, then competitors by overall score."New value: +"The brand first, then up to max_competitors competitors by overall score. Brands without scores are left out."
      • changedOutput schema / properties / data / properties / brands / items / properties / evidence / description
        Previous value: -"Why each dimension scored as it did, with quotes; the brand only."New value: +"Why each dimension scored as it did, with quotes; the brand only. Dimensions with no real evidence are left out."
      • addedOutput schema / properties / data / properties / competitors_omitted
        Added value: +{
        +  "description": "Scored competitors left out by max_competitors.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / data / properties / competitors_total
        Added value: +{
        +  "description": "Competitors with scores in the period.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / data / properties / evidence_available
        Added value: +{
        +  "description": "False when the analysis has scores but no evidence quotes for the brand.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / data / properties / has_data / description
        Previous value: -"False when no perception analysis falls in the period; scores are then empty."New value: +"False when no perception analysis falls in the period; brands is then empty."
      • addedOutput schema / properties / data / properties / latest_analysis_at
        Added value: +{
        +  "description": "Set when the period has no analysis: the newest analysis there is. Ask for a period that includes it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / data / properties / models_covered
        Added value: +{
        +  "description": "Model families the brand's scores come from.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / data / properties / models_expected
        Added value: +{
        +  "description": "Model families the plan collects from.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / data / required
        Previous value: -[
        -  "brand",
        -  "period",
        -  "has_data",
        -  "notice",
        -  "brands",
        -  "trend"
        -]New value: +[
        +  "brand",
        +  "period",
        +  "has_data",
        +  "notice",
        +  "analysed_at",
        +  "latest_analysis_at",
        +  "models_covered",
        +  "models_expected",
        +  "evidence_available",
        +  "brands",
        +  "competitors_total",
        +  "competitors_omitted",
        +  "trend"
        +]
    • Changedget_plan1 field changed
      • addedOutput schema / properties / data / properties / limits / items / properties / used / description
        Added value: +"What is in use. For segments_per_brand, the most segments any one brand has."
    • Changedget_readiness2 fields changed
      • addedInput schema / properties / page_id
        Added value: +{
        +  "description": "pages view: a page_id from the pages list, for that page's findings.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "lenses": {
        -        "description": "Readiness, SEO health and security scores.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "lens": {
        -              "type": "string"
        -            },
        -            "score": {
        -              "type": [
        -                "null",
        -                "number"
        -              ]
        -            },
        -            "verdict": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "lens",
        -            "score",
        -            "verdict"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "open_findings": {
        -        "additionalProperties": false,
        -        "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.",
        -        "properties": {
        -          "critical": {
        -            "type": "integer"
        -          },
        -          "info": {
        -            "type": "integer"
        -          },
        -          "major": {
        -            "type": "integer"
        -          },
        -          "minor": {
        -            "type": "integer"
        -          },
        -          "total": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "critical",
        -          "major",
        -          "minor",
        -          "info",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "pages_audited": {
        -        "type": "integer"
        -      },
        -      "passing_checks": {
        -        "type": "integer"
        -      },
        -      "pillars": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "label": {
        -              "type": "string"
        -            },
        -            "pillar": {
        -              "type": "string"
        -            },
        -            "points_awarded": {
        -              "type": "number"
        -            },
        -            "points_possible": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "pillar",
        -            "label",
        -            "points_awarded",
        -            "points_possible"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "poll_after_seconds": {
        -        "description": "While a scan runs, how long to wait before reading again; 0 otherwise.",
        -        "type": "integer"
        -      },
        -      "progress": {
        -        "additionalProperties": false,
        -        "description": "Set while a scan runs.",
        -        "properties": {
        -          "message": {
        -            "type": "string"
        -          },
        -          "page_limit": {
        -            "type": "integer"
        -          },
        -          "pages_fetched": {
        -            "type": "integer"
        -          },
        -          "percent": {
        -            "type": "integer"
        -          },
        -          "stage": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "stage",
        -          "message",
        -          "percent",
        -          "pages_fetched",
        -          "page_limit"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "scan": {
        -        "additionalProperties": false,
        -        "description": "The scan summarised; null before the first scan.",
        -        "properties": {
        -          "completed_at": {
        -            "type": "string"
        -          },
        -          "error": {
        -            "type": "string"
        -          },
        -          "id": {
        -            "description": "Scan ID, the run_id other readiness calls take.",
        -            "type": "string"
        -          },
        -          "started_at": {
        -            "type": "string"
        -          },
        -          "status": {
        -            "description": "queued, processing, complete, or failed.",
        -            "type": "string"
        -          },
        -          "url": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "status",
        -          "url",
        -          "error",
        -          "started_at",
        -          "completed_at"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "scan_in_progress": {
        -        "type": "boolean"
        -      },
        -      "score": {
        -        "description": "Readiness score, 0-100.",
        -        "type": [
        -          "null",
        -          "number"
        -        ]
        -      },
        -      "verdict": {
        -        "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.",
        -        "type": "string"
        -      },
        -      "view": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "scan",
        -      "score",
        -      "verdict",
        -      "lenses",
        -      "pillars",
        -      "open_findings",
        -      "passing_checks",
        -      "pages_audited",
        -      "scan_in_progress",
        -      "progress",
        -      "poll_after_seconds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "findings": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "affected_pages": {
        -              "type": "integer"
        -            },
        -            "check_id": {
        -              "description": "Pass to get_readiness_finding or verify_readiness_fix.",
        -              "type": "string"
        -            },
        -            "consequence": {
        -              "type": "string"
        -            },
        -            "effort_minutes": {
        -              "type": [
        -                "null",
        -                "integer"
        -              ]
        -            },
        -            "fix_type": {
        -              "type": "string"
        -            },
        -            "label": {
        -              "type": "string"
        -            },
        -            "latest_check": {
        -              "additionalProperties": false,
        -              "description": "The latest re-check since the scan.",
        -              "properties": {
        -                "check_id": {
        -                  "type": "string"
        -                },
        -                "completed_at": {
        -                  "type": "string"
        -                },
        -                "created_at": {
        -                  "type": "string"
        -                },
        -                "error": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "description": "The check_request_id get_readiness_finding takes.",
        -                  "type": "string"
        -                },
        -                "per_url": {
        -                  "items": {
        -                    "additionalProperties": false,
        -                    "properties": {
        -                      "status": {
        -                        "type": "string"
        -                      },
        -                      "url": {
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "url",
        -                      "status"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  "type": "array"
        -                },
        -                "recharges_at": {
        -                  "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        -                  "type": "string"
        -                },
        -                "resolved": {
        -                  "description": "Whether the issue is fixed; null until complete.",
        -                  "type": [
        -                    "null",
        -                    "boolean"
        -                  ]
        -                },
        -                "status": {
        -                  "description": "queued, processing, complete, or failed.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "id",
        -                "check_id",
        -                "status",
        -                "resolved",
        -                "per_url",
        -                "error",
        -                "created_at",
        -                "completed_at",
        -                "recharges_at"
        -              ],
        -              "type": [
        -                "null",
        -                "object"
        -              ]
        -            },
        -            "owner_role": {
        -              "type": "string"
        -            },
        -            "pillar": {
        -              "type": "string"
        -            },
        -            "points_recoverable": {
        -              "type": "number"
        -            },
        -            "severity": {
        -              "description": "critical, major, minor, or info; empty when passing.",
        -              "type": "string"
        -            },
        -            "site_wide": {
        -              "description": "One fix applies to the whole site.",
        -              "type": "boolean"
        -            },
        -            "status": {
        -              "description": "fail, warning, pass, or not_applicable.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "check_id",
        -            "label",
        -            "pillar",
        -            "status",
        -            "severity",
        -            "consequence",
        -            "points_recoverable",
        -            "effort_minutes",
        -            "owner_role",
        -            "fix_type",
        -            "affected_pages",
        -            "site_wide",
        -            "latest_check"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "open_findings": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "critical": {
        -            "type": "integer"
        -          },
        -          "info": {
        -            "type": "integer"
        -          },
        -          "major": {
        -            "type": "integer"
        -          },
        -          "minor": {
        -            "type": "integer"
        -          },
        -          "total": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "critical",
        -          "major",
        -          "minor",
        -          "info",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "pagination": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "next_cursor": {
        -            "description": "Pass as cursor to get the next page; empty on the last page.",
        -            "type": "string"
        -          },
        -          "total": {
        -            "description": "Items across all pages; null when not counted.",
        -            "type": [
        -              "null",
        -              "integer"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "next_cursor",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "questions_no_page_answers": {
        -        "description": "Tracked prompts no page on the site answers well.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "monthly_ai_searches": {
        -              "type": [
        -                "null",
        -                "integer"
        -              ]
        -            },
        -            "opportunity_id": {
        -              "description": "The content gap opportunity for it, when there is one.",
        -              "type": "string"
        -            },
        -            "prompt_id": {
        -              "type": "string"
        -            },
        -            "text": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "prompt_id",
        -            "text",
        -            "monthly_ai_searches",
        -            "opportunity_id"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "scan_id": {
        -        "type": "string"
        -      },
        -      "view": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "scan_id",
        -      "open_findings",
        -      "findings",
        -      "questions_no_page_answers",
        -      "pagination"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "pages": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "page_type": {
        -              "type": "string"
        -            },
        -            "response_time_ms": {
        -              "type": "integer"
        -            },
        -            "status_code": {
        -              "type": "integer"
        -            },
        -            "text_chars": {
        -              "type": "integer"
        -            },
        -            "url": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "url",
        -            "page_type",
        -            "status_code",
        -            "response_time_ms",
        -            "text_chars"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "pagination": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "next_cursor": {
        -            "description": "Pass as cursor to get the next page; empty on the last page.",
        -            "type": "string"
        -          },
        -          "total": {
        -            "description": "Items across all pages; null when not counted.",
        -            "type": [
        -              "null",
        -              "integer"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "next_cursor",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "scan_id": {
        -        "type": "string"
        -      },
        -      "view": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "scan_id",
        -      "pages",
        -      "pagination"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "pagination": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "next_cursor": {
        -            "description": "Pass as cursor to get the next page; empty on the last page.",
        -            "type": "string"
        -          },
        -          "total": {
        -            "description": "Items across all pages; null when not counted.",
        -            "type": [
        -              "null",
        -              "integer"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "next_cursor",
        -          "total"
        -        ],
        -        "type": "object"
        -      },
        -      "scans": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "completed_at": {
        -              "type": "string"
        -            },
        -            "created_at": {
        -              "type": "string"
        -            },
        -            "error": {
        -              "type": "string"
        -            },
        -            "fixed": {
        -              "description": "Findings fixed since the previous scan.",
        -              "type": "integer"
        -            },
        -            "new": {
        -              "type": "integer"
        -            },
        -            "pages_audited": {
        -              "type": [
        -                "null",
        -                "integer"
        -              ]
        -            },
        -            "readiness": {
        -              "type": [
        -                "null",
        -                "number"
        -              ]
        -            },
        -            "regressed": {
        -              "type": "integer"
        -            },
        -            "scan_id": {
        -              "type": "string"
        -            },
        -            "security": {
        -              "type": [
        -                "null",
        -                "number"
        -              ]
        -            },
        -            "seo": {
        -              "type": [
        -                "null",
        -                "number"
        -              ]
        -            },
        -            "status": {
        -              "type": "string"
        -            },
        -            "trigger": {
        -              "description": "manual or scheduled.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "scan_id",
        -            "status",
        -            "trigger",
        -            "readiness",
        -            "seo",
        -            "security",
        -            "pages_audited",
        -            "fixed",
        -            "new",
        -            "regressed",
        -            "created_at",
        -            "completed_at",
        -            "error"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "view": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "scans",
        -      "pagination"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "allowed": {
        -        "description": "Whether competitor scans are available.",
        -        "type": "boolean"
        -      },
        -      "brand": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "id": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "url": {
        -            "description": "The brand's website, or empty when none is set.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "name",
        -          "url"
        -        ],
        -        "type": "object"
        -      },
        -      "competitors": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "brand": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "id": {
        -                  "type": "string"
        -                },
        -                "name": {
        -                  "type": "string"
        -                },
        -                "url": {
        -                  "description": "The brand's website, or empty when none is set.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "id",
        -                "name",
        -                "url"
        -              ],
        -              "type": "object"
        -            },
        -            "next_available_at": {
        -              "type": "string"
        -            },
        -            "scan_id": {
        -              "type": "string"
        -            },
        -            "scanned_at": {
        -              "type": "string"
        -            },
        -            "scores": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "readiness": {
        -                  "type": [
        -                    "null",
        -                    "number"
        -                  ]
        -                },
        -                "security": {
        -                  "type": [
        -                    "null",
        -                    "number"
        -                  ]
        -                },
        -                "seo": {
        -                  "type": [
        -                    "null",
        -                    "number"
        -                  ]
        -                }
        -              },
        -              "required": [
        -                "readiness",
        -                "seo",
        -                "security"
        -              ],
        -              "type": [
        -                "null",
        -                "object"
        -              ]
        -            },
        -            "status": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "brand",
        -            "scan_id",
        -            "status",
        -            "scores",
        -            "scanned_at",
        -            "next_available_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "gaps": {
        -        "description": "Checks competitors pass and the brand does not.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "check_id": {
        -              "type": "string"
        -            },
        -            "competitors": {
        -              "items": {
        -                "type": "string"
        -              },
        -              "type": "array"
        -            },
        -            "fix_summary": {
        -              "type": "string"
        -            },
        -            "label": {
        -              "type": "string"
        -            },
        -            "pillar": {
        -              "type": "string"
        -            },
        -            "points_possible": {
        -              "type": "number"
        -            },
        -            "your_status": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "check_id",
        -            "label",
        -            "pillar",
        -            "your_status",
        -            "competitors",
        -            "points_possible",
        -            "fix_summary"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "reason": {
        -        "description": "Why not: plan, role, or no_competitors.",
        -        "type": "string"
        -      },
        -      "view": {
        -        "type": "string"
        -      },
        -      "you": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "readiness": {
        -            "type": [
        -              "null",
        -              "number"
        -            ]
        -          },
        -          "security": {
        -            "type": [
        -              "null",
        -              "number"
        -            ]
        -          },
        -          "seo": {
        -            "type": [
        -              "null",
        -              "number"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "readiness",
        -          "seo",
        -          "security"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "brand",
        -      "view",
        -      "allowed",
        -      "reason",
        -      "you",
        -      "competitors",
        -      "gaps"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "can_start_scan": {
        +        "description": "Whether run_readiness_scan can start a scan for you now.",
        +        "type": "boolean"
        +      },
        +      "disabled_reason": {
        +        "description": "Why it cannot: scheduled_only (later scans run weekly), run_active, role, or no_site; empty when it can.",
        +        "type": "string"
        +      },
        +      "lenses": {
        +        "description": "Readiness, SEO health and security scores.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "lens": {
        +              "type": "string"
        +            },
        +            "score": {
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "verdict": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "lens",
        +            "score",
        +            "verdict"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "next_run_at": {
        +        "description": "When the next weekly scan runs; empty before the first scan completes.",
        +        "type": "string"
        +      },
        +      "open_findings": {
        +        "additionalProperties": false,
        +        "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.",
        +        "properties": {
        +          "critical": {
        +            "type": "integer"
        +          },
        +          "info": {
        +            "type": "integer"
        +          },
        +          "major": {
        +            "type": "integer"
        +          },
        +          "minor": {
        +            "type": "integer"
        +          },
        +          "total": {
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "critical",
        +          "major",
        +          "minor",
        +          "info",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "pages_audited": {
        +        "type": "integer"
        +      },
        +      "passing_checks": {
        +        "type": "integer"
        +      },
        +      "pillars": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "label": {
        +              "type": "string"
        +            },
        +            "pillar": {
        +              "type": "string"
        +            },
        +            "points_awarded": {
        +              "type": "number"
        +            },
        +            "points_possible": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "pillar",
        +            "label",
        +            "points_awarded",
        +            "points_possible"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "poll_after_seconds": {
        +        "description": "While a scan runs, how long to wait before reading again; 0 otherwise.",
        +        "type": "integer"
        +      },
        +      "progress": {
        +        "additionalProperties": false,
        +        "description": "Set while a scan runs.",
        +        "properties": {
        +          "message": {
        +            "type": "string"
        +          },
        +          "page_limit": {
        +            "type": "integer"
        +          },
        +          "pages_fetched": {
        +            "type": "integer"
        +          },
        +          "percent": {
        +            "type": "integer"
        +          },
        +          "stage": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "stage",
        +          "message",
        +          "percent",
        +          "pages_fetched",
        +          "page_limit"
        +        ],
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "scan": {
        +        "additionalProperties": false,
        +        "description": "The scan summarised; null before the first scan.",
        +        "properties": {
        +          "completed_at": {
        +            "type": "string"
        +          },
        +          "error": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Scan ID, the run_id other readiness calls take.",
        +            "type": "string"
        +          },
        +          "started_at": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "queued, processing, complete, or failed.",
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "status",
        +          "url",
        +          "error",
        +          "started_at",
        +          "completed_at"
        +        ],
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      },
        +      "scan_in_progress": {
        +        "type": "boolean"
        +      },
        +      "score": {
        +        "description": "Readiness score, 0-100.",
        +        "type": [
        +          "null",
        +          "number"
        +        ]
        +      },
        +      "verdict": {
        +        "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.",
        +        "type": "string"
        +      },
        +      "view": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "scan",
        +      "score",
        +      "verdict",
        +      "lenses",
        +      "pillars",
        +      "open_findings",
        +      "passing_checks",
        +      "pages_audited",
        +      "scan_in_progress",
        +      "progress",
        +      "poll_after_seconds",
        +      "can_start_scan",
        +      "disabled_reason",
        +      "next_run_at"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "findings": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "affected_pages": {
        +              "type": "integer"
        +            },
        +            "check_id": {
        +              "description": "Pass to get_readiness_finding or verify_readiness_fix.",
        +              "type": "string"
        +            },
        +            "consequence": {
        +              "type": "string"
        +            },
        +            "effort_minutes": {
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "fix_type": {
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "latest_check": {
        +              "additionalProperties": false,
        +              "description": "The latest re-check since the scan.",
        +              "properties": {
        +                "check_id": {
        +                  "type": "string"
        +                },
        +                "completed_at": {
        +                  "type": "string"
        +                },
        +                "created_at": {
        +                  "type": "string"
        +                },
        +                "error": {
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "description": "The check_request_id get_readiness_finding takes.",
        +                  "type": "string"
        +                },
        +                "per_url": {
        +                  "items": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "status": {
        +                        "type": "string"
        +                      },
        +                      "url": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "url",
        +                      "status"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": "array"
        +                },
        +                "recharges_at": {
        +                  "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        +                  "type": "string"
        +                },
        +                "resolved": {
        +                  "description": "Whether the issue is fixed; null until complete.",
        +                  "type": [
        +                    "null",
        +                    "boolean"
        +                  ]
        +                },
        +                "status": {
        +                  "description": "queued, processing, complete, or failed.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "check_id",
        +                "status",
        +                "resolved",
        +                "per_url",
        +                "error",
        +                "created_at",
        +                "completed_at",
        +                "recharges_at"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "owner_role": {
        +              "type": "string"
        +            },
        +            "pillar": {
        +              "type": "string"
        +            },
        +            "points_recoverable": {
        +              "type": "number"
        +            },
        +            "severity": {
        +              "description": "critical, major, minor, or info; empty when passing.",
        +              "type": "string"
        +            },
        +            "site_wide": {
        +              "description": "One fix applies to the whole site.",
        +              "type": "boolean"
        +            },
        +            "status": {
        +              "description": "fail, warning, pass, or not_applicable.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "check_id",
        +            "label",
        +            "pillar",
        +            "status",
        +            "severity",
        +            "consequence",
        +            "points_recoverable",
        +            "effort_minutes",
        +            "owner_role",
        +            "fix_type",
        +            "affected_pages",
        +            "site_wide",
        +            "latest_check"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "open_findings": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "critical": {
        +            "type": "integer"
        +          },
        +          "info": {
        +            "type": "integer"
        +          },
        +          "major": {
        +            "type": "integer"
        +          },
        +          "minor": {
        +            "type": "integer"
        +          },
        +          "total": {
        +            "type": "integer"
        +          }
        +        },
        +        "required": [
        +          "critical",
        +          "major",
        +          "minor",
        +          "info",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "pagination": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "next_cursor": {
        +            "description": "Pass as cursor to get the next page; empty on the last page.",
        +            "type": "string"
        +          },
        +          "total": {
        +            "description": "Items across all pages; null when not counted.",
        +            "type": [
        +              "null",
        +              "integer"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "next_cursor",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "questions_no_page_answers": {
        +        "description": "Tracked prompts no page on the site answers well.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "monthly_ai_searches": {
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "opportunity_id": {
        +              "description": "The content gap opportunity for it, when there is one.",
        +              "type": "string"
        +            },
        +            "prompt_id": {
        +              "type": "string"
        +            },
        +            "text": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "prompt_id",
        +            "text",
        +            "monthly_ai_searches",
        +            "opportunity_id"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "scan_id": {
        +        "type": "string"
        +      },
        +      "view": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "scan_id",
        +      "open_findings",
        +      "findings",
        +      "questions_no_page_answers",
        +      "pagination"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "pages": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_id": {
        +              "description": "Pass to get_readiness view pages with page_id for this page's findings.",
        +              "type": "string"
        +            },
        +            "page_type": {
        +              "type": "string"
        +            },
        +            "response_time_ms": {
        +              "type": "integer"
        +            },
        +            "status_code": {
        +              "type": "integer"
        +            },
        +            "text_chars": {
        +              "type": "integer"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "page_id",
        +            "url",
        +            "page_type",
        +            "status_code",
        +            "response_time_ms",
        +            "text_chars"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "pagination": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "next_cursor": {
        +            "description": "Pass as cursor to get the next page; empty on the last page.",
        +            "type": "string"
        +          },
        +          "total": {
        +            "description": "Items across all pages; null when not counted.",
        +            "type": [
        +              "null",
        +              "integer"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "next_cursor",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "scan_id": {
        +        "type": "string"
        +      },
        +      "view": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "scan_id",
        +      "pages",
        +      "pagination"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "findings": {
        +        "description": "Open findings that affect this page, in fix order; at most 25.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "affected_pages": {
        +              "type": "integer"
        +            },
        +            "check_id": {
        +              "description": "Pass to get_readiness_finding or verify_readiness_fix.",
        +              "type": "string"
        +            },
        +            "consequence": {
        +              "type": "string"
        +            },
        +            "effort_minutes": {
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "fix_type": {
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "latest_check": {
        +              "additionalProperties": false,
        +              "description": "The latest re-check since the scan.",
        +              "properties": {
        +                "check_id": {
        +                  "type": "string"
        +                },
        +                "completed_at": {
        +                  "type": "string"
        +                },
        +                "created_at": {
        +                  "type": "string"
        +                },
        +                "error": {
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "description": "The check_request_id get_readiness_finding takes.",
        +                  "type": "string"
        +                },
        +                "per_url": {
        +                  "items": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "status": {
        +                        "type": "string"
        +                      },
        +                      "url": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "url",
        +                      "status"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": "array"
        +                },
        +                "recharges_at": {
        +                  "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        +                  "type": "string"
        +                },
        +                "resolved": {
        +                  "description": "Whether the issue is fixed; null until complete.",
        +                  "type": [
        +                    "null",
        +                    "boolean"
        +                  ]
        +                },
        +                "status": {
        +                  "description": "queued, processing, complete, or failed.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "check_id",
        +                "status",
        +                "resolved",
        +                "per_url",
        +                "error",
        +                "created_at",
        +                "completed_at",
        +                "recharges_at"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "owner_role": {
        +              "type": "string"
        +            },
        +            "pillar": {
        +              "type": "string"
        +            },
        +            "points_recoverable": {
        +              "type": "number"
        +            },
        +            "severity": {
        +              "description": "critical, major, minor, or info; empty when passing.",
        +              "type": "string"
        +            },
        +            "site_wide": {
        +              "description": "One fix applies to the whole site.",
        +              "type": "boolean"
        +            },
        +            "status": {
        +              "description": "fail, warning, pass, or not_applicable.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "check_id",
        +            "label",
        +            "pillar",
        +            "status",
        +            "severity",
        +            "consequence",
        +            "points_recoverable",
        +            "effort_minutes",
        +            "owner_role",
        +            "fix_type",
        +            "affected_pages",
        +            "site_wide",
        +            "latest_check"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "page": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "page_id": {
        +            "description": "Pass to get_readiness view pages with page_id for this page's findings.",
        +            "type": "string"
        +          },
        +          "page_type": {
        +            "type": "string"
        +          },
        +          "response_time_ms": {
        +            "type": "integer"
        +          },
        +          "status_code": {
        +            "type": "integer"
        +          },
        +          "text_chars": {
        +            "type": "integer"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "page_id",
        +          "url",
        +          "page_type",
        +          "status_code",
        +          "response_time_ms",
        +          "text_chars"
        +        ],
        +        "type": "object"
        +      },
        +      "scan_id": {
        +        "type": "string"
        +      },
        +      "total_findings": {
        +        "type": "integer"
        +      },
        +      "view": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "scan_id",
        +      "page",
        +      "findings",
        +      "total_findings"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "pagination": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "next_cursor": {
        +            "description": "Pass as cursor to get the next page; empty on the last page.",
        +            "type": "string"
        +          },
        +          "total": {
        +            "description": "Items across all pages; null when not counted.",
        +            "type": [
        +              "null",
        +              "integer"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "next_cursor",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "scans": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "completed_at": {
        +              "type": "string"
        +            },
        +            "created_at": {
        +              "type": "string"
        +            },
        +            "error": {
        +              "type": "string"
        +            },
        +            "fixed": {
        +              "description": "Findings fixed since the previous scan.",
        +              "type": "integer"
        +            },
        +            "new": {
        +              "type": "integer"
        +            },
        +            "pages_audited": {
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "readiness": {
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "regressed": {
        +              "type": "integer"
        +            },
        +            "scan_id": {
        +              "type": "string"
        +            },
        +            "security": {
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "seo": {
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "trigger": {
        +              "description": "manual or scheduled.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "scan_id",
        +            "status",
        +            "trigger",
        +            "readiness",
        +            "seo",
        +            "security",
        +            "pages_audited",
        +            "fixed",
        +            "new",
        +            "regressed",
        +            "created_at",
        +            "completed_at",
        +            "error"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "view": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "scans",
        +      "pagination"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "allowed": {
        +        "description": "Whether competitor scans are available.",
        +        "type": "boolean"
        +      },
        +      "brand": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "The brand's website, or empty when none is set.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "competitors": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "next_available_at": {
        +              "type": "string"
        +            },
        +            "scan_id": {
        +              "type": "string"
        +            },
        +            "scanned_at": {
        +              "type": "string"
        +            },
        +            "scores": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "readiness": {
        +                  "type": [
        +                    "null",
        +                    "number"
        +                  ]
        +                },
        +                "security": {
        +                  "type": [
        +                    "null",
        +                    "number"
        +                  ]
        +                },
        +                "seo": {
        +                  "type": [
        +                    "null",
        +                    "number"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "readiness",
        +                "seo",
        +                "security"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "status": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "scan_id",
        +            "status",
        +            "scores",
        +            "scanned_at",
        +            "next_available_at"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "cooldown_days": {
        +        "description": "Days before a competitor can be scanned again.",
        +        "type": "integer"
        +      },
        +      "gaps": {
        +        "description": "Checks competitors pass and the brand does not.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "check_id": {
        +              "type": "string"
        +            },
        +            "competitors": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "fix_summary": {
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "pillar": {
        +              "type": "string"
        +            },
        +            "points_possible": {
        +              "type": "number"
        +            },
        +            "your_status": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "check_id",
        +            "label",
        +            "pillar",
        +            "your_status",
        +            "competitors",
        +            "points_possible",
        +            "fix_summary"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "max_competitors": {
        +        "description": "How many competitors can be scanned.",
        +        "type": "integer"
        +      },
        +      "note": {
        +        "description": "Where competitor scans are started: in the app, not through MCP.",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "description": "Why not: plan, role, or no_competitors.",
        +        "type": "string"
        +      },
        +      "view": {
        +        "type": "string"
        +      },
        +      "you": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "readiness": {
        +            "type": [
        +              "null",
        +              "number"
        +            ]
        +          },
        +          "security": {
        +            "type": [
        +              "null",
        +              "number"
        +            ]
        +          },
        +          "seo": {
        +            "type": [
        +              "null",
        +              "number"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "readiness",
        +          "seo",
        +          "security"
        +        ],
        +        "type": [
        +          "null",
        +          "object"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "brand",
        +      "view",
        +      "allowed",
        +      "reason",
        +      "max_competitors",
        +      "cooldown_days",
        +      "note",
        +      "you",
        +      "competitors",
        +      "gaps"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_readiness_finding1 field changed
      • changedOutput schema / properties / data / properties / instances / items / required
        Previous value: -[
        -  "url",
        -  "scope",
        -  "page_count",
        -  "current",
        -  "expected",
        -  "detail"
        -]New value: +[
        +  "scope",
        +  "page_count"
        +]
    • Changedlist_answers3 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / model / description
        Previous value: -"Optional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model."New value: +"Optional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model. A family is exact: gemini does not include google-ai-mode or google-ai-overviews."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
    • Changedlist_brands2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
    • Changedlist_citations2 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
    • Changedlist_opportunities1 field changed
      • changedInput schema / properties / assignee / description
        Previous value: -"Optional: me, or a member ID."New value: +"Optional: me, or a member ID (none is not accepted here). No tool lists members: take an ID from an opportunity's assignee.member_id."
    • Changedlist_prompts3 fields changed
      • changedInput schema / properties / from / description
        Previous value: -"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to. Windows are at most 180 days and a from after today is refused; a plan with limited history serves only the days it keeps and says so in retention."
      • changedInput schema / properties / to / description
        Previous value: -"End date, YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD, inclusive; from equal to to is a single day. Defaults to today; a later date is treated as today."
      • changedOutput schema / properties / data / properties / prompts / items / properties / monthly_ai_searches / description
        Previous value: -"Estimated monthly AI searches for the question; null when unknown."New value: +"Estimated monthly AI searches for the question; null until the hourly demand lookup has run for it, or when none was found."
    • Changedmark_page_published6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedredraft_page_section6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Addedrevoke_report
    • Changedrun_readiness_scan6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedsave_competitor8 fields changed
      • addedInput schema / properties / aliases / description
        Added value: +"The full list of other names answers use for it. Replaces the current aliases, so include the existing ones; [] clears them."
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
      • changedOutput schema / properties / data / properties / resource / properties / reanalysis / properties / status / description
        Previous value: -"queued, running, or failed."New value: +"queued, running, or failed; done once a write's operation shows the re-read finished."
    • Changedsave_prompt7 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • addedInput schema / properties / market / description
        Added value: +"A free-text label stored on the prompt. It does not change where the prompt is collected: the segment's geo does."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedsave_segment7 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / geo / description
        Previous value: -"Country code, for example GB."New value: +"Country code, for example GB, or global: where this segment's answers are collected from."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedset_primary_brand8 fields changed
      • changedInput schema / properties / aliases / description
        Previous value: -"Other names answers use for the brand."New value: +"The full list of other names answers use for the brand. Replaces the current aliases, so include the existing ones; [] clears them."
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
      • changedOutput schema / properties / data / properties / resource / properties / reanalysis / properties / status / description
        Previous value: -"queued, running, or failed."New value: +"queued, running, or failed; done once a write's operation shows the re-read finished."
    • Changedstart_brand_setup5 fields changed
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedsuggest_prompts2 fields changed
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • changedOutput schema / properties / data / properties / suggestions / description
        Previous value: -"Highest AI search demand first."New value: +"Highest AI search demand first when demand data exists; otherwise the model's order."
    • Changedupdate_brand6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedupdate_brand_voice6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedupdate_opportunities8 fields changed
      • changedInput schema / properties / assignee / description
        Previous value: -"Assign to a member ID, to yourself with me, or unassign with none."New value: +"me (yourself), none (unassign), or a member ID. No tool lists members: take an ID from an opportunity's assignee.member_id."
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedInput schema / properties / snooze_until / description
        Previous value: -"Hide until this date (YYYY-MM-DD) or RFC 3339 time."New value: +"Hide until this date (YYYY-MM-DD, taken as 09:00 UTC) or RFC 3339 time."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
    • Changedverify_readiness_fix6 fields changed
      • changedInput schema / properties / brand / description
        Previous value: -"Brand or study: its ID from list_brands, or its name."New value: +"Brand or study: its ID from list_brands, or its exact name. A partial name is refused."
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"A unique key for this intended action. Reuse it with identical arguments when retrying; use a new key for another action."New value: +"A unique key for this intended action. Reuse it with identical arguments when retrying: the write is not made again, and the reply is the first call's resource as saved (replayed: true) with current status; read tools show the resource's current state. Use a new key for another action."
      • changedOutput schema / properties / data / properties / brand / description
        Previous value: -"The brand written to; null for brand setup before approval."New value: +"The brand written to; null for start_brand_setup, which has no brand yet."
      • changedOutput schema / properties / data / properties / cost / properties / readiness_scans / description
        Previous value: -"Site readiness scans used from the plan's monthly allowance."New value: +"Full site readiness scans started; counted for the month, with no monthly allowance."
      • addedOutput schema / properties / data / properties / created_at
        Added value: +{
        +  "description": "Set on a replay: when the original call was made.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / properties / replayed / description
        Previous value: -"True when this repeats an earlier call with the same idempotency_key."New value: +"True when this repeats an earlier call with the same idempotency_key. The write is not made again: resource is as first saved, status, progress and message are current, and the read tools show the resource's current state."
  6. 5 tool updates
    • Changedget_brand_overview1 field changed
      • addedOutput schema / properties / data / properties / collection / properties / next_collection_at
        Added value: +{
        +  "description": "When the brand's prompts are next collected (00:00 UTC on Mondays, Wednesdays and Fridays). Absent when nothing is set to collect.",
        +  "type": "string"
        +}
    • Changedget_brand_settings1 field changed
      • changedOutput schema / properties / data / properties / segments / items / properties / status / description
        Previous value: -"active segments collect daily; paused ones do not."New value: +"active segments collect on Mondays, Wednesdays and Fridays; paused ones do not."
    • Changedlist_brands1 field changed
      • addedOutput schema / properties / data / properties / brands / items / properties / collection / properties / next_collection_at
        Added value: +{
        +  "description": "When the brand's prompts are next collected (00:00 UTC on Mondays, Wednesdays and Fridays). Absent when nothing is set to collect.",
        +  "type": "string"
        +}
    • Changedlist_prompts1 field changed
      • changedOutput schema / properties / data / properties / prompts / items / properties / status / description
        Previous value: -"active prompts run daily; paused ones do not."New value: +"active prompts run on Mondays, Wednesdays and Fridays; paused ones do not."
    • Changedsave_segment1 field changed
      • changedOutput schema / properties / data / properties / resource / properties / status / description
        Previous value: -"active segments collect daily; paused ones do not."New value: +"active segments collect on Mondays, Wednesdays and Fridays; paused ones do not."
  7. 1 tool update
    • Changedlist_answers1 field changed
      • changedInput schema / properties / model / description
        Previous value: -"Optional model family: chatgpt, claude, gemini, perplexity, grok, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model."New value: +"Optional model family: chatgpt, claude, gemini, perplexity, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model."
  8. 42 tool updates
    • Changedact_on_opportunity1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "action": {
        +              "type": "string"
        +            },
        +            "assignee": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "member_id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "member_id",
        +                "name"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "comment_count": {
        +              "type": "integer"
        +            },
        +            "dismissed_at": {
        +              "type": "string"
        +            },
        +            "found_at": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "kind": {
        +              "description": "content_gap, readiness, source_gap, traffic_gap, or coverage_gap.",
        +              "type": "string"
        +            },
        +            "monthly_ai_searches": {
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "score": {
        +              "description": "0-100 priority.",
        +              "type": "integer"
        +            },
        +            "segment": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "signal": {
        +              "description": "Why it matters now.",
        +              "type": "string"
        +            },
        +            "snoozed_until": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "description": "now, in_flight, watching, or won.",
        +              "type": "string"
        +            },
        +            "stage_changed_at": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "kind",
        +            "stage",
        +            "title",
        +            "signal",
        +            "segment",
        +            "monthly_ai_searches",
        +            "score",
        +            "assignee",
        +            "found_at",
        +            "stage_changed_at",
        +            "snoozed_until",
        +            "dismissed_at",
        +            "comment_count",
        +            "action"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedanswer_page_questions3 fields changed
      • changedInput schema / properties / answers / items / properties / answer / maxLength
        Previous value: -4000New value: +1000
      • changedInput schema / properties / answers / items / properties / question_id / description
        Previous value: -"A question ID from get_page's plan.facts."New value: +"A question ID from get_page's interview.questions."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_id": {
        +              "type": "string"
        +            },
        +            "plan_status": {
        +              "type": "string"
        +            },
        +            "published_url": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "page_id",
        +            "title",
        +            "status",
        +            "plan_status",
        +            "published_url"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedapprove_brand_setup4 fields changed
      • changedInput schema / properties / accepted_brand_proposal_ids / description
        Previous value: -"Competitor proposal IDs to keep, from get_brand_setup."New value: +"Competitor proposal IDs to keep, from get_brand_setup. [] keeps none."
      • changedInput schema / properties / accepted_prompt_proposal_ids / description
        Previous value: -"Prompt proposal IDs to keep, from get_brand_setup."New value: +"Prompt proposal IDs to keep, from get_brand_setup. [] keeps none."
      • changedInput schema / required
        Previous value: -[
        -  "idempotency_key",
        -  "setup_id"
        -]New value: +[
        +  "idempotency_key",
        +  "setup_id",
        +  "accepted_brand_proposal_ids",
        +  "accepted_prompt_proposal_ids"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand_id": {
        +              "type": "string"
        +            },
        +            "prompts": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "text"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "segment": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "setup_id": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "setup_id",
        +            "status",
        +            "brand_id",
        +            "segment",
        +            "prompts"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedcomment_on_opportunity1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "author": {
        +              "type": "string"
        +            },
        +            "body": {
        +              "type": "string"
        +            },
        +            "created_at": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "body",
        +            "author",
        +            "created_at"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_page1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_id": {
        +              "type": "string"
        +            },
        +            "plan_status": {
        +              "type": "string"
        +            },
        +            "published_url": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "page_id",
        +            "title",
        +            "status",
        +            "plan_status",
        +            "published_url"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_report1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "created_at": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "public_url": {
        +              "description": "Anyone with this link can read the report; empty when revoked.",
        +              "type": "string"
        +            },
        +            "revoked": {
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "period",
        +            "created_at",
        +            "public_url",
        +            "revoked"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changeddraft_page1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_id": {
        +              "type": "string"
        +            },
        +            "plan_status": {
        +              "type": "string"
        +            },
        +            "published_url": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "page_id",
        +            "title",
        +            "status",
        +            "plan_status",
        +            "published_url"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ai_traffic9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • addedInput schema / properties / from / format
        Added value: +"date"
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • changedInput schema / properties / path / description
        Previous value: -"Optional page path filter."New value: +"Optional exact page path, for example /pricing."
      • changedInput schema / properties / provider / description
        Previous value: -"Optional AI provider filter."New value: +"Optional AI provider, as the summary's systems name it, for example OpenAI."
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "ai_referrals": {
        +              "type": "integer"
        +            },
        +            "ai_share": {
        +              "description": "AI visits as a percentage of all visits.",
        +              "type": "number"
        +            },
        +            "ai_visits": {
        +              "type": "integer"
        +            },
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "connected": {
        +              "description": "Whether site tracking is set up; when false nothing is measured.",
        +              "type": "boolean"
        +            },
        +            "crawler_visits": {
        +              "type": "integer"
        +            },
        +            "crawlers": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "name": {
        +                    "type": "string"
        +                  },
        +                  "pages": {
        +                    "type": "integer"
        +                  },
        +                  "provider": {
        +                    "type": "string"
        +                  },
        +                  "visits": {
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "name",
        +                  "provider",
        +                  "visits",
        +                  "pages"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "latest_visit_at": {
        +              "type": "string"
        +            },
        +            "pages_reached": {
        +              "type": "integer"
        +            },
        +            "pages_to_improve": {
        +              "description": "Pages AI crawlers read but people rarely reach from AI answers.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "ai_referrals": {
        +                    "type": "integer"
        +                  },
        +                  "ai_visits": {
        +                    "type": "integer"
        +                  },
        +                  "change": {
        +                    "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "crawler_visits": {
        +                    "type": "integer"
        +                  },
        +                  "path": {
        +                    "type": "string"
        +                  },
        +                  "providers": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "total_visits": {
        +                    "type": "integer"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "path",
        +                  "url",
        +                  "total_visits",
        +                  "ai_visits",
        +                  "crawler_visits",
        +                  "ai_referrals",
        +                  "providers",
        +                  "change"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "referral_sources": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "name": {
        +                    "type": "string"
        +                  },
        +                  "pages": {
        +                    "type": "integer"
        +                  },
        +                  "provider": {
        +                    "type": "string"
        +                  },
        +                  "referrals": {
        +                    "type": "integer"
        +                  },
        +                  "source": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "source",
        +                  "name",
        +                  "provider",
        +                  "referrals",
        +                  "pages"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "systems": {
        +              "description": "AI providers, by visits.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "ai_referrals": {
        +                    "type": "integer"
        +                  },
        +                  "crawler_visits": {
        +                    "type": "integer"
        +                  },
        +                  "pages": {
        +                    "type": "integer"
        +                  },
        +                  "provider": {
        +                    "description": "Pass as provider to filter.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "provider",
        +                  "crawler_visits",
        +                  "ai_referrals",
        +                  "pages"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "total_visits": {
        +              "type": "integer"
        +            },
        +            "view": {
        +              "type": "string"
        +            },
        +            "weekly": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "ai_referrals": {
        +                    "type": "integer"
        +                  },
        +                  "crawler_visits": {
        +                    "type": "integer"
        +                  },
        +                  "week_start": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "week_start",
        +                  "crawler_visits",
        +                  "ai_referrals"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "period",
        +            "connected",
        +            "total_visits",
        +            "ai_visits",
        +            "ai_share",
        +            "crawler_visits",
        +            "ai_referrals",
        +            "pages_reached",
        +            "latest_visit_at",
        +            "systems",
        +            "crawlers",
        +            "referral_sources",
        +            "pages_to_improve",
        +            "weekly"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "connected": {
        +              "type": "boolean"
        +            },
        +            "pages": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "ai_referrals": {
        +                    "type": "integer"
        +                  },
        +                  "ai_visits": {
        +                    "type": "integer"
        +                  },
        +                  "change": {
        +                    "description": "Change in the AI share of the page's visits on the previous period, in percentage points; null when new.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "crawler_visits": {
        +                    "type": "integer"
        +                  },
        +                  "path": {
        +                    "type": "string"
        +                  },
        +                  "providers": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "total_visits": {
        +                    "type": "integer"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "path",
        +                  "url",
        +                  "total_visits",
        +                  "ai_visits",
        +                  "crawler_visits",
        +                  "ai_referrals",
        +                  "providers",
        +                  "change"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "period",
        +            "connected",
        +            "pages",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "connected": {
        +              "type": "boolean"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "view": {
        +              "type": "string"
        +            },
        +            "visits": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "captured_at": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "description": "The crawler or referring AI product.",
        +                    "type": "string"
        +                  },
        +                  "path": {
        +                    "type": "string"
        +                  },
        +                  "provider": {
        +                    "type": "string"
        +                  },
        +                  "type": {
        +                    "description": "crawler or referral.",
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "type",
        +                  "path",
        +                  "url",
        +                  "provider",
        +                  "name",
        +                  "captured_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "period",
        +            "connected",
        +            "visits",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        }
        +      ]
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_answer3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / answer_id / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brands_mentioned": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand_id": {
        +                "type": "string"
        +              },
        +              "context": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "position": {
        +                "description": "Order among mentioned brands, 1 = first.",
        +                "type": "integer"
        +              },
        +              "sentiment": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "brand_id",
        +              "name",
        +              "position",
        +              "sentiment",
        +              "context"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "captured_at": {
        +          "type": "string"
        +        },
        +        "citations": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "domain": {
        +                "type": "string"
        +              },
        +              "ownership": {
        +                "description": "own, competitor, or third_party.",
        +                "type": "string"
        +              },
        +              "position": {
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "url",
        +              "domain",
        +              "title",
        +              "ownership",
        +              "position"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "model": {
        +          "description": "Model family key.",
        +          "type": "string"
        +        },
        +        "model_name": {
        +          "type": "string"
        +        },
        +        "model_version": {
        +          "description": "The exact model that answered.",
        +          "type": "string"
        +        },
        +        "outcome": {
        +          "additionalProperties": false,
        +          "description": "null until classified.",
        +          "properties": {
        +            "labels": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "outcome": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "outcome",
        +            "labels"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "prompt_id": {
        +          "type": "string"
        +        },
        +        "ranked_list": {
        +          "description": "The answer's own numbered list, when it has one.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand_id": {
        +                "description": "Set when the entry is a tracked brand.",
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "position": {
        +                "type": "integer"
        +              }
        +            },
        +            "required": [
        +              "position",
        +              "name",
        +              "brand_id"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "recommendations": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand_id": {
        +                "type": "string"
        +              },
        +              "context": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "rank": {
        +                "description": "Position in the answer's ranking; null when unranked.",
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "status": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "brand_id",
        +              "name",
        +              "status",
        +              "rank",
        +              "context"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "text": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "prompt_id",
        +        "model",
        +        "model_name",
        +        "model_version",
        +        "captured_at",
        +        "text",
        +        "brands_mentioned",
        +        "recommendations",
        +        "ranked_list",
        +        "outcome",
        +        "citations"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_brand_overview6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • addedInput schema / properties / from / format
        Added value: +"date"
      • removedInput schema / properties / model
        Removed value: -{
        -  "description": "Optional model filter.",
        -  "type": "string"
        -}
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "by_model": {
        +          "description": "Mention rate per AI model, highest first. Models missing here returned no answers in the period.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "mention_rate": {
        +                "description": "Percentage of the model's answers that mention the brand.",
        +                "type": "number"
        +              },
        +              "model": {
        +                "description": "Model family key, as list_answers' model filter takes it.",
        +                "type": "string"
        +              },
        +              "model_name": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "model",
        +              "model_name",
        +              "mention_rate"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "collection": {
        +          "additionalProperties": false,
        +          "description": "Brand-wide; not filtered by segment.",
        +          "properties": {
        +            "active_prompts": {
        +              "type": "integer"
        +            },
        +            "active_segments": {
        +              "type": "integer"
        +            },
        +            "failed": {
        +              "description": "Failed captures, plus each expected model that returned nothing for an active segment.",
        +              "type": "integer"
        +            },
        +            "models_collecting": {
        +              "description": "AI models that answered in the period.",
        +              "type": "integer"
        +            },
        +            "models_expected": {
        +              "description": "AI models the plan tracks.",
        +              "type": "integer"
        +            },
        +            "state": {
        +              "description": "ready: complete. partial: some captures failed or some models returned nothing. stale: nothing new in the period. insufficient: nothing to collect.",
        +              "type": "string"
        +            },
        +            "unaccounted": {
        +              "description": "Captures that were expected but neither succeeded nor failed.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "state",
        +            "active_segments",
        +            "active_prompts",
        +            "failed",
        +            "unaccounted",
        +            "models_expected",
        +            "models_collecting"
        +          ],
        +          "type": "object"
        +        },
        +        "competitors": {
        +          "description": "Every tracked brand, including this one, by share of voice.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "description": "The brand's website, or empty when none is set.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "name",
        +                  "url"
        +                ],
        +                "type": "object"
        +              },
        +              "is_you": {
        +                "description": "True for the brand being tracked.",
        +                "type": "boolean"
        +              },
        +              "mentions": {
        +                "type": "integer"
        +              },
        +              "share_of_voice": {
        +                "type": [
        +                  "null",
        +                  "number"
        +                ]
        +              },
        +              "visibility": {
        +                "type": [
        +                  "null",
        +                  "number"
        +                ]
        +              }
        +            },
        +            "required": [
        +              "brand",
        +              "is_you",
        +              "visibility",
        +              "share_of_voice",
        +              "mentions"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "type": "string"
        +        },
        +        "latest_reports": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "id": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "period": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "from": {
        +                    "description": "First day, YYYY-MM-DD.",
        +                    "type": "string"
        +                  },
        +                  "to": {
        +                    "description": "Last day, YYYY-MM-DD.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "from",
        +                  "to"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "period"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "opportunities": {
        +          "additionalProperties": false,
        +          "description": "Brand-wide; not filtered by segment.",
        +          "properties": {
        +            "high_priority": {
        +              "description": "Opportunities in Now scoring 75 or more.",
        +              "type": "integer"
        +            },
        +            "now": {
        +              "description": "Opportunities in the Now stage, as list_opportunities counts them.",
        +              "type": "integer"
        +            },
        +            "top": {
        +              "additionalProperties": false,
        +              "description": "The highest-ranked opportunity in Now; null when Now is empty.",
        +              "properties": {
        +                "id": {
        +                  "description": "Opportunity ID for get_opportunity.",
        +                  "type": "string"
        +                },
        +                "kind": {
        +                  "type": "string"
        +                },
        +                "score": {
        +                  "type": "integer"
        +                },
        +                "title": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "kind",
        +                "title",
        +                "score"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "now",
        +            "high_priority",
        +            "top"
        +          ],
        +          "type": "object"
        +        },
        +        "outcomes": {
        +          "description": "How answers treated the brand.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "answers": {
        +                "type": "integer"
        +              },
        +              "outcome": {
        +                "type": "string"
        +              },
        +              "share": {
        +                "description": "Percentage of classified answers.",
        +                "type": [
        +                  "null",
        +                  "number"
        +                ]
        +              }
        +            },
        +            "required": [
        +              "outcome",
        +              "answers",
        +              "share"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "pages": {
        +          "additionalProperties": false,
        +          "description": "Content Studio pages by lane.",
        +          "properties": {
        +            "in_progress": {
        +              "type": "integer"
        +            },
        +            "live": {
        +              "type": "integer"
        +            },
        +            "needs_refresh": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "in_progress",
        +            "live",
        +            "needs_refresh"
        +          ],
        +          "type": "object"
        +        },
        +        "period": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "from": {
        +              "description": "First day, YYYY-MM-DD.",
        +              "type": "string"
        +            },
        +            "to": {
        +              "description": "Last day, YYYY-MM-DD.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "from",
        +            "to"
        +          ],
        +          "type": "object"
        +        },
        +        "readiness": {
        +          "additionalProperties": false,
        +          "description": "Brand-wide; not filtered by segment.",
        +          "properties": {
        +            "change": {
        +              "description": "Change on the previous comparable scan, in points; null when not comparable.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "critical": {
        +              "description": "Open critical findings.",
        +              "type": "integer"
        +            },
        +            "major": {
        +              "description": "Open major findings.",
        +              "type": "integer"
        +            },
        +            "scan_id": {
        +              "type": "string"
        +            },
        +            "scanned_at": {
        +              "type": "string"
        +            },
        +            "score": {
        +              "description": "Readiness score, 0-100.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "verdict": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "scan_id",
        +            "status",
        +            "score",
        +            "change",
        +            "verdict",
        +            "critical",
        +            "major",
        +            "scanned_at"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "recommendation": {
        +          "additionalProperties": false,
        +          "description": "Share of analysed answers that recommend the brand, 0-100.",
        +          "properties": {
        +            "answers": {
        +              "description": "AI answers the value is based on.",
        +              "type": "integer"
        +            },
        +            "change": {
        +              "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "mentions": {
        +              "description": "Brand mentions the value is based on (share of voice).",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "models_collecting": {
        +              "description": "AI models that answered in the period.",
        +              "type": "integer"
        +            },
        +            "models_expected": {
        +              "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
        +              "type": "integer"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "value": {
        +              "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "value",
        +            "change",
        +            "answers",
        +            "models_collecting",
        +            "models_expected",
        +            "period"
        +          ],
        +          "type": "object"
        +        },
        +        "retention": {
        +          "additionalProperties": false,
        +          "description": "Set when the plan's history limit shortened the period.",
        +          "properties": {
        +            "effective_from": {
        +              "type": "string"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "requested_from": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "requested_from",
        +            "effective_from",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "segment": {
        +          "additionalProperties": false,
        +          "description": "The segment the answer metrics are filtered to; null for all segments.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "share_of_voice": {
        +          "additionalProperties": false,
        +          "description": "The brand's share of all tracked-brand mentions, 0-100.",
        +          "properties": {
        +            "answers": {
        +              "description": "AI answers the value is based on.",
        +              "type": "integer"
        +            },
        +            "change": {
        +              "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "mentions": {
        +              "description": "Brand mentions the value is based on (share of voice).",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "models_collecting": {
        +              "description": "AI models that answered in the period.",
        +              "type": "integer"
        +            },
        +            "models_expected": {
        +              "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
        +              "type": "integer"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "value": {
        +              "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "value",
        +            "change",
        +            "answers",
        +            "models_collecting",
        +            "models_expected",
        +            "period"
        +          ],
        +          "type": "object"
        +        },
        +        "top_cited_domains": {
        +          "description": "The domains AI answers cited most.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "citations": {
        +                "type": "integer"
        +              },
        +              "domain": {
        +                "type": "string"
        +              },
        +              "ownership": {
        +                "description": "own, competitor, or third_party.",
        +                "type": "string"
        +              },
        +              "share": {
        +                "description": "Percentage of all citations.",
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "domain",
        +              "ownership",
        +              "citations",
        +              "share"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "traffic": {
        +          "additionalProperties": false,
        +          "description": "Brand-wide; not filtered by segment.",
        +          "properties": {
        +            "ai_referrals": {
        +              "description": "Visits from people who clicked through from an AI answer.",
        +              "type": "integer"
        +            },
        +            "ai_visits": {
        +              "description": "AI crawler visits plus AI referrals.",
        +              "type": "integer"
        +            },
        +            "connected": {
        +              "description": "Whether site tracking is set up; when false the counts are 0 because nothing is measured.",
        +              "type": "boolean"
        +            },
        +            "crawler_visits": {
        +              "type": "integer"
        +            },
        +            "latest_visit_at": {
        +              "type": "string"
        +            },
        +            "pages_reached": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "connected",
        +            "ai_visits",
        +            "crawler_visits",
        +            "ai_referrals",
        +            "pages_reached",
        +            "latest_visit_at"
        +          ],
        +          "type": "object"
        +        },
        +        "visibility": {
        +          "additionalProperties": false,
        +          "description": "How visible the brand is in AI answers, 0-100: how often answers mention it, weighted by how early.",
        +          "properties": {
        +            "answers": {
        +              "description": "AI answers the value is based on.",
        +              "type": "integer"
        +            },
        +            "change": {
        +              "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "mentions": {
        +              "description": "Brand mentions the value is based on (share of voice).",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "models_collecting": {
        +              "description": "AI models that answered in the period.",
        +              "type": "integer"
        +            },
        +            "models_expected": {
        +              "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
        +              "type": "integer"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "value": {
        +              "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "value",
        +            "change",
        +            "answers",
        +            "models_collecting",
        +            "models_expected",
        +            "period"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "kind",
        +        "segment",
        +        "period",
        +        "visibility",
        +        "share_of_voice",
        +        "recommendation",
        +        "by_model",
        +        "competitors",
        +        "outcomes",
        +        "top_cited_domains",
        +        "readiness",
        +        "collection",
        +        "traffic",
        +        "opportunities",
        +        "pages",
        +        "latest_reports",
        +        "retention"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_brand_settings3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "brand_voice": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "tone": {
        +              "description": "professional, confident, educational, conversational, executive, technical, or persuasive; empty when no default is set.",
        +              "type": "string"
        +            },
        +            "updated_at": {
        +              "description": "Empty when the tone was never set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tone",
        +            "updated_at"
        +          ],
        +          "type": "object"
        +        },
        +        "competitors": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "aliases": {
        +                "description": "Other names answers use for the brand.",
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "status": {
        +                "description": "active or paused. A paused competitor is not tracked.",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "url",
        +              "aliases",
        +              "status"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "type": "string"
        +        },
        +        "primary_brand": {
        +          "additionalProperties": false,
        +          "description": "The brand being tracked; null until it is set.",
        +          "properties": {
        +            "aliases": {
        +              "description": "Other names answers use for the brand.",
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "description": "active or paused. A paused competitor is not tracked.",
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url",
        +            "aliases",
        +            "status"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "reanalysis": {
        +          "additionalProperties": false,
        +          "description": "Set while answers are being re-read after a brand or competitor change.",
        +          "properties": {
        +            "job_id": {
        +              "type": "string"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "description": "queued, running, or failed.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "segments": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "id": {
        +                "type": "string"
        +              },
        +              "language": {
        +                "description": "Language code, or empty for the market's default.",
        +                "type": "string"
        +              },
        +              "market": {
        +                "description": "Country code, or global.",
        +                "type": "string"
        +              },
        +              "models": {
        +                "description": "The AI models the segment collects from: every model the plan covers.",
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "model": {
        +                      "description": "Model family key.",
        +                      "type": "string"
        +                    },
        +                    "name": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "model",
        +                    "name"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "prompt_count": {
        +                "type": "integer"
        +              },
        +              "prompt_limit": {
        +                "type": "integer"
        +              },
        +              "status": {
        +                "description": "active segments collect daily; paused ones do not.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "status",
        +              "market",
        +              "language",
        +              "prompt_limit",
        +              "prompt_count",
        +              "models"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "site": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "cms": {
        +              "description": "Content Studio publishing to a CMS: off, on, or needs_attention.",
        +              "type": "string"
        +            },
        +            "last_visit_at": {
        +              "description": "Latest tracked visit.",
        +              "type": "string"
        +            },
        +            "tracking": {
        +              "description": "AI traffic tracking: off, setup (installed, no signal yet), listening, on, or paused.",
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "url",
        +            "tracking",
        +            "last_visit_at",
        +            "cms"
        +          ],
        +          "type": "object"
        +        },
        +        "skills": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "excerpt": {
        +                "description": "The start of the skill's instructions.",
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "scope": {
        +                "description": "organisation: applies to every brand. brand: this brand only.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "scope",
        +              "excerpt"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "status": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "kind",
        +        "status",
        +        "primary_brand",
        +        "competitors",
        +        "segments",
        +        "site",
        +        "brand_voice",
        +        "skills",
        +        "reanalysis"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_brand_setup3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / setup_id / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The proposed brand.",
        +          "properties": {
        +            "aliases": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "url",
        +            "aliases"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "brand_id": {
        +          "description": "The created brand, once committed.",
        +          "type": "string"
        +        },
        +        "competitors": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "aliases": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "proposal_id": {
        +                "description": "Pass in accepted_brand_proposal_ids to keep it.",
        +                "type": "string"
        +              },
        +              "status": {
        +                "description": "pending; superseded when its site could not be assessed; accepted or rejected once approved.",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              },
        +              "warning": {
        +                "description": "Why tracking its site may not work.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "proposal_id",
        +              "name",
        +              "url",
        +              "aliases",
        +              "status",
        +              "warning"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "error": {
        +          "description": "Set when failed: site_unreachable, no_brand_found, timed_out, or failed.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While reading, how long to wait before reading again; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "prompts": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "proposal_id": {
        +                "description": "Pass in accepted_prompt_proposal_ids to keep it.",
        +                "type": "string"
        +              },
        +              "status": {
        +                "type": "string"
        +              },
        +              "tags": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "text": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "proposal_id",
        +              "text",
        +              "tags",
        +              "status"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "segment": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "language": {
        +              "type": "string"
        +            },
        +            "market": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "market",
        +            "language"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "setup_id": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "reading (poll), needs_approval (review, then approve_brand_setup), committed, failed, rejected, or cancelled.",
        +          "type": "string"
        +        },
        +        "step": {
        +          "description": "While reading: site, brand, questions, then ready.",
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "setup_id",
        +        "status",
        +        "step",
        +        "error",
        +        "url",
        +        "brand_id",
        +        "brand",
        +        "competitors",
        +        "segment",
        +        "prompts",
        +        "poll_after_seconds"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_citation_source6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • addedInput schema / properties / from / format
        Added value: +"date"
      • changedInput schema / properties / source_id / description
        Previous value: -"A page ID from list_citations view pages."New value: +"A page's source_id from list_citations view pages."
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "brands_named": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "domain": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "citations": {
        +                  "type": "integer"
        +                },
        +                "domain": {
        +                  "description": "Pass to get_citation_source.",
        +                  "type": "string"
        +                },
        +                "gap_competitors": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "latest_cited_at": {
        +                  "type": "string"
        +                },
        +                "models": {
        +                  "description": "Model family keys that cited it.",
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "ownership": {
        +                  "description": "own, competitor, or third_party.",
        +                  "type": "string"
        +                },
        +                "pages": {
        +                  "type": "integer"
        +                },
        +                "prompts": {
        +                  "type": "integer"
        +                },
        +                "source_gap": {
        +                  "description": "Competitors are cited from this domain and the brand is not.",
        +                  "type": "boolean"
        +                },
        +                "source_type": {
        +                  "type": "string"
        +                },
        +                "top_page": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "source_id": {
        +                      "description": "Pass to get_citation_source.",
        +                      "type": "string"
        +                    },
        +                    "title": {
        +                      "type": "string"
        +                    },
        +                    "url": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "source_id",
        +                    "title",
        +                    "url"
        +                  ],
        +                  "type": [
        +                    "null",
        +                    "object"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "domain",
        +                "ownership",
        +                "source_type",
        +                "citations",
        +                "pages",
        +                "prompts",
        +                "models",
        +                "source_gap",
        +                "gap_competitors",
        +                "top_page",
        +                "latest_cited_at"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "top_pages": {
        +              "description": "The domain's most influential cited pages; get_citation_source with a source_id gives a page's prompts and snippets.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "brands_named": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "domain": {
        +                    "type": "string"
        +                  },
        +                  "gap_competitors": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "influence": {
        +                    "description": "0-100: how much the page shapes answers, from citation frequency, recency, model and prompt coverage.",
        +                    "type": "integer"
        +                  },
        +                  "latest_cited_at": {
        +                    "type": "string"
        +                  },
        +                  "models": {
        +                    "type": "integer"
        +                  },
        +                  "ownership": {
        +                    "description": "own, competitor, or third_party.",
        +                    "type": "string"
        +                  },
        +                  "prompts": {
        +                    "type": "integer"
        +                  },
        +                  "source_gap": {
        +                    "type": "boolean"
        +                  },
        +                  "source_id": {
        +                    "description": "Pass to get_citation_source.",
        +                    "type": "string"
        +                  },
        +                  "source_type": {
        +                    "type": "string"
        +                  },
        +                  "title": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "source_id",
        +                  "url",
        +                  "title",
        +                  "domain",
        +                  "ownership",
        +                  "source_type",
        +                  "influence",
        +                  "citations",
        +                  "prompts",
        +                  "models",
        +                  "brands_named",
        +                  "source_gap",
        +                  "gap_competitors",
        +                  "latest_cited_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "trend": {
        +              "description": "Days with citations.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "date": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "date",
        +                  "citations"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "period",
        +            "domain",
        +            "brands_named",
        +            "top_pages",
        +            "trend"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "brands_named": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "models": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "page": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "brands_named": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "citations": {
        +                  "type": "integer"
        +                },
        +                "domain": {
        +                  "type": "string"
        +                },
        +                "gap_competitors": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "influence": {
        +                  "description": "0-100: how much the page shapes answers, from citation frequency, recency, model and prompt coverage.",
        +                  "type": "integer"
        +                },
        +                "latest_cited_at": {
        +                  "type": "string"
        +                },
        +                "models": {
        +                  "type": "integer"
        +                },
        +                "ownership": {
        +                  "description": "own, competitor, or third_party.",
        +                  "type": "string"
        +                },
        +                "prompts": {
        +                  "type": "integer"
        +                },
        +                "source_gap": {
        +                  "type": "boolean"
        +                },
        +                "source_id": {
        +                  "description": "Pass to get_citation_source.",
        +                  "type": "string"
        +                },
        +                "source_type": {
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "source_id",
        +                "url",
        +                "title",
        +                "domain",
        +                "ownership",
        +                "source_type",
        +                "influence",
        +                "citations",
        +                "prompts",
        +                "models",
        +                "brands_named",
        +                "source_gap",
        +                "gap_competitors",
        +                "latest_cited_at"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "prompts": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "latest_cited_at": {
        +                    "type": "string"
        +                  },
        +                  "segment": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "id": {
        +                        "type": "string"
        +                      },
        +                      "name": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "id",
        +                      "name"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "text",
        +                  "segment",
        +                  "citations",
        +                  "latest_cited_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "snippets": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "answer_id": {
        +                    "type": "string"
        +                  },
        +                  "captured_at": {
        +                    "type": "string"
        +                  },
        +                  "excerpt": {
        +                    "type": "string"
        +                  },
        +                  "model": {
        +                    "type": "string"
        +                  },
        +                  "prompt_id": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "answer_id",
        +                  "prompt_id",
        +                  "model",
        +                  "excerpt",
        +                  "captured_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "trend": {
        +              "description": "Days with citations.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "date": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "date",
        +                  "citations"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "period",
        +            "page",
        +            "prompts",
        +            "models",
        +            "brands_named",
        +            "snippets",
        +            "trend"
        +          ],
        +          "type": "object"
        +        }
        +      ]
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_doc4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / slug / description
        Previous value: -"Documentation slug, for example analytics/share-of-voice."New value: +"Documentation slug from search_docs, for example analytics/share-of-voice."
      • addedInput schema / properties / slug / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "title",
        +        "url"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_operation3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / operation_id / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "created_at": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "resource": {
        +          "description": "The resource the write returned; see the write tool's output schema."
        +        },
        +        "status": {
        +          "description": "pending: still working (or, right after a dropped connection, not yet known); completed; or failed.",
        +          "type": "string"
        +        },
        +        "tool": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "tool",
        +        "status",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "created_at"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_opportunity4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • addedInput schema / properties / opportunity_id / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "assignee": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "member_id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "member_id",
        +            "name"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "comment_count": {
        +          "type": "integer"
        +        },
        +        "comments": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "body": {
        +                "type": "string"
        +              },
        +              "created_at": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "body",
        +              "author",
        +              "created_at"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "dismissed_at": {
        +          "type": "string"
        +        },
        +        "engine_answers": {
        +          "description": "Content gaps: each model's latest answer to the question.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "answer_id": {
        +                "description": "get_answer gives the full text.",
        +                "type": "string"
        +              },
        +              "brands_named": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "captured_at": {
        +                "type": "string"
        +              },
        +              "model": {
        +                "type": "string"
        +              },
        +              "model_name": {
        +                "type": "string"
        +              },
        +              "names_you": {
        +                "type": "boolean"
        +              },
        +              "opening": {
        +                "description": "The answer's first lines.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "answer_id",
        +              "model",
        +              "model_name",
        +              "captured_at",
        +              "names_you",
        +              "brands_named",
        +              "opening"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "excerpts": {
        +          "description": "Verbatim answer excerpts behind the opportunity.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "answer_id": {
        +                "type": "string"
        +              },
        +              "captured_at": {
        +                "type": "string"
        +              },
        +              "model": {
        +                "type": "string"
        +              },
        +              "model_name": {
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "answer_id",
        +              "model",
        +              "model_name",
        +              "captured_at",
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "facts": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "label": {
        +                "type": "string"
        +              },
        +              "value": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "label",
        +              "value"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "found_at": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "description": "content_gap, readiness, source_gap, traffic_gap, or coverage_gap.",
        +          "type": "string"
        +        },
        +        "monthly_ai_searches": {
        +          "type": [
        +            "null",
        +            "integer"
        +          ]
        +        },
        +        "play": {
        +          "additionalProperties": false,
        +          "description": "What to do about it.",
        +          "properties": {
        +            "angle": {
        +              "type": "string"
        +            },
        +            "changes": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "check_id": {
        +              "type": "string"
        +            },
        +            "checklist": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "done": {
        +                    "type": "boolean"
        +                  },
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "label",
        +                  "done"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "findings": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "check_id": {
        +                    "type": "string"
        +                  },
        +                  "title": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "check_id",
        +                  "title"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "fix_language": {
        +              "type": "string"
        +            },
        +            "fix_snippet": {
        +              "type": "string"
        +            },
        +            "headline": {
        +              "type": "string"
        +            },
        +            "kind": {
        +              "description": "draft_content, ship_fix, earn_source, optimise_page, or track_prompts.",
        +              "type": "string"
        +            },
        +            "next_step": {
        +              "description": "The tool call that carries out the play.",
        +              "type": "string"
        +            },
        +            "optimised_at": {
        +              "type": "string"
        +            },
        +            "outreach": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "body": {
        +                  "type": "string"
        +                },
        +                "error": {
        +                  "type": "string"
        +                },
        +                "generated_at": {
        +                  "type": "string"
        +                },
        +                "status": {
        +                  "description": "none, generating, ready, or failed.",
        +                  "type": "string"
        +                },
        +                "subject": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "status",
        +                "subject",
        +                "body",
        +                "generated_at",
        +                "error"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "page_ideas": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "content_type": {
        +                    "type": "string"
        +                  },
        +                  "covered": {
        +                    "description": "An existing page already covers it.",
        +                    "type": "boolean"
        +                  },
        +                  "objective": {
        +                    "type": "string"
        +                  },
        +                  "title": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "title",
        +                  "content_type",
        +                  "objective",
        +                  "covered"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "pages": {
        +              "description": "draft_content: Content Studio pages already started for it.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "page_id": {
        +                    "type": "string"
        +                  },
        +                  "published_url": {
        +                    "type": "string"
        +                  },
        +                  "status": {
        +                    "type": "string"
        +                  },
        +                  "title": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "page_id",
        +                  "title",
        +                  "status",
        +                  "published_url"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "pitched_at": {
        +              "type": "string"
        +            },
        +            "segment": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "shipped_at": {
        +              "type": "string"
        +            },
        +            "suggestions": {
        +              "description": "track_prompts: questions to track; pass their suggestion_id to act_on_opportunity.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "monthly_ai_searches": {
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "seen_count": {
        +                    "type": "integer"
        +                  },
        +                  "suggestion_id": {
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  },
        +                  "tracked": {
        +                    "type": "boolean"
        +                  }
        +                },
        +                "required": [
        +                  "suggestion_id",
        +                  "text",
        +                  "monthly_ai_searches",
        +                  "seen_count",
        +                  "tracked"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "target": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "source_id": {
        +                  "description": "Pass to get_citation_source.",
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "source_id",
        +                "title",
        +                "url"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "tracked_at": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "headline",
        +            "next_step"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "presence": {
        +          "description": "Content gaps: how each model's latest answer treats each brand it names.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "description": "The brand's website, or empty when none is set.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "name",
        +                  "url"
        +                ],
        +                "type": "object"
        +              },
        +              "is_you": {
        +                "type": "boolean"
        +              },
        +              "models": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "model": {
        +                      "type": "string"
        +                    },
        +                    "model_name": {
        +                      "type": "string"
        +                    },
        +                    "presence": {
        +                      "description": "ranked, mentioned, caveated, or absent.",
        +                      "type": "string"
        +                    },
        +                    "rank": {
        +                      "type": [
        +                        "null",
        +                        "integer"
        +                      ]
        +                    }
        +                  },
        +                  "required": [
        +                    "model",
        +                    "model_name",
        +                    "presence",
        +                    "rank"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "required": [
        +              "brand",
        +              "is_you",
        +              "models"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "proof": {
        +          "additionalProperties": false,
        +          "description": "Before and after the play, once it shipped.",
        +          "properties": {
        +            "after": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "answers": {
        +                  "type": "integer"
        +                },
        +                "period": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "from": {
        +                      "description": "First day, YYYY-MM-DD.",
        +                      "type": "string"
        +                    },
        +                    "to": {
        +                      "description": "Last day, YYYY-MM-DD.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "from",
        +                    "to"
        +                  ],
        +                  "type": "object"
        +                },
        +                "value": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "value",
        +                "answers",
        +                "period"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "before": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "answers": {
        +                  "type": "integer"
        +                },
        +                "period": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "from": {
        +                      "description": "First day, YYYY-MM-DD.",
        +                      "type": "string"
        +                    },
        +                    "to": {
        +                      "description": "Last day, YYYY-MM-DD.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "from",
        +                    "to"
        +                  ],
        +                  "type": "object"
        +                },
        +                "value": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "value",
        +                "answers",
        +                "period"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "gap_closed_at": {
        +              "type": "string"
        +            },
        +            "metric": {
        +              "type": "string"
        +            },
        +            "since": {
        +              "type": "string"
        +            },
        +            "suggest_won": {
        +              "description": "The gap has closed; move the opportunity to won.",
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "since",
        +            "metric",
        +            "before",
        +            "after",
        +            "gap_closed_at",
        +            "suggest_won"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "score": {
        +          "description": "0-100 priority.",
        +          "type": "integer"
        +        },
        +        "segment": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "signal": {
        +          "description": "Why it matters now.",
        +          "type": "string"
        +        },
        +        "snoozed_until": {
        +          "type": "string"
        +        },
        +        "sources": {
        +          "description": "Sources the answers cite.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "citations": {
        +                "type": "integer"
        +              },
        +              "domain": {
        +                "type": "string"
        +              },
        +              "ownership": {
        +                "description": "own, competitor, or third_party.",
        +                "type": "string"
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "domain",
        +              "url",
        +              "title",
        +              "ownership",
        +              "citations"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "stage": {
        +          "description": "now, in_flight, watching, or won.",
        +          "type": "string"
        +        },
        +        "stage_changed_at": {
        +          "type": "string"
        +        },
        +        "timeline": {
        +          "description": "The 10 latest events, newest first.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "at": {
        +                "type": "string"
        +              },
        +              "by": {
        +                "type": "string"
        +              },
        +              "detail": {
        +                "type": "string"
        +              },
        +              "kind": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "kind",
        +              "at",
        +              "by",
        +              "detail"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "trend": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "marker": {
        +              "description": "When the play shipped, if it has.",
        +              "type": "string"
        +            },
        +            "metric": {
        +              "description": "mention_rate, recommendation_rate, or ai_referrals.",
        +              "type": "string"
        +            },
        +            "points": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "date": {
        +                    "type": "string"
        +                  },
        +                  "value": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "date",
        +                  "value"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "metric",
        +            "points",
        +            "marker"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "id",
        +        "kind",
        +        "stage",
        +        "title",
        +        "signal",
        +        "segment",
        +        "monthly_ai_searches",
        +        "score",
        +        "assignee",
        +        "found_at",
        +        "stage_changed_at",
        +        "snoozed_until",
        +        "dismissed_at",
        +        "comment_count",
        +        "facts",
        +        "play",
        +        "presence",
        +        "excerpts",
        +        "engine_answers",
        +        "sources",
        +        "trend",
        +        "proof",
        +        "timeline",
        +        "comments"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_page5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "markdown_next_cursor from the previous call, for the next part of a long draft.",
        +  "type": "string"
        +}
      • addedInput schema / properties / page_id / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "app_url": {
        +          "type": "string"
        +        },
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "content_type": {
        +          "type": "string"
        +        },
        +        "draft": {
        +          "additionalProperties": false,
        +          "description": "Set once drafting starts.",
        +          "properties": {
        +            "busy": {
        +              "description": "Sections are still being written; poll get_page.",
        +              "type": "boolean"
        +            },
        +            "failing_checks": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "type": "string"
        +                  },
        +                  "reason": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "label",
        +                  "reason"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "grade": {
        +              "description": "The draft's quality grade, A-F; empty until graded.",
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "summary": {
        +              "type": "string"
        +            },
        +            "unsupported_claims": {
        +              "description": "Sentences with no evidence behind them.",
        +              "type": "integer"
        +            },
        +            "version": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "version",
        +            "busy",
        +            "grade",
        +            "summary",
        +            "unsupported_claims",
        +            "failing_checks"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "interview": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "questions": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "answer": {
        +                    "type": "string"
        +                  },
        +                  "kind": {
        +                    "description": "number, process, or example.",
        +                    "type": "string"
        +                  },
        +                  "question": {
        +                    "type": "string"
        +                  },
        +                  "question_id": {
        +                    "description": "Pass to answer_page_questions.",
        +                    "type": "string"
        +                  },
        +                  "status": {
        +                    "description": "pending, answered, or skipped.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "question_id",
        +                  "kind",
        +                  "question",
        +                  "status",
        +                  "answer"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "status": {
        +              "description": "generating_questions (poll get_page), waiting_for_answers, or done.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "questions"
        +          ],
        +          "type": "object"
        +        },
        +        "markdown": {
        +          "description": "The draft as Markdown, or one part of it when markdown_next_cursor is set.",
        +          "type": "string"
        +        },
        +        "markdown_next_cursor": {
        +          "description": "Pass as cursor for the next part of the Markdown; empty when complete.",
        +          "type": "string"
        +        },
        +        "plan": {
        +          "additionalProperties": false,
        +          "description": "Set once the plan is ready.",
        +          "properties": {
        +            "angle": {
        +              "type": "string"
        +            },
        +            "format": {
        +              "type": "string"
        +            },
        +            "sections": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "error": {
        +                    "type": "string"
        +                  },
        +                  "heading": {
        +                    "type": "string"
        +                  },
        +                  "section_id": {
        +                    "description": "Pass to redraft_page_section.",
        +                    "type": "string"
        +                  },
        +                  "shape": {
        +                    "description": "prose, table, or list.",
        +                    "type": "string"
        +                  },
        +                  "status": {
        +                    "description": "pending, drafting, drafted, or failed.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "section_id",
        +                  "heading",
        +                  "shape",
        +                  "status",
        +                  "error"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "angle",
        +            "format",
        +            "sections"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "plan_status": {
        +          "description": "none, interview (answer its questions), planning (the plan is being built), or ready (draft_page can write it).",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While questions, the plan or the draft are being written, how long to wait before reading again; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "preflight": {
        +          "additionalProperties": false,
        +          "description": "Set when include_preflight was true.",
        +          "properties": {
        +            "checks": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "type": "string"
        +                  },
        +                  "reason": {
        +                    "type": "string"
        +                  },
        +                  "status": {
        +                    "description": "pass, fail, or pending.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "label",
        +                  "status",
        +                  "reason"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "failing": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "failing",
        +            "checks"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "question": {
        +          "type": "string"
        +        },
        +        "results": {
        +          "additionalProperties": false,
        +          "description": "Set once the page is live.",
        +          "properties": {
        +            "answers": {
        +              "type": "integer"
        +            },
        +            "cited": {
        +              "type": "integer"
        +            },
        +            "day": {
        +              "description": "Days since it went live.",
        +              "type": "integer"
        +            },
        +            "first_citation_at": {
        +              "type": "string"
        +            },
        +            "live_at": {
        +              "type": "string"
        +            },
        +            "named": {
        +              "type": "integer"
        +            },
        +            "refresh_due_at": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "url",
        +            "live_at",
        +            "day",
        +            "answers",
        +            "named",
        +            "cited",
        +            "first_citation_at",
        +            "refresh_due_at"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "status": {
        +          "description": "draft, generating, generated, failed, published, or archived.",
        +          "type": "string"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "tone": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "id",
        +        "title",
        +        "question",
        +        "content_type",
        +        "status",
        +        "plan_status",
        +        "tone",
        +        "interview",
        +        "plan",
        +        "draft",
        +        "markdown",
        +        "markdown_next_cursor",
        +        "results",
        +        "preflight",
        +        "app_url",
        +        "poll_after_seconds"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_perception5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • addedInput schema / properties / from / format
        Added value: +"date"
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "brands": {
        +          "description": "The brand first, then competitors by overall score.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "description": "The brand's website, or empty when none is set.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "name",
        +                  "url"
        +                ],
        +                "type": "object"
        +              },
        +              "by_model": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "model": {
        +                      "type": "string"
        +                    },
        +                    "model_name": {
        +                      "type": "string"
        +                    },
        +                    "overall": {
        +                      "type": "number"
        +                    }
        +                  },
        +                  "required": [
        +                    "model",
        +                    "model_name",
        +                    "overall"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "dimensions": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "dimension": {
        +                      "type": "string"
        +                    },
        +                    "score": {
        +                      "type": "number"
        +                    }
        +                  },
        +                  "required": [
        +                    "dimension",
        +                    "score"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "evidence": {
        +                "description": "Why each dimension scored as it did, with quotes; the brand only.",
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "captured_at": {
        +                      "type": "string"
        +                    },
        +                    "dimension": {
        +                      "type": "string"
        +                    },
        +                    "narrative": {
        +                      "type": "string"
        +                    },
        +                    "negative_quotes": {
        +                      "items": {
        +                        "additionalProperties": false,
        +                        "properties": {
        +                          "answer_id": {
        +                            "type": "string"
        +                          },
        +                          "model": {
        +                            "type": "string"
        +                          },
        +                          "quote": {
        +                            "type": "string"
        +                          }
        +                        },
        +                        "required": [
        +                          "quote",
        +                          "answer_id",
        +                          "model"
        +                        ],
        +                        "type": "object"
        +                      },
        +                      "type": "array"
        +                    },
        +                    "positive_quotes": {
        +                      "items": {
        +                        "additionalProperties": false,
        +                        "properties": {
        +                          "answer_id": {
        +                            "type": "string"
        +                          },
        +                          "model": {
        +                            "type": "string"
        +                          },
        +                          "quote": {
        +                            "type": "string"
        +                          }
        +                        },
        +                        "required": [
        +                          "quote",
        +                          "answer_id",
        +                          "model"
        +                        ],
        +                        "type": "object"
        +                      },
        +                      "type": "array"
        +                    }
        +                  },
        +                  "required": [
        +                    "dimension",
        +                    "narrative",
        +                    "positive_quotes",
        +                    "negative_quotes",
        +                    "captured_at"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "is_you": {
        +                "type": "boolean"
        +              },
        +              "overall": {
        +                "description": "Average of the dimension scores, 0-10; null without data.",
        +                "type": [
        +                  "null",
        +                  "number"
        +                ]
        +              },
        +              "summary": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "brand",
        +              "is_you",
        +              "overall",
        +              "dimensions",
        +              "by_model",
        +              "summary",
        +              "evidence"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "has_data": {
        +          "description": "False when no perception analysis falls in the period; scores are then empty.",
        +          "type": "boolean"
        +        },
        +        "notice": {
        +          "type": "string"
        +        },
        +        "period": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "from": {
        +              "description": "First day, YYYY-MM-DD.",
        +              "type": "string"
        +            },
        +            "to": {
        +              "description": "Last day, YYYY-MM-DD.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "from",
        +            "to"
        +          ],
        +          "type": "object"
        +        },
        +        "trend": {
        +          "description": "The brand's overall score by day.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "date": {
        +                "type": "string"
        +              },
        +              "score": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "date",
        +              "score"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "period",
        +        "has_data",
        +        "notice",
        +        "brands",
        +        "trend"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_plan2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content_studio_generations": {
        +          "additionalProperties": false,
        +          "description": "Drafts and outreach Content Studio can write this period.",
        +          "properties": {
        +            "limit": {
        +              "description": "null when unlimited.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "remaining": {
        +              "description": "null when unlimited.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "resets_at": {
        +              "type": "string"
        +            },
        +            "used": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "limit",
        +            "used",
        +            "remaining",
        +            "resets_at"
        +          ],
        +          "type": "object"
        +        },
        +        "features": {
        +          "description": "Features the plan includes.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "history_days": {
        +          "description": "How far back answers can be read; null when unlimited.",
        +          "type": [
        +            "null",
        +            "integer"
        +          ]
        +        },
        +        "limits": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "limit": {
        +                "description": "null when unlimited.",
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "remaining": {
        +                "description": "null when unlimited.",
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "resource": {
        +                "type": "string"
        +              },
        +              "used": {
        +                "type": "integer"
        +              }
        +            },
        +            "required": [
        +              "resource",
        +              "limit",
        +              "used",
        +              "remaining"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "models": {
        +          "description": "The AI models every segment collects from on this plan.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "model": {
        +                "description": "Model family key.",
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "model",
        +              "name"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "monthly_model_budget_usd": {
        +          "description": "Monthly AI model spend allowed; null when unlimited.",
        +          "type": [
        +            "null",
        +            "integer"
        +          ]
        +        },
        +        "plan": {
        +          "description": "trial, starter, business, enterprise, or custom.",
        +          "type": "string"
        +        },
        +        "subscription": {
        +          "additionalProperties": false,
        +          "description": "Set when the plan is billed by subscription.",
        +          "properties": {
        +            "cancel_at_period_end": {
        +              "type": "boolean"
        +            },
        +            "interval": {
        +              "type": "string"
        +            },
        +            "renews_at": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "status",
        +            "interval",
        +            "renews_at",
        +            "cancel_at_period_end"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "trial": {
        +          "additionalProperties": false,
        +          "description": "Set on a trial.",
        +          "properties": {
        +            "days_remaining": {
        +              "type": "integer"
        +            },
        +            "expires_at": {
        +              "type": "string"
        +            },
        +            "state": {
        +              "description": "active or expired.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "state",
        +            "expires_at",
        +            "days_remaining"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "plan",
        +        "trial",
        +        "subscription",
        +        "limits",
        +        "features",
        +        "content_studio_generations",
        +        "monthly_model_budget_usd",
        +        "history_days",
        +        "models"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_readiness6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • changedInput schema / properties / sort / description
        Previous value: -"action_plan order."New value: +"action_plan order. Defaults to points."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "lenses": {
        +              "description": "Readiness, SEO health and security scores.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "lens": {
        +                    "type": "string"
        +                  },
        +                  "score": {
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "verdict": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "lens",
        +                  "score",
        +                  "verdict"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "open_findings": {
        +              "additionalProperties": false,
        +              "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.",
        +              "properties": {
        +                "critical": {
        +                  "type": "integer"
        +                },
        +                "info": {
        +                  "type": "integer"
        +                },
        +                "major": {
        +                  "type": "integer"
        +                },
        +                "minor": {
        +                  "type": "integer"
        +                },
        +                "total": {
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "critical",
        +                "major",
        +                "minor",
        +                "info",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "pages_audited": {
        +              "type": "integer"
        +            },
        +            "passing_checks": {
        +              "type": "integer"
        +            },
        +            "pillars": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "label": {
        +                    "type": "string"
        +                  },
        +                  "pillar": {
        +                    "type": "string"
        +                  },
        +                  "points_awarded": {
        +                    "type": "number"
        +                  },
        +                  "points_possible": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "pillar",
        +                  "label",
        +                  "points_awarded",
        +                  "points_possible"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "poll_after_seconds": {
        +              "description": "While a scan runs, how long to wait before reading again; 0 otherwise.",
        +              "type": "integer"
        +            },
        +            "progress": {
        +              "additionalProperties": false,
        +              "description": "Set while a scan runs.",
        +              "properties": {
        +                "message": {
        +                  "type": "string"
        +                },
        +                "page_limit": {
        +                  "type": "integer"
        +                },
        +                "pages_fetched": {
        +                  "type": "integer"
        +                },
        +                "percent": {
        +                  "type": "integer"
        +                },
        +                "stage": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "stage",
        +                "message",
        +                "percent",
        +                "pages_fetched",
        +                "page_limit"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "scan": {
        +              "additionalProperties": false,
        +              "description": "The scan summarised; null before the first scan.",
        +              "properties": {
        +                "completed_at": {
        +                  "type": "string"
        +                },
        +                "error": {
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "description": "Scan ID, the run_id other readiness calls take.",
        +                  "type": "string"
        +                },
        +                "started_at": {
        +                  "type": "string"
        +                },
        +                "status": {
        +                  "description": "queued, processing, complete, or failed.",
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "status",
        +                "url",
        +                "error",
        +                "started_at",
        +                "completed_at"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "scan_in_progress": {
        +              "type": "boolean"
        +            },
        +            "score": {
        +              "description": "Readiness score, 0-100.",
        +              "type": [
        +                "null",
        +                "number"
        +              ]
        +            },
        +            "verdict": {
        +              "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.",
        +              "type": "string"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "scan",
        +            "score",
        +            "verdict",
        +            "lenses",
        +            "pillars",
        +            "open_findings",
        +            "passing_checks",
        +            "pages_audited",
        +            "scan_in_progress",
        +            "progress",
        +            "poll_after_seconds"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "findings": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "affected_pages": {
        +                    "type": "integer"
        +                  },
        +                  "check_id": {
        +                    "description": "Pass to get_readiness_finding or verify_readiness_fix.",
        +                    "type": "string"
        +                  },
        +                  "consequence": {
        +                    "type": "string"
        +                  },
        +                  "effort_minutes": {
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "fix_type": {
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "type": "string"
        +                  },
        +                  "latest_check": {
        +                    "additionalProperties": false,
        +                    "description": "The latest re-check since the scan.",
        +                    "properties": {
        +                      "check_id": {
        +                        "type": "string"
        +                      },
        +                      "completed_at": {
        +                        "type": "string"
        +                      },
        +                      "created_at": {
        +                        "type": "string"
        +                      },
        +                      "error": {
        +                        "type": "string"
        +                      },
        +                      "id": {
        +                        "description": "The check_request_id get_readiness_finding takes.",
        +                        "type": "string"
        +                      },
        +                      "per_url": {
        +                        "items": {
        +                          "additionalProperties": false,
        +                          "properties": {
        +                            "status": {
        +                              "type": "string"
        +                            },
        +                            "url": {
        +                              "type": "string"
        +                            }
        +                          },
        +                          "required": [
        +                            "url",
        +                            "status"
        +                          ],
        +                          "type": "object"
        +                        },
        +                        "type": "array"
        +                      },
        +                      "recharges_at": {
        +                        "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        +                        "type": "string"
        +                      },
        +                      "resolved": {
        +                        "description": "Whether the issue is fixed; null until complete.",
        +                        "type": [
        +                          "null",
        +                          "boolean"
        +                        ]
        +                      },
        +                      "status": {
        +                        "description": "queued, processing, complete, or failed.",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "id",
        +                      "check_id",
        +                      "status",
        +                      "resolved",
        +                      "per_url",
        +                      "error",
        +                      "created_at",
        +                      "completed_at",
        +                      "recharges_at"
        +                    ],
        +                    "type": [
        +                      "null",
        +                      "object"
        +                    ]
        +                  },
        +                  "owner_role": {
        +                    "type": "string"
        +                  },
        +                  "pillar": {
        +                    "type": "string"
        +                  },
        +                  "points_recoverable": {
        +                    "type": "number"
        +                  },
        +                  "severity": {
        +                    "description": "critical, major, minor, or info; empty when passing.",
        +                    "type": "string"
        +                  },
        +                  "site_wide": {
        +                    "description": "One fix applies to the whole site.",
        +                    "type": "boolean"
        +                  },
        +                  "status": {
        +                    "description": "fail, warning, pass, or not_applicable.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "check_id",
        +                  "label",
        +                  "pillar",
        +                  "status",
        +                  "severity",
        +                  "consequence",
        +                  "points_recoverable",
        +                  "effort_minutes",
        +                  "owner_role",
        +                  "fix_type",
        +                  "affected_pages",
        +                  "site_wide",
        +                  "latest_check"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "open_findings": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "critical": {
        +                  "type": "integer"
        +                },
        +                "info": {
        +                  "type": "integer"
        +                },
        +                "major": {
        +                  "type": "integer"
        +                },
        +                "minor": {
        +                  "type": "integer"
        +                },
        +                "total": {
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "critical",
        +                "major",
        +                "minor",
        +                "info",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "questions_no_page_answers": {
        +              "description": "Tracked prompts no page on the site answers well.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "monthly_ai_searches": {
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "opportunity_id": {
        +                    "description": "The content gap opportunity for it, when there is one.",
        +                    "type": "string"
        +                  },
        +                  "prompt_id": {
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "prompt_id",
        +                  "text",
        +                  "monthly_ai_searches",
        +                  "opportunity_id"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "scan_id": {
        +              "type": "string"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "scan_id",
        +            "open_findings",
        +            "findings",
        +            "questions_no_page_answers",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "pages": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "page_type": {
        +                    "type": "string"
        +                  },
        +                  "response_time_ms": {
        +                    "type": "integer"
        +                  },
        +                  "status_code": {
        +                    "type": "integer"
        +                  },
        +                  "text_chars": {
        +                    "type": "integer"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "url",
        +                  "page_type",
        +                  "status_code",
        +                  "response_time_ms",
        +                  "text_chars"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "scan_id": {
        +              "type": "string"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "scan_id",
        +            "pages",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "scans": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "completed_at": {
        +                    "type": "string"
        +                  },
        +                  "created_at": {
        +                    "type": "string"
        +                  },
        +                  "error": {
        +                    "type": "string"
        +                  },
        +                  "fixed": {
        +                    "description": "Findings fixed since the previous scan.",
        +                    "type": "integer"
        +                  },
        +                  "new": {
        +                    "type": "integer"
        +                  },
        +                  "pages_audited": {
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "readiness": {
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "regressed": {
        +                    "type": "integer"
        +                  },
        +                  "scan_id": {
        +                    "type": "string"
        +                  },
        +                  "security": {
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "seo": {
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "status": {
        +                    "type": "string"
        +                  },
        +                  "trigger": {
        +                    "description": "manual or scheduled.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "scan_id",
        +                  "status",
        +                  "trigger",
        +                  "readiness",
        +                  "seo",
        +                  "security",
        +                  "pages_audited",
        +                  "fixed",
        +                  "new",
        +                  "regressed",
        +                  "created_at",
        +                  "completed_at",
        +                  "error"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "scans",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "allowed": {
        +              "description": "Whether competitor scans are available.",
        +              "type": "boolean"
        +            },
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "competitors": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "brand": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "id": {
        +                        "type": "string"
        +                      },
        +                      "name": {
        +                        "type": "string"
        +                      },
        +                      "url": {
        +                        "description": "The brand's website, or empty when none is set.",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "id",
        +                      "name",
        +                      "url"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "next_available_at": {
        +                    "type": "string"
        +                  },
        +                  "scan_id": {
        +                    "type": "string"
        +                  },
        +                  "scanned_at": {
        +                    "type": "string"
        +                  },
        +                  "scores": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "readiness": {
        +                        "type": [
        +                          "null",
        +                          "number"
        +                        ]
        +                      },
        +                      "security": {
        +                        "type": [
        +                          "null",
        +                          "number"
        +                        ]
        +                      },
        +                      "seo": {
        +                        "type": [
        +                          "null",
        +                          "number"
        +                        ]
        +                      }
        +                    },
        +                    "required": [
        +                      "readiness",
        +                      "seo",
        +                      "security"
        +                    ],
        +                    "type": [
        +                      "null",
        +                      "object"
        +                    ]
        +                  },
        +                  "status": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "brand",
        +                  "scan_id",
        +                  "status",
        +                  "scores",
        +                  "scanned_at",
        +                  "next_available_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "gaps": {
        +              "description": "Checks competitors pass and the brand does not.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "check_id": {
        +                    "type": "string"
        +                  },
        +                  "competitors": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "fix_summary": {
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "type": "string"
        +                  },
        +                  "pillar": {
        +                    "type": "string"
        +                  },
        +                  "points_possible": {
        +                    "type": "number"
        +                  },
        +                  "your_status": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "check_id",
        +                  "label",
        +                  "pillar",
        +                  "your_status",
        +                  "competitors",
        +                  "points_possible",
        +                  "fix_summary"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "reason": {
        +              "description": "Why not: plan, role, or no_competitors.",
        +              "type": "string"
        +            },
        +            "view": {
        +              "type": "string"
        +            },
        +            "you": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "readiness": {
        +                  "type": [
        +                    "null",
        +                    "number"
        +                  ]
        +                },
        +                "security": {
        +                  "type": [
        +                    "null",
        +                    "number"
        +                  ]
        +                },
        +                "seo": {
        +                  "type": [
        +                    "null",
        +                    "number"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "readiness",
        +                "seo",
        +                "security"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "allowed",
        +            "reason",
        +            "you",
        +            "competitors",
        +            "gaps"
        +          ],
        +          "type": "object"
        +        }
        +      ]
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_readiness_finding6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • addedInput schema / properties / check_id / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "check_request": {
        +          "additionalProperties": false,
        +          "description": "The re-check named by check_request_id.",
        +          "properties": {
        +            "check_id": {
        +              "type": "string"
        +            },
        +            "completed_at": {
        +              "type": "string"
        +            },
        +            "created_at": {
        +              "type": "string"
        +            },
        +            "error": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "The check_request_id get_readiness_finding takes.",
        +              "type": "string"
        +            },
        +            "per_url": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "status": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "url",
        +                  "status"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "recharges_at": {
        +              "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        +              "type": "string"
        +            },
        +            "resolved": {
        +              "description": "Whether the issue is fixed; null until complete.",
        +              "type": [
        +                "null",
        +                "boolean"
        +              ]
        +            },
        +            "status": {
        +              "description": "queued, processing, complete, or failed.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "check_id",
        +            "status",
        +            "resolved",
        +            "per_url",
        +            "error",
        +            "created_at",
        +            "completed_at",
        +            "recharges_at"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "finding": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "affected_pages": {
        +              "type": "integer"
        +            },
        +            "check_id": {
        +              "description": "Pass to get_readiness_finding or verify_readiness_fix.",
        +              "type": "string"
        +            },
        +            "consequence": {
        +              "type": "string"
        +            },
        +            "effort_minutes": {
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            },
        +            "fix_type": {
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "latest_check": {
        +              "additionalProperties": false,
        +              "description": "The latest re-check since the scan.",
        +              "properties": {
        +                "check_id": {
        +                  "type": "string"
        +                },
        +                "completed_at": {
        +                  "type": "string"
        +                },
        +                "created_at": {
        +                  "type": "string"
        +                },
        +                "error": {
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "description": "The check_request_id get_readiness_finding takes.",
        +                  "type": "string"
        +                },
        +                "per_url": {
        +                  "items": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "status": {
        +                        "type": "string"
        +                      },
        +                      "url": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "url",
        +                      "status"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": "array"
        +                },
        +                "recharges_at": {
        +                  "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        +                  "type": "string"
        +                },
        +                "resolved": {
        +                  "description": "Whether the issue is fixed; null until complete.",
        +                  "type": [
        +                    "null",
        +                    "boolean"
        +                  ]
        +                },
        +                "status": {
        +                  "description": "queued, processing, complete, or failed.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "check_id",
        +                "status",
        +                "resolved",
        +                "per_url",
        +                "error",
        +                "created_at",
        +                "completed_at",
        +                "recharges_at"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "owner_role": {
        +              "type": "string"
        +            },
        +            "pillar": {
        +              "type": "string"
        +            },
        +            "points_recoverable": {
        +              "type": "number"
        +            },
        +            "severity": {
        +              "description": "critical, major, minor, or info; empty when passing.",
        +              "type": "string"
        +            },
        +            "site_wide": {
        +              "description": "One fix applies to the whole site.",
        +              "type": "boolean"
        +            },
        +            "status": {
        +              "description": "fail, warning, pass, or not_applicable.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "check_id",
        +            "label",
        +            "pillar",
        +            "status",
        +            "severity",
        +            "consequence",
        +            "points_recoverable",
        +            "effort_minutes",
        +            "owner_role",
        +            "fix_type",
        +            "affected_pages",
        +            "site_wide",
        +            "latest_check"
        +          ],
        +          "type": "object"
        +        },
        +        "fix": {
        +          "additionalProperties": false,
        +          "description": "How to fix it; null when no fix is drafted.",
        +          "properties": {
        +            "applies_to": {
        +              "description": "Up to 10 of the URLs or paths the fix applies to.",
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "applies_to_total": {
        +              "type": "integer"
        +            },
        +            "content": {
        +              "type": "string"
        +            },
        +            "kind": {
        +              "type": "string"
        +            },
        +            "language": {
        +              "type": "string"
        +            },
        +            "notes": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "title",
        +            "language",
        +            "content",
        +            "notes",
        +            "applies_to",
        +            "applies_to_total"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "instances": {
        +          "description": "Where the check fails.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "current": {
        +                "type": "string"
        +              },
        +              "detail": {
        +                "type": "string"
        +              },
        +              "expected": {
        +                "type": "string"
        +              },
        +              "page_count": {
        +                "type": "integer"
        +              },
        +              "scope": {
        +                "description": "page, template, or site.",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "url",
        +              "scope",
        +              "page_count",
        +              "current",
        +              "expected",
        +              "detail"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "pagination": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "next_cursor": {
        +              "description": "Pass as cursor to get the next page; empty on the last page.",
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "Items across all pages; null when not counted.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "next_cursor",
        +            "total"
        +          ],
        +          "type": "object"
        +        },
        +        "scan_id": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "scan_id",
        +        "finding",
        +        "fix",
        +        "instances",
        +        "pagination",
        +        "check_request"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_answers11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / brand / description
        Previous value: -"Brand ID or name. Required unless prompt_id is given."New value: +"Brand or study: its ID from list_brands, or its name (exact or a unique prefix)."
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • addedInput schema / properties / from / format
        Added value: +"date"
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • changedInput schema / properties / model / description
        Previous value: -"Optional model filter."New value: +"Optional model family: chatgpt, claude, gemini, perplexity, grok, muse-spark, google-ai-overviews, or google-ai-mode, as the plan tracks them. Covers every version of the model."
      • changedInput schema / properties / prompt_id / description
        Previous value: -"Prompt ID from list_prompts."New value: +"A prompt ID from list_prompts. Leave out for answers mentioning the brand."
      • addedInput schema / properties / to / format
        Added value: +"date"
      • addedInput schema / required
        Added value: +[
        +  "brand"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "answers": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "brand_position": {
        +                "description": "Where the brand is first mentioned among brands, 1 = first; null when not mentioned.",
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "brands_mentioned": {
        +                "description": "Prompt view: tracked brands the answer mentions, in order. Empty in the brand_mentions view; get_answer has them.",
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "captured_at": {
        +                "type": "string"
        +              },
        +              "citation_count": {
        +                "description": "Prompt view: sources the answer cites. 0 in the brand_mentions view.",
        +                "type": "integer"
        +              },
        +              "excerpt": {
        +                "description": "The mention in context, or the answer's opening.",
        +                "type": "string"
        +              },
        +              "id": {
        +                "description": "Answer ID for get_answer.",
        +                "type": "string"
        +              },
        +              "mentions_brand": {
        +                "type": "boolean"
        +              },
        +              "model": {
        +                "description": "Model family key.",
        +                "type": "string"
        +              },
        +              "model_name": {
        +                "type": "string"
        +              },
        +              "outcome": {
        +                "description": "Prompt view: how the answer treated the brand; empty until classified, and in the brand_mentions view.",
        +                "type": "string"
        +              },
        +              "prompt": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "text"
        +                ],
        +                "type": "object"
        +              },
        +              "recommended": {
        +                "description": "Prompt view: tracked brands the answer recommends. Empty in the brand_mentions view.",
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "segment": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "name"
        +                ],
        +                "type": [
        +                  "null",
        +                  "object"
        +                ]
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "prompt",
        +              "segment",
        +              "model",
        +              "model_name",
        +              "captured_at",
        +              "mentions_brand",
        +              "brand_position",
        +              "brands_mentioned",
        +              "recommended",
        +              "outcome",
        +              "excerpt",
        +              "citation_count"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "notice": {
        +          "description": "Why the list is empty, when it is.",
        +          "type": "string"
        +        },
        +        "pagination": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "next_cursor": {
        +              "description": "Pass as cursor to get the next page; empty on the last page.",
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "Items across all pages; null when not counted.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "next_cursor",
        +            "total"
        +          ],
        +          "type": "object"
        +        },
        +        "period": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "from": {
        +              "description": "First day, YYYY-MM-DD.",
        +              "type": "string"
        +            },
        +            "to": {
        +              "description": "Last day, YYYY-MM-DD.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "from",
        +            "to"
        +          ],
        +          "type": "object"
        +        },
        +        "prompt": {
        +          "additionalProperties": false,
        +          "description": "Set in the prompt view.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "text": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "text"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "view": {
        +          "description": "prompt: one prompt's answers. brand_mentions: answers that mention the brand.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "view",
        +        "prompt",
        +        "period",
        +        "answers",
        +        "pagination",
        +        "notice"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_brands6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • addedInput schema / properties / from / format
        Added value: +"date"
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brands": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "citations": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "competitor_domains": {
        +                    "type": "integer"
        +                  },
        +                  "domains": {
        +                    "type": "integer"
        +                  },
        +                  "own_citations": {
        +                    "type": "integer"
        +                  },
        +                  "own_domains": {
        +                    "type": "integer"
        +                  },
        +                  "third_party_domains": {
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "citations",
        +                  "domains",
        +                  "own_domains",
        +                  "own_citations",
        +                  "competitor_domains",
        +                  "third_party_domains"
        +                ],
        +                "type": "object"
        +              },
        +              "collection": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "active_prompts": {
        +                    "type": "integer"
        +                  },
        +                  "active_segments": {
        +                    "type": "integer"
        +                  },
        +                  "failed": {
        +                    "description": "Failed captures, plus each expected model that returned nothing for an active segment.",
        +                    "type": "integer"
        +                  },
        +                  "models_collecting": {
        +                    "description": "AI models that answered in the period.",
        +                    "type": "integer"
        +                  },
        +                  "models_expected": {
        +                    "description": "AI models the plan tracks.",
        +                    "type": "integer"
        +                  },
        +                  "state": {
        +                    "description": "ready: complete. partial: some captures failed or some models returned nothing. stale: nothing new in the period. insufficient: nothing to collect.",
        +                    "type": "string"
        +                  },
        +                  "unaccounted": {
        +                    "description": "Captures that were expected but neither succeeded nor failed.",
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "state",
        +                  "active_segments",
        +                  "active_prompts",
        +                  "failed",
        +                  "unaccounted",
        +                  "models_expected",
        +                  "models_collecting"
        +                ],
        +                "type": "object"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "kind": {
        +                "description": "brand: a brand tracked for itself. study: a brand watched for research.",
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "opportunities": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "high_priority": {
        +                    "description": "Opportunities in Now scoring 75 or more.",
        +                    "type": "integer"
        +                  },
        +                  "now": {
        +                    "description": "Opportunities in the Now stage, as list_opportunities counts them.",
        +                    "type": "integer"
        +                  },
        +                  "top": {
        +                    "additionalProperties": false,
        +                    "description": "The highest-ranked opportunity in Now; null when Now is empty.",
        +                    "properties": {
        +                      "id": {
        +                        "description": "Opportunity ID for get_opportunity.",
        +                        "type": "string"
        +                      },
        +                      "kind": {
        +                        "type": "string"
        +                      },
        +                      "score": {
        +                        "type": "integer"
        +                      },
        +                      "title": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "id",
        +                      "kind",
        +                      "title",
        +                      "score"
        +                    ],
        +                    "type": [
        +                      "null",
        +                      "object"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "now",
        +                  "high_priority",
        +                  "top"
        +                ],
        +                "type": "object"
        +              },
        +              "readiness": {
        +                "additionalProperties": false,
        +                "description": "The latest site readiness scan; null before the first scan.",
        +                "properties": {
        +                  "change": {
        +                    "description": "Change on the previous comparable scan, in points; null when not comparable.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "critical": {
        +                    "description": "Open critical findings.",
        +                    "type": "integer"
        +                  },
        +                  "major": {
        +                    "description": "Open major findings.",
        +                    "type": "integer"
        +                  },
        +                  "scan_id": {
        +                    "type": "string"
        +                  },
        +                  "scanned_at": {
        +                    "type": "string"
        +                  },
        +                  "score": {
        +                    "description": "Readiness score, 0-100.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "status": {
        +                    "type": "string"
        +                  },
        +                  "verdict": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "scan_id",
        +                  "status",
        +                  "score",
        +                  "change",
        +                  "verdict",
        +                  "critical",
        +                  "major",
        +                  "scanned_at"
        +                ],
        +                "type": [
        +                  "null",
        +                  "object"
        +                ]
        +              },
        +              "recommendation": {
        +                "additionalProperties": false,
        +                "description": "Share of analysed AI answers that recommend the brand, 0-100.",
        +                "properties": {
        +                  "answers": {
        +                    "description": "AI answers the value is based on.",
        +                    "type": "integer"
        +                  },
        +                  "change": {
        +                    "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "mentions": {
        +                    "description": "Brand mentions the value is based on (share of voice).",
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "models_collecting": {
        +                    "description": "AI models that answered in the period.",
        +                    "type": "integer"
        +                  },
        +                  "models_expected": {
        +                    "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
        +                    "type": "integer"
        +                  },
        +                  "period": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "from": {
        +                        "description": "First day, YYYY-MM-DD.",
        +                        "type": "string"
        +                      },
        +                      "to": {
        +                        "description": "Last day, YYYY-MM-DD.",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "from",
        +                      "to"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "value": {
        +                    "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "value",
        +                  "change",
        +                  "answers",
        +                  "models_collecting",
        +                  "models_expected",
        +                  "period"
        +                ],
        +                "type": "object"
        +              },
        +              "share_of_voice": {
        +                "additionalProperties": false,
        +                "description": "The brand's share of all tracked-brand mentions in AI answers, 0-100.",
        +                "properties": {
        +                  "answers": {
        +                    "description": "AI answers the value is based on.",
        +                    "type": "integer"
        +                  },
        +                  "change": {
        +                    "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "mentions": {
        +                    "description": "Brand mentions the value is based on (share of voice).",
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "models_collecting": {
        +                    "description": "AI models that answered in the period.",
        +                    "type": "integer"
        +                  },
        +                  "models_expected": {
        +                    "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
        +                    "type": "integer"
        +                  },
        +                  "period": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "from": {
        +                        "description": "First day, YYYY-MM-DD.",
        +                        "type": "string"
        +                      },
        +                      "to": {
        +                        "description": "Last day, YYYY-MM-DD.",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "from",
        +                      "to"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "value": {
        +                    "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "value",
        +                  "change",
        +                  "answers",
        +                  "models_collecting",
        +                  "models_expected",
        +                  "period"
        +                ],
        +                "type": "object"
        +              },
        +              "status": {
        +                "description": "active or paused. A paused brand does not collect.",
        +                "type": "string"
        +              },
        +              "traffic": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "ai_referrals": {
        +                    "description": "Visits from people who clicked through from an AI answer.",
        +                    "type": "integer"
        +                  },
        +                  "ai_visits": {
        +                    "description": "AI crawler visits plus AI referrals.",
        +                    "type": "integer"
        +                  },
        +                  "connected": {
        +                    "description": "Whether site tracking is set up; when false the counts are 0 because nothing is measured.",
        +                    "type": "boolean"
        +                  },
        +                  "crawler_visits": {
        +                    "type": "integer"
        +                  },
        +                  "latest_visit_at": {
        +                    "type": "string"
        +                  },
        +                  "pages_reached": {
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "connected",
        +                  "ai_visits",
        +                  "crawler_visits",
        +                  "ai_referrals",
        +                  "pages_reached",
        +                  "latest_visit_at"
        +                ],
        +                "type": "object"
        +              },
        +              "url": {
        +                "description": "The brand's website, or empty when none is set.",
        +                "type": "string"
        +              },
        +              "visibility": {
        +                "additionalProperties": false,
        +                "description": "How visible the brand is in AI answers, 0-100: how often answers mention it, weighted by how early.",
        +                "properties": {
        +                  "answers": {
        +                    "description": "AI answers the value is based on.",
        +                    "type": "integer"
        +                  },
        +                  "change": {
        +                    "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  },
        +                  "mentions": {
        +                    "description": "Brand mentions the value is based on (share of voice).",
        +                    "type": [
        +                      "null",
        +                      "integer"
        +                    ]
        +                  },
        +                  "models_collecting": {
        +                    "description": "AI models that answered in the period.",
        +                    "type": "integer"
        +                  },
        +                  "models_expected": {
        +                    "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
        +                    "type": "integer"
        +                  },
        +                  "period": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "from": {
        +                        "description": "First day, YYYY-MM-DD.",
        +                        "type": "string"
        +                      },
        +                      "to": {
        +                        "description": "Last day, YYYY-MM-DD.",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "from",
        +                      "to"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "value": {
        +                    "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
        +                    "type": [
        +                      "null",
        +                      "number"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "value",
        +                  "change",
        +                  "answers",
        +                  "models_collecting",
        +                  "models_expected",
        +                  "period"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "url",
        +              "kind",
        +              "status",
        +              "visibility",
        +              "share_of_voice",
        +              "recommendation",
        +              "citations",
        +              "readiness",
        +              "collection",
        +              "traffic",
        +              "opportunities"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "pagination": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "next_cursor": {
        +              "description": "Pass as cursor to get the next page; empty on the last page.",
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "Items across all pages; null when not counted.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "next_cursor",
        +            "total"
        +          ],
        +          "type": "object"
        +        },
        +        "period": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "from": {
        +              "description": "First day, YYYY-MM-DD.",
        +              "type": "string"
        +            },
        +            "to": {
        +              "description": "Last day, YYYY-MM-DD.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "from",
        +            "to"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "period",
        +        "brands",
        +        "pagination"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_citations7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • addedInput schema / properties / from / format
        Added value: +"date"
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "by_ownership": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "competitor": {
        +                  "type": "integer"
        +                },
        +                "own": {
        +                  "type": "integer"
        +                },
        +                "third_party": {
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "own",
        +                "competitor",
        +                "third_party"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "source_types": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "share": {
        +                    "type": "number"
        +                  },
        +                  "source_type": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "source_type",
        +                  "citations",
        +                  "share"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "total_citations": {
        +              "type": "integer"
        +            },
        +            "view": {
        +              "type": "string"
        +            },
        +            "weekly": {
        +              "description": "Citations by week, starting with the period's first day.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "competitor": {
        +                    "type": "integer"
        +                  },
        +                  "own": {
        +                    "type": "integer"
        +                  },
        +                  "third_party": {
        +                    "type": "integer"
        +                  },
        +                  "week_start": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "week_start",
        +                  "own",
        +                  "competitor",
        +                  "third_party"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "period",
        +            "total_citations",
        +            "by_ownership",
        +            "source_types",
        +            "weekly"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "domains": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "domain": {
        +                    "description": "Pass to get_citation_source.",
        +                    "type": "string"
        +                  },
        +                  "gap_competitors": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "latest_cited_at": {
        +                    "type": "string"
        +                  },
        +                  "models": {
        +                    "description": "Model family keys that cited it.",
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "ownership": {
        +                    "description": "own, competitor, or third_party.",
        +                    "type": "string"
        +                  },
        +                  "pages": {
        +                    "type": "integer"
        +                  },
        +                  "prompts": {
        +                    "type": "integer"
        +                  },
        +                  "source_gap": {
        +                    "description": "Competitors are cited from this domain and the brand is not.",
        +                    "type": "boolean"
        +                  },
        +                  "source_type": {
        +                    "type": "string"
        +                  },
        +                  "top_page": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "source_id": {
        +                        "description": "Pass to get_citation_source.",
        +                        "type": "string"
        +                      },
        +                      "title": {
        +                        "type": "string"
        +                      },
        +                      "url": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "source_id",
        +                      "title",
        +                      "url"
        +                    ],
        +                    "type": [
        +                      "null",
        +                      "object"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "domain",
        +                  "ownership",
        +                  "source_type",
        +                  "citations",
        +                  "pages",
        +                  "prompts",
        +                  "models",
        +                  "source_gap",
        +                  "gap_competitors",
        +                  "top_page",
        +                  "latest_cited_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "period",
        +            "domains",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "brand": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "The brand's website, or empty when none is set.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            },
        +            "pages": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "brands_named": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "citations": {
        +                    "type": "integer"
        +                  },
        +                  "domain": {
        +                    "type": "string"
        +                  },
        +                  "gap_competitors": {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "influence": {
        +                    "description": "0-100: how much the page shapes answers, from citation frequency, recency, model and prompt coverage.",
        +                    "type": "integer"
        +                  },
        +                  "latest_cited_at": {
        +                    "type": "string"
        +                  },
        +                  "models": {
        +                    "type": "integer"
        +                  },
        +                  "ownership": {
        +                    "description": "own, competitor, or third_party.",
        +                    "type": "string"
        +                  },
        +                  "prompts": {
        +                    "type": "integer"
        +                  },
        +                  "source_gap": {
        +                    "type": "boolean"
        +                  },
        +                  "source_id": {
        +                    "description": "Pass to get_citation_source.",
        +                    "type": "string"
        +                  },
        +                  "source_type": {
        +                    "type": "string"
        +                  },
        +                  "title": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "source_id",
        +                  "url",
        +                  "title",
        +                  "domain",
        +                  "ownership",
        +                  "source_type",
        +                  "influence",
        +                  "citations",
        +                  "prompts",
        +                  "models",
        +                  "brands_named",
        +                  "source_gap",
        +                  "gap_competitors",
        +                  "latest_cited_at"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "pagination": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "next_cursor": {
        +                  "description": "Pass as cursor to get the next page; empty on the last page.",
        +                  "type": "string"
        +                },
        +                "total": {
        +                  "description": "Items across all pages; null when not counted.",
        +                  "type": [
        +                    "null",
        +                    "integer"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "next_cursor",
        +                "total"
        +              ],
        +              "type": "object"
        +            },
        +            "period": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "from": {
        +                  "description": "First day, YYYY-MM-DD.",
        +                  "type": "string"
        +                },
        +                "to": {
        +                  "description": "Last day, YYYY-MM-DD.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "from",
        +                "to"
        +              ],
        +              "type": "object"
        +            },
        +            "view": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "brand",
        +            "view",
        +            "period",
        +            "pages",
        +            "pagination"
        +          ],
        +          "type": "object"
        +        }
        +      ]
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_opportunities5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "counts": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "in_flight": {
        +              "type": "integer"
        +            },
        +            "now": {
        +              "type": "integer"
        +            },
        +            "ready_to_win": {
        +              "description": "Watching items whose gap has closed; move them to won.",
        +              "type": "integer"
        +            },
        +            "watching": {
        +              "type": "integer"
        +            },
        +            "won": {
        +              "description": "Won this month.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "now",
        +            "in_flight",
        +            "watching",
        +            "won",
        +            "ready_to_win"
        +          ],
        +          "type": "object"
        +        },
        +        "opportunities": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "assignee": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "member_id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "member_id",
        +                  "name"
        +                ],
        +                "type": [
        +                  "null",
        +                  "object"
        +                ]
        +              },
        +              "comment_count": {
        +                "type": "integer"
        +              },
        +              "dismissed_at": {
        +                "type": "string"
        +              },
        +              "found_at": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "kind": {
        +                "description": "content_gap, readiness, source_gap, traffic_gap, or coverage_gap.",
        +                "type": "string"
        +              },
        +              "monthly_ai_searches": {
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "score": {
        +                "description": "0-100 priority.",
        +                "type": "integer"
        +              },
        +              "segment": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "name"
        +                ],
        +                "type": [
        +                  "null",
        +                  "object"
        +                ]
        +              },
        +              "signal": {
        +                "description": "Why it matters now.",
        +                "type": "string"
        +              },
        +              "snoozed_until": {
        +                "type": "string"
        +              },
        +              "stage": {
        +                "description": "now, in_flight, watching, or won.",
        +                "type": "string"
        +              },
        +              "stage_changed_at": {
        +                "type": "string"
        +              },
        +              "title": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "kind",
        +              "stage",
        +              "title",
        +              "signal",
        +              "segment",
        +              "monthly_ai_searches",
        +              "score",
        +              "assignee",
        +              "found_at",
        +              "stage_changed_at",
        +              "snoozed_until",
        +              "dismissed_at",
        +              "comment_count"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "pagination": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "next_cursor": {
        +              "description": "Pass as cursor to get the next page; empty on the last page.",
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "Items across all pages; null when not counted.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "next_cursor",
        +            "total"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "counts",
        +        "opportunities",
        +        "pagination"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_pages5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "pages": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "claims_to_refresh": {
        +                "description": "Claims that may be out of date when the refresh is due.",
        +                "type": "integer"
        +              },
        +              "content_type": {
        +                "type": "string"
        +              },
        +              "crawlers": {
        +                "description": "AI crawlers that have read it since it went live.",
        +                "type": "integer"
        +              },
        +              "id": {
        +                "description": "Page ID for get_page.",
        +                "type": "string"
        +              },
        +              "lane": {
        +                "description": "in_progress, live, or needs_refresh.",
        +                "type": "string"
        +              },
        +              "live_at": {
        +                "type": "string"
        +              },
        +              "new_first_citation": {
        +                "description": "An AI answer cited it for the first time since it was last viewed.",
        +                "type": "boolean"
        +              },
        +              "question": {
        +                "type": "string"
        +              },
        +              "refresh_due_at": {
        +                "type": "string"
        +              },
        +              "results": {
        +                "additionalProperties": false,
        +                "description": "Once live: AI answers to its question that name or cite the brand.",
        +                "properties": {
        +                  "answers": {
        +                    "type": "integer"
        +                  },
        +                  "cited": {
        +                    "description": "Answers that cite the page.",
        +                    "type": "integer"
        +                  },
        +                  "named": {
        +                    "description": "Answers that name the brand.",
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "answers",
        +                  "named",
        +                  "cited"
        +                ],
        +                "type": [
        +                  "null",
        +                  "object"
        +                ]
        +              },
        +              "sections_drafted": {
        +                "type": "integer"
        +              },
        +              "sections_total": {
        +                "type": "integer"
        +              },
        +              "stage": {
        +                "description": "writing, live, read (AI crawlers read it), mentioned, cited, or refresh.",
        +                "type": "string"
        +              },
        +              "status": {
        +                "description": "draft, generating, generated, failed, published, or archived.",
        +                "type": "string"
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "updated_at": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "title",
        +              "question",
        +              "content_type",
        +              "lane",
        +              "stage",
        +              "status",
        +              "sections_drafted",
        +              "sections_total",
        +              "live_at",
        +              "results",
        +              "crawlers",
        +              "refresh_due_at",
        +              "claims_to_refresh",
        +              "new_first_citation",
        +              "updated_at"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "pagination": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "next_cursor": {
        +              "description": "Pass as cursor to get the next page; empty on the last page.",
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "Items across all pages; null when not counted.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "next_cursor",
        +            "total"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "pages",
        +        "pagination"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_prompts7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from the previous page."New value: +"next_cursor from the previous page. Leave out for the first page."
      • addedInput schema / properties / from / format
        Added value: +"date"
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page. Defaults to 25, max 100."New value: +"Rows per page. Defaults to 25, max 100. A page may hold fewer rows to stay within the response size; follow next_cursor."
      • addedInput schema / properties / to / format
        Added value: +"date"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "pagination": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "next_cursor": {
        +              "description": "Pass as cursor to get the next page; empty on the last page.",
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "Items across all pages; null when not counted.",
        +              "type": [
        +                "null",
        +                "integer"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "next_cursor",
        +            "total"
        +          ],
        +          "type": "object"
        +        },
        +        "period": {
        +          "additionalProperties": false,
        +          "description": "The period answers_mentioning_brand counts.",
        +          "properties": {
        +            "from": {
        +              "description": "First day, YYYY-MM-DD.",
        +              "type": "string"
        +            },
        +            "to": {
        +              "description": "Last day, YYYY-MM-DD.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "from",
        +            "to"
        +          ],
        +          "type": "object"
        +        },
        +        "prompts": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "answers_mentioning_brand": {
        +                "description": "Answers in the period that mentioned the brand.",
        +                "type": "integer"
        +              },
        +              "category": {
        +                "type": "string"
        +              },
        +              "created_at": {
        +                "type": "string"
        +              },
        +              "funnel_stage": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "intent_type": {
        +                "type": "string"
        +              },
        +              "last_mentioned_at": {
        +                "type": "string"
        +              },
        +              "last_run_at": {
        +                "type": "string"
        +              },
        +              "monthly_ai_searches": {
        +                "description": "Estimated monthly AI searches for the question; null when unknown.",
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "replaces_prompt_id": {
        +                "description": "The prompt this one replaced when its text changed; its answers are that prompt's history.",
        +                "type": "string"
        +              },
        +              "segment": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "id",
        +                  "name"
        +                ],
        +                "type": "object"
        +              },
        +              "status": {
        +                "description": "active prompts run daily; paused ones do not.",
        +                "type": "string"
        +              },
        +              "tags": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "text": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "text",
        +              "status",
        +              "segment",
        +              "tags",
        +              "category",
        +              "intent_type",
        +              "funnel_stage",
        +              "monthly_ai_searches",
        +              "answers_mentioning_brand",
        +              "last_mentioned_at",
        +              "last_run_at",
        +              "replaces_prompt_id",
        +              "created_at"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "period",
        +        "prompts",
        +        "pagination"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_reports3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "reports": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "created_at": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "period": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "from": {
        +                    "description": "First day, YYYY-MM-DD.",
        +                    "type": "string"
        +                  },
        +                  "to": {
        +                    "description": "Last day, YYYY-MM-DD.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "from",
        +                  "to"
        +                ],
        +                "type": "object"
        +              },
        +              "public_url": {
        +                "description": "Anyone with this link can read the report; empty when revoked.",
        +                "type": "string"
        +              },
        +              "revoked": {
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name",
        +              "period",
        +              "created_at",
        +              "public_url",
        +              "revoked"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "reports"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedmark_page_published1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_id": {
        +              "type": "string"
        +            },
        +            "plan_status": {
        +              "type": "string"
        +            },
        +            "published_url": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "page_id",
        +            "title",
        +            "status",
        +            "plan_status",
        +            "published_url"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedredraft_page_section2 fields changed
      • changedInput schema / properties / section_id / description
        Previous value: -"A section ID from get_page's plan.units."New value: +"A section ID from get_page's plan.sections."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_id": {
        +              "type": "string"
        +            },
        +            "plan_status": {
        +              "type": "string"
        +            },
        +            "published_url": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "page_id",
        +            "title",
        +            "status",
        +            "plan_status",
        +            "published_url"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedrun_readiness_scan1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "page_limit": {
        +              "type": "integer"
        +            },
        +            "scan_id": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "scan_id",
        +            "status",
        +            "page_limit"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedsave_competitor1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "aliases": {
        +              "description": "Other names answers use for the brand.",
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "reanalysis": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "job_id": {
        +                  "type": "string"
        +                },
        +                "message": {
        +                  "type": "string"
        +                },
        +                "status": {
        +                  "description": "queued, running, or failed.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "status",
        +                "message"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "status": {
        +              "description": "active or paused. A paused competitor is not tracked.",
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url",
        +            "aliases",
        +            "status",
        +            "reanalysis"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedsave_prompt1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "replaces_prompt_id": {
        +              "type": "string"
        +            },
        +            "segment": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "name"
        +              ],
        +              "type": "object"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "tags": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "text": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "text",
        +            "status",
        +            "segment",
        +            "tags",
        +            "replaces_prompt_id"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedsave_segment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "language": {
        +              "description": "Language code, or empty for the market's default.",
        +              "type": "string"
        +            },
        +            "market": {
        +              "description": "Country code, or global.",
        +              "type": "string"
        +            },
        +            "models": {
        +              "description": "The AI models the segment collects from: every model the plan covers.",
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "model": {
        +                    "description": "Model family key.",
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "model",
        +                  "name"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "prompt_count": {
        +              "type": "integer"
        +            },
        +            "prompt_limit": {
        +              "type": "integer"
        +            },
        +            "status": {
        +              "description": "active segments collect daily; paused ones do not.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "status",
        +            "market",
        +            "language",
        +            "prompt_limit",
        +            "prompt_count",
        +            "models"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_docs5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / limit / default
        Removed value: -5
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / required
        Added value: +[
        +  "query"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "results": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "excerpt": {
        +                "type": "string"
        +              },
        +              "slug": {
        +                "type": "string"
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "slug",
        +              "title",
        +              "excerpt",
        +              "url"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "results"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedset_primary_brand1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "aliases": {
        +              "description": "Other names answers use for the brand.",
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "reanalysis": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "job_id": {
        +                  "type": "string"
        +                },
        +                "message": {
        +                  "type": "string"
        +                },
        +                "status": {
        +                  "description": "queued, running, or failed.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "status",
        +                "message"
        +              ],
        +              "type": [
        +                "null",
        +                "object"
        +              ]
        +            },
        +            "status": {
        +              "description": "active or paused. A paused competitor is not tracked.",
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url",
        +            "aliases",
        +            "status",
        +            "reanalysis"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedstart_brand_setup1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "reused": {
        +              "description": "A setup of this site was already reading; this is it.",
        +              "type": "boolean"
        +            },
        +            "setup_id": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "step": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "setup_id",
        +            "status",
        +            "step",
        +            "url",
        +            "reused"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedsuggest_prompts6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / brand / minLength
        Added value: +1
      • changedInput schema / properties / count / description
        Previous value: -"How many to suggest."New value: +"How many to suggest. Defaults to 8."
      • addedInput schema / properties / segment / minLength
        Added value: +1
      • addedInput schema / properties / topic / minLength
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": "object"
        +        },
        +        "segment": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name"
        +          ],
        +          "type": "object"
        +        },
        +        "suggestions": {
        +          "description": "Highest AI search demand first.",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "category": {
        +                "type": "string"
        +              },
        +              "intent_type": {
        +                "type": "string"
        +              },
        +              "monthly_ai_searches": {
        +                "description": "null when no search demand was found.",
        +                "type": [
        +                  "null",
        +                  "integer"
        +                ]
        +              },
        +              "tags": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "text": {
        +                "description": "Pass to save_prompt to track it.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "text",
        +              "tags",
        +              "category",
        +              "intent_type",
        +              "monthly_ai_searches"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "brand",
        +        "segment",
        +        "suggestions",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_brand1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url",
        +            "status"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_brand_voice1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "tone": {
        +              "description": "professional, confident, educational, conversational, executive, technical, or persuasive; empty when no default is set.",
        +              "type": "string"
        +            },
        +            "updated_at": {
        +              "description": "Empty when the tone was never set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tone",
        +            "updated_at"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_opportunities1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "assignee_id": {
        +                "type": "string"
        +              },
        +              "dismissed": {
        +                "type": "boolean"
        +              },
        +              "id": {
        +                "type": "string"
        +              },
        +              "snoozed_until": {
        +                "type": "string"
        +              },
        +              "stage": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "stage",
        +              "assignee_id",
        +              "snoozed_until",
        +              "dismissed"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedverify_readiness_fix1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "brand": {
        +          "additionalProperties": false,
        +          "description": "The brand written to; null for brand setup before approval.",
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "The brand's website, or empty when none is set.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "name",
        +            "url"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "cost": {
        +          "additionalProperties": false,
        +          "description": "What the write used from the plan's capacity, allowances and model budget; null when nothing.",
        +          "properties": {
        +            "content_generations": {
        +              "description": "Content Studio generations used from the plan's allowance.",
        +              "type": "integer"
        +            },
        +            "model_budget": {
        +              "description": "Whether the call spends the organisation's AI model budget.",
        +              "type": "boolean"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "prompt_capacity": {
        +              "description": "Active prompts added against the plan's prompt limit.",
        +              "type": "integer"
        +            },
        +            "queued_model_runs": {
        +              "description": "Answer collections queued; each uses model budget.",
        +              "type": "integer"
        +            },
        +            "readiness_checks": {
        +              "description": "Readiness re-checks used from the plan's monthly allowance.",
        +              "type": "integer"
        +            },
        +            "readiness_scans": {
        +              "description": "Site readiness scans used from the plan's monthly allowance.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "model_budget",
        +            "content_generations",
        +            "readiness_scans",
        +            "readiness_checks",
        +            "prompt_capacity",
        +            "queued_model_runs",
        +            "note"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "message": {
        +          "description": "What happens next.",
        +          "type": "string"
        +        },
        +        "operation_id": {
        +          "description": "Pass to get_operation to follow the write.",
        +          "type": "string"
        +        },
        +        "poll_after_seconds": {
        +          "description": "While pending, how long to wait before calling get_operation; 0 otherwise.",
        +          "type": "integer"
        +        },
        +        "progress": {
        +          "additionalProperties": false,
        +          "description": "Set while the work runs.",
        +          "properties": {
        +            "done": {
        +              "type": "integer"
        +            },
        +            "message": {
        +              "type": "string"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "description": "0 when the total is not known.",
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "stage",
        +            "done",
        +            "total",
        +            "message"
        +          ],
        +          "type": [
        +            "null",
        +            "object"
        +          ]
        +        },
        +        "replayed": {
        +          "description": "True when this repeats an earlier call with the same idempotency_key.",
        +          "type": "boolean"
        +        },
        +        "resource": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "check_id": {
        +              "type": "string"
        +            },
        +            "completed_at": {
        +              "type": "string"
        +            },
        +            "created_at": {
        +              "type": "string"
        +            },
        +            "error": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "The check_request_id get_readiness_finding takes.",
        +              "type": "string"
        +            },
        +            "per_url": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "status": {
        +                    "type": "string"
        +                  },
        +                  "url": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "url",
        +                  "status"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "recharges_at": {
        +              "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
        +              "type": "string"
        +            },
        +            "resolved": {
        +              "description": "Whether the issue is fixed; null until complete.",
        +              "type": [
        +                "null",
        +                "boolean"
        +              ]
        +            },
        +            "status": {
        +              "description": "queued, processing, complete, or failed.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "check_id",
        +            "status",
        +            "resolved",
        +            "per_url",
        +            "error",
        +            "created_at",
        +            "completed_at",
        +            "recharges_at"
        +          ],
        +          "type": "object"
        +        },
        +        "status": {
        +          "description": "completed: done. pending: saved, with work still running; call get_operation after poll_after_seconds. failed: the work after the write failed; message says why.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "operation_id",
        +        "status",
        +        "replayed",
        +        "brand",
        +        "resource",
        +        "progress",
        +        "poll_after_seconds",
        +        "message",
        +        "cost"
        +      ],
        +      "type": "object"
        +    },
        +    "generated_at": {
        +      "description": "RFC 3339 time the response was made.",
        +      "type": "string"
        +    },
        +    "schema_version": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "schema_version",
        +    "generated_at",
        +    "data"
        +  ],
        +  "type": "object"
        +}
  9. 82 tool updates
    • Addedact_on_opportunity
    • Addedanswer_page_questions
    • Addedapprove_brand_setup
    • Addedcomment_on_opportunity
    • Removedcreate_competitor
    • Removedcreate_content_brief
    • Removedcreate_content_skill
    • Addedcreate_page
    • Removedcreate_project
    • Removedcreate_prompt
    • Addedcreate_report
    • Removedcreate_segment
    • Removedcreate_visibility_goal
    • Addeddraft_page
    • Removedgenerate_content_brief
    • Addedget_ai_traffic
    • Addedget_answer
    • Removedget_answer_gaps
    • Addedget_brand_overview
    • Addedget_brand_settings
    • Addedget_brand_setup
    • Removedget_citation
    • Addedget_citation_source
    • Removedget_content_brief
    • Removedget_content_brief_run_steps
    • Removedget_content_opportunity
    • Removedget_content_studio_settings
    • Removedget_mcp_operation
    • Addedget_operation
    • Addedget_opportunity
    • Addedget_page
    • Addedget_perception
    • Removedget_perception_summary
    • Addedget_plan
    • Removedget_plan_usage
    • Removedget_portfolio_summary
    • Removedget_project_overview
    • Addedget_readiness
    • Addedget_readiness_finding
    • Removedget_report
    • Removedget_response
    • Removedget_share_of_voice
    • Removedget_source_health
    • Removedget_visibility
    • Addedlist_answers
    • Addedlist_brands
    • Changedlist_citations16 fields changed
      • addedInput schema / properties / brand
        Added value: +{
        +  "description": "Brand or study: its ID from list_brands, or its name (exact or a unique prefix).",
        +  "type": "string"
        +}
      • changedInput schema / properties / cursor / description
        Previous value: -"Opaque pagination cursor."New value: +"next_cursor from the previous page."
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "Optional domain filter.",
        +  "type": "string"
        +}
      • changedInput schema / properties / from / description
        Previous value: -"Start date in YYYY-MM-DD. Defaults to 30 days before to."New value: +"Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum rows to return."New value: +"Rows per page. Defaults to 25, max 100."
      • addedInput schema / properties / limit / maximum
        Added value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • removedInput schema / properties / mode
        Removed value: -{
        -  "description": "sources or occurrences. Defaults to sources.",
        -  "enum": [
        -    "sources",
        -    "occurrences"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / ownership
        Added value: +{
        +  "description": "Optional filter.",
        +  "enum": [
        +    "own",
        +    "competitor",
        +    "third_party"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Cleotic project ID.",
        -  "type": "string"
        -}
      • removedInput schema / properties / project_name
        Removed value: -{
        -  "description": "Project name. Exact case-insensitive names and unique prefixes are supported.",
        -  "type": "string"
        -}
      • addedInput schema / properties / search
        Added value: +{
        +  "description": "Optional text filter.",
        +  "type": "string"
        +}
      • addedInput schema / properties / segment
        Added value: +{
        +  "description": "Optional segment ID or name. get_brand_settings lists the brand's segments.",
        +  "type": "string"
        +}
      • changedInput schema / properties / to / description
        Previous value: -"End date in YYYY-MM-DD. Defaults to today."New value: +"End date, YYYY-MM-DD. Defaults to today."
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Defaults to overview.",
        +  "enum": [
        +    "overview",
        +    "domains",
        +    "pages"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "brand"
        +]
    • Removedlist_content_briefs
    • Removedlist_content_opportunities
    • Removedlist_content_skills
    • Removedlist_model_tiers
    • Addedlist_opportunities
    • Addedlist_pages
    • Removedlist_projects
    • Changedlist_prompts12 fields changed
      • addedInput schema / properties / brand
        Added value: +{
        +  "description": "Brand or study: its ID from list_brands, or its name (exact or a unique prefix).",
        +  "type": "string"
        +}
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "next_cursor from the previous page.",
        +  "type": "string"
        +}
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "Start date, YYYY-MM-DD. Defaults to 30 days before to; plan retention may shorten it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Rows per page. Defaults to 25, max 100.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Cleotic project ID.",
        -  "type": "string"
        -}
      • removedInput schema / properties / project_name
        Removed value: -{
        -  "description": "Project name. Exact case-insensitive names and unique prefixes are supported.",
        -  "type": "string"
        -}
      • addedInput schema / properties / segment
        Added value: +{
        +  "description": "Optional segment ID or name. get_brand_settings lists the brand's segments.",
        +  "type": "string"
        +}
      • removedInput schema / properties / segment_id
        Removed value: -{
        -  "description": "Segment ID.",
        -  "type": "string"
        -}
      • removedInput schema / properties / segment_name
        Removed value: -{
        -  "description": "Segment name within the project.",
        -  "type": "string"
        -}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "Optional filter.",
        +  "enum": [
        +    "active",
        +    "paused"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "End date, YYYY-MM-DD. Defaults to today.",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "brand"
        +]
    • Changedlist_reports4 fields changed
      • addedInput schema / properties / brand
        Added value: +{
        +  "description": "Brand or study: its ID from list_brands, or its name (exact or a unique prefix).",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Cleotic project ID.",
        -  "type": "string"
        -}
      • removedInput schema / properties / project_name
        Removed value: -{
        -  "description": "Project name. Exact case-insensitive names and unique prefixes are supported.",
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "brand"
        +]
    • Removedlist_responses
    • Removedlist_segments
    • Removedlist_visibility_goals
    • Addedmark_page_published
    • Addedredraft_page_section
    • Removedreplace_prompt
    • Addedrun_readiness_scan
    • Addedsave_competitor
    • Addedsave_prompt
    • Addedsave_segment
    • Changedset_primary_brand7 fields changed
      • addedInput schema / properties / aliases
        Added value: +{
        +  "description": "Other names answers use for the brand.",
        +  "items": {
        +    "maxLength": 4096,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / brand
        Added value: +{
        +  "description": "Brand or study: its ID from list_brands, or its name.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / domain
        Added value: +{
        +  "maxLength": 2048,
        +  "type": "string"
        +}
      • removedInput schema / properties / input
        Removed value: -{
        -  "additionalProperties": false,
        -  "minProperties": 1,
        -  "properties": {
        -    "aliases": {
        -      "items": {
        -        "maxLength": 4096,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "maxItems": 100,
        -      "type": "array"
        -    },
        -    "domain": {
        -      "maxLength": 2048,
        -      "type": "string"
        -    },
        -    "name": {
        -      "maxLength": 4096,
        -      "minLength": 1,
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / name
        Added value: +{
        +  "maxLength": 4096,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "maxLength": 4096,
        -  "minLength": 1,
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "idempotency_key",
        -  "project_id",
        -  "input"
        -]New value: +[
        +  "brand",
        +  "idempotency_key"
        +]
    • Addedstart_brand_setup
    • Addedsuggest_prompts
    • Addedupdate_brand
    • Addedupdate_brand_voice
    • Removedupdate_competitor
    • Removedupdate_content_brief
    • Removedupdate_content_opportunity
    • Removedupdate_content_skill
    • Removedupdate_content_studio_settings
    • Addedupdate_opportunities
    • Removedupdate_project
    • Removedupdate_prompt
    • Removedupdate_segment
    • Removedupdate_visibility_goal
    • Addedverify_readiness_fix
  10. 48 tool updates
    • First observedcreate_competitor
    • First observedcreate_content_brief
    • First observedcreate_content_skill
    • First observedcreate_project
    • First observedcreate_prompt
    • First observedcreate_segment
    • First observedcreate_visibility_goal
    • First observedgenerate_content_brief
    • First observedget_answer_gaps
    • First observedget_citation
    • First observedget_content_brief
    • First observedget_content_brief_run_steps
    • First observedget_content_opportunity
    • First observedget_content_studio_settings
    • First observedget_doc
    • First observedget_mcp_operation
    • First observedget_perception_summary
    • First observedget_plan_usage
    • First observedget_portfolio_summary
    • First observedget_project_overview
    • First observedget_report
    • First observedget_response
    • First observedget_share_of_voice
    • First observedget_source_health
    • First observedget_visibility
    • First observedlist_citations
    • First observedlist_content_briefs
    • First observedlist_content_opportunities
    • First observedlist_content_skills
    • First observedlist_model_tiers
    • First observedlist_projects
    • First observedlist_prompts
    • First observedlist_reports
    • First observedlist_responses
    • First observedlist_segments
    • First observedlist_visibility_goals
    • First observedreplace_prompt
    • First observedsearch_docs
    • First observedset_primary_brand
    • First observedupdate_competitor
    • First observedupdate_content_brief
    • First observedupdate_content_opportunity
    • First observedupdate_content_skill
    • First observedupdate_content_studio_settings
    • First observedupdate_project
    • First observedupdate_prompt
    • First observedupdate_segment
    • First observedupdate_visibility_goal

Publisher details

Operator
Cleotic
Operator website
https://cleotic.ai
Vendor relationship
Not applicable
Trust center
Not available
Restrictions
Paid plan required.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to check brand mentions across AI search surfaces like ChatGPT, Claude, Gemini, Perplexity, and Google AI Overviews using natural language queries.
    4
    3 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Monitors brand mentions, citations, sentiment, competitor share of voice, and GEO performance across AI search engines.
    1
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    22 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables coding agents to onboard a brand, generate and edit prompts, launch AI-visibility runs across multiple engines in the background, and pull daily reports, trends, gaps and raw answers. It exposes brand positioning metrics such as visibility, sentiment, citations and share of voice as callable tools.
    20 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources