> ## Documentation Index
> Fetch the complete documentation index at: https://docs.querying.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 获取监测器分析

> 查看监测器在某个时间窗口的报告：指标、品牌、提示词和数据质量。



## OpenAPI

````yaml GET /v1/monitors/{id}/analytics
openapi: 3.1.0
info:
  title: querying.ai
  description: >-
    One API for every AI answer engine. Every task is asynchronous: submit, then
    collect the result via webhook or polling.
  version: 1.0.0
servers:
  - url: https://api.querying.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/monitors/{id}/analytics:
    get:
      tags:
        - Monitors
      summary: Get monitor analytics
      description: >-
        The report contract. One cohort and one filter set drive every section,
        and the previous interval has exactly the same duration and filters, so
        the comparison is like for like. The window is half-open in UTC: since
        is inclusive, until exclusive. Rates are null when there is no sample
        rather than 0, changes are withheld (null) when the scoring definition
        was legacy or changed between the periods, and a completed observation
        with no answer counts as not mentioned while a failed task is excluded
        from the denominator and reported only in health. Share of voice divides
        by all tracked brand mentions, not by answers, so the shares of one
        window add up to 100 and are not market share. A category monitor
        answers with the category report: stats and previous hold runs, named
        and namedRate, changes holds namedRatePp, and category holds the brand
        ranking, the sub-fields, the engines, the daily series and the prompts
        (see MonitorCategoryAnalytics).
      operationId: getMonitorAnalytics
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: days
          in: query
          required: false
          schema:
            type: integer
            enum:
              - 7
              - 30
              - 90
            default: 30
          description: Window length ending now. Cannot be combined with since/until.
        - name: since
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: >-
            Inclusive ISO instant with a timezone offset, for example
            2026-09-15T00:00:00Z. Requires until. A date without a timezone is
            rejected: it cannot define a portable window.
        - name: until
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: >-
            Exclusive ISO instant with a timezone offset. Requires since. The
            span must be positive, at most 90 days, and not in the future.
        - name: engine
          in: query
          required: false
          schema:
            type: string
          description: >-
            Restrict every section to one engine. Accepts a canonical id or a
            public alias (GOOGLE_AIO and GOOGLE_AIMODE). Must be an engine a
            monitor can schedule.
        - name: prompt
          in: query
          required: false
          schema:
            type: string
            maxLength: 2000
          description: >-
            Restrict every section to one exact prompt. Rows are keyed by the
            prompt text, so a prompt removed by a later edit stays queryable.
      responses:
        '200':
          description: Report for the window and the equal interval immediately before it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitorAnalyticsResponse'
        '400':
          description: >-
            Invalid window or filter, or a report too large to aggregate (narrow
            the window, engine or prompt).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error:
                  code: VALIDATION_ERROR
                  message: The window must be positive and at most 90 days
                  timestamp: '2026-09-22T04:12:00.000Z'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    MonitorAnalyticsResponse:
      type: object
      required:
        - success
        - data
      properties:
        success:
          type: boolean
          const: true
        data:
          description: >-
            The shape follows data.monitor.mode: BRAND (the default) returns the
            brand report, CATEGORY returns the category report.
          oneOf:
            - $ref: '#/components/schemas/MonitorBrandAnalytics'
            - $ref: '#/components/schemas/MonitorCategoryAnalytics'
    ErrorResponse:
      type: object
      required:
        - success
        - error
      properties:
        success:
          type: boolean
          const: false
        error:
          $ref: '#/components/schemas/ErrorDetail'
    MonitorBrandAnalytics:
      type: object
      description: >-
        The report of a BRAND monitor (data.monitor.mode is BRAND, the default):
        your brand against its competitors.
      required:
        - monitor
        - window
        - filters
        - stats
        - previous
        - changes
        - engineRates
        - series
        - brands
        - voiceSeries
        - prompts
        - opportunities
        - pauses
        - quality
        - health
        - healthScope
      properties:
        monitor:
          $ref: '#/components/schemas/Monitor'
        window:
          $ref: '#/components/schemas/MonitorAnalyticsWindow'
        filters:
          $ref: '#/components/schemas/MonitorAnalyticsFilters'
        stats:
          $ref: '#/components/schemas/MonitorRate'
        previous:
          $ref: '#/components/schemas/MonitorRate'
        changes:
          $ref: '#/components/schemas/MonitorChanges'
        engineRates:
          type: array
          items:
            $ref: '#/components/schemas/MonitorEngineRate'
        series:
          type: array
          items:
            $ref: '#/components/schemas/MonitorSeriesPoint'
        brands:
          type: array
          items:
            $ref: '#/components/schemas/MonitorBrand'
          description: >-
            Your brand and every tracked competitor, most mentions first. Each
            carries its own sampleSize, so a rate is always read against the
            answers it was measured over, and a newly configured competitor with
            no qualifying answers reports a null rate rather than 0%.
        voiceSeries:
          type: array
          items:
            $ref: '#/components/schemas/MonitorVoicePoint'
        prompts:
          type: array
          items:
            $ref: '#/components/schemas/MonitorPromptRow'
          description: Per-prompt totals, weakest mention rate first.
        opportunities:
          type: array
          items:
            $ref: '#/components/schemas/MonitorCell'
          description: >-
            Cells where a competitor was named and your brand was not, most
            misses first. The next content decision usually comes from the top
            of this list.
        pauses:
          type: array
          items:
            $ref: '#/components/schemas/MonitorPause'
          description: >-
            The pauses that overlap the window, oldest first and capped at 200,
            so a chart can stop at them.
        quality:
          $ref: '#/components/schemas/MonitorQuality'
        health:
          $ref: '#/components/schemas/MonitorHealth'
        healthScope:
          type: string
          const: recent_visible_tasks
          description: >-
            health is a separate recent-tasks scope on purpose: it is never part
            of the report denominator.
    MonitorCategoryAnalytics:
      type: object
      description: >-
        The report of a CATEGORY monitor (data.monitor.mode is CATEGORY). It has
        no brand of its own, so it ranks the brands the answers name. Every rate
        is 0 to 100, and the window, filters and quality rules are the brand
        report's. The brand sections (engineRates, series, brands, voiceSeries,
        prompts, opportunities) are replaced by category.
      required:
        - monitor
        - window
        - filters
        - stats
        - previous
        - changes
        - category
        - pauses
        - quality
        - health
        - healthScope
      properties:
        monitor:
          $ref: '#/components/schemas/Monitor'
        window:
          $ref: '#/components/schemas/MonitorAnalyticsWindow'
        filters:
          $ref: '#/components/schemas/MonitorAnalyticsFilters'
        stats:
          $ref: '#/components/schemas/MonitorCategoryStats'
        previous:
          $ref: '#/components/schemas/MonitorCategoryStats'
        changes:
          type: object
          description: >-
            Percentage-point change of namedRate against the previous interval.
            null when the comparison is not sound: see quality.comparable.
          properties:
            namedRatePp:
              type:
                - number
                - 'null'
        category:
          $ref: '#/components/schemas/MonitorCategoryReport'
        pauses:
          type: array
          items:
            $ref: '#/components/schemas/MonitorPause'
          description: >-
            The pauses that overlap the window, oldest first and capped at 200,
            so a chart can stop at them.
        quality:
          $ref: '#/components/schemas/MonitorQuality'
        health:
          $ref: '#/components/schemas/MonitorHealth'
        healthScope:
          type: string
          const: recent_visible_tasks
    ErrorDetail:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: Stable, safe to branch on. See the Errors guide for the full list.
        message:
          type: string
          description: For humans. May change.
        details:
          description: >-
            Context for the error. An array of `{field, message}` on most
            `VALIDATION_ERROR`s; an object elsewhere (for example `{id}` on
            `RESOURCE_NOT_FOUND`, `retryAfterSec` on 429 and 503 codes). Omitted
            when there is nothing to add.
          oneOf:
            - type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
            - type: object
              additionalProperties: true
        timestamp:
          type: string
          format: date-time
    Monitor:
      type: object
      description: One named prompt set in one market, and the schedule that repeats it.
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
          maxLength: 80
        mode:
          type: string
          enum:
            - BRAND
            - CATEGORY
          default: BRAND
          description: >-
            What the monitor measures, fixed at creation. BRAND follows one
            brand and its competitors. CATEGORY follows a market with no brand
            of its own and ranks every brand the answers name.
        category:
          type:
            - string
            - 'null'
          maxLength: 80
          description: >-
            CATEGORY only: the market the monitor follows. null on a BRAND
            monitor.
        promptTopics:
          type: object
          additionalProperties:
            type: string
            maxLength: 60
          description: >-
            CATEGORY only: each prompt's sub-field, keyed by the prompt's exact
            text. A prompt without an entry covers the whole category. Empty on
            a BRAND monitor.
        engines:
          type: array
          items:
            $ref: '#/components/schemas/MonitorEngine'
          description: >-
            Each engine that joins a run submits one task per prompt, per point
            and per sample.
        prompts:
          type: array
          items:
            type: string
            maxLength: 2000
          description: >-
            The exact question texts the monitor asks, stored verbatim. Scored
            rows are keyed by this text, so editing the list does not rewrite
            history.
        aliases:
          type: array
          maxItems: 20
          items:
            type: string
          description: >-
            Spellings of your brand matched against the answer text. Matching
            ignores case and character width: Latin-script names match whole
            words, and Korean, Japanese, Chinese and Thai names match anywhere
            in the text. Empty on a CATEGORY monitor.
        domains:
          type: array
          maxItems: 20
          items:
            type: string
          description: >-
            Hosts matched against the answer citations; a registered domain also
            matches its subdomains. Empty means citations are not tracked and
            cited is always false. Always empty on a CATEGORY monitor.
        country:
          type: string
          description: >-
            Two-letter country code passed to every task. It selects the market
            the engines answer for; it does not translate the prompts.
        intervalHours:
          type: integer
          minimum: 1
          maximum: 168
          description: Hours between scheduled runs.
        enabled:
          type: boolean
          description: >-
            false pauses the schedule without deleting the monitor or its
            history.
        alertBelowPct:
          type:
            - integer
            - 'null'
          minimum: 1
          maximum: 100
          description: >-
            Email when the recent mention rate falls below this percentage. null
            means the alert is off, and it is always null on a CATEGORY monitor.
        competitors:
          type: array
          maxItems: 50
          description: >-
            BRAND: up to 10 you added, then up to 15 the competitor read found
            in this monitor's answers. CATEGORY: up to 25 you added, then up to
            25 the read found, and the whole list is the roster the report
            ranks.
          items:
            $ref: '#/components/schemas/MonitorCompetitor'
        competitorsReadAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the competitor read last ran. It runs once the first run is in,
            then every 7 days when the monitor has run since. null until then.
        nextRunAt:
          type: string
          format: date-time
          description: >-
            When the next run becomes due. A run is admitted by the next sweep
            tick, not at this instant.
        lastRunAt:
          type:
            - string
            - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        location:
          oneOf:
            - $ref: '#/components/schemas/LocationPoint'
            - type: 'null'
          description: >-
            Ask every task from this point (ChatGPT, Gemini, Google AI Overview
            and AI Mode only). Exclusive with grid; setting one clears the
            other, null asks for the whole country.
        grid:
          oneOf:
            - $ref: '#/components/schemas/GridSpec'
            - type: 'null'
          description: >-
            Ask every prompt and engine from each point of this grid. Each
            engine in a run adds prompts × size² × its samples tasks; the first
            run, which every engine joins, must stay within the account's
            tasksPerRun limit.
        engineSettings:
          allOf:
            - $ref: '#/components/schemas/MonitorEngineSettings'
        webhookUrl:
          type:
            - string
            - 'null'
          description: Where change events are posted, or null when they are off.
        analysis:
          type: boolean
          description: >-
            Ask every task for `include.analysis` with this monitor's names,
            domains and competitors. 2 extra credits per analyzed task.
    MonitorAnalyticsWindow:
      type: object
      description: >-
        The window the report covers, half-open in UTC, and the equal interval
        immediately before it. previousUntil is always this window's since.
      properties:
        since:
          type: string
          format: date-time
        until:
          type: string
          format: date-time
        previousSince:
          type: string
          format: date-time
        previousUntil:
          type: string
          format: date-time
        timezone:
          type: string
          const: UTC
          description: Days, including the partial-day flags, are UTC days.
        bounds:
          type: string
          const: '[since, until)'
    MonitorAnalyticsFilters:
      type: object
      description: >-
        The filters that were applied to every section, echoed back resolved:
        engine is the canonical id even when an alias was passed, and null means
        no filter.
      properties:
        engine:
          type:
            - string
            - 'null'
        prompt:
          type:
            - string
            - 'null'
    MonitorRate:
      type: object
      description: >-
        Counts plus their percentages. mentionRate is 100 x mentioned / runs; a
        null rate means there were no scored answers in the sample, which is not
        the same as a rate of zero.
      required:
        - runs
        - mentioned
        - cited
        - competitorOnly
        - mentionRate
        - citationRate
        - competitorOnlyRate
      properties:
        runs:
          type: integer
          description: >-
            Scored answers in the sample. Completed observations that produced
            no answer are counted here as not mentioned; failed tasks are not
            counted at all.
        mentioned:
          type: integer
        cited:
          type: integer
        competitorOnly:
          type: integer
          description: >-
            Answers that named a configured competitor while your brand was
            absent. This is the competitive-gap count, and the unit of
            opportunities.
        mentionRate:
          type:
            - number
            - 'null'
        citationRate:
          type:
            - number
            - 'null'
        competitorOnlyRate:
          type:
            - number
            - 'null'
    MonitorChanges:
      type: object
      description: >-
        Percentage-point change against the previous interval. Both fields are
        null when the comparison is not sound - no answers in one of the periods
        (insufficient_periods), rows scored before scoring context existed
        (legacy_scoring_unknown), or a definition that changed between the
        periods (scoring_definitions_changed). See quality.comparable.
      properties:
        mentionRatePp:
          type:
            - number
            - 'null'
        citationRatePp:
          type:
            - number
            - 'null'
    MonitorEngineRate:
      allOf:
        - $ref: '#/components/schemas/MonitorRate'
        - type: object
          properties:
            engine:
              $ref: '#/components/schemas/MonitorEngine'
      description: >-
        One engine's rates inside the current window, so a weak engine is
        visible without reading the time series.
    MonitorSeriesPoint:
      allOf:
        - $ref: '#/components/schemas/MonitorRate'
        - type: object
          properties:
            day:
              type: string
              description: UTC day, YYYY-MM-DD.
            engine:
              $ref: '#/components/schemas/MonitorEngine'
            partial:
              type: boolean
              description: >-
                True when this UTC day is only partly inside the window. A
                partial day's lower count is arithmetic, not a decline, so
                dashboards should mark it instead of plotting it as a drop.
    MonitorBrand:
      type: object
      description: >-
        One tracked brand in the current window. __you__ is your own brand.
        mentionRate divides by this brand's own sampleSize, not by the window
        total: a competitor is measured only over the answers that were scored
        while it was on the monitor, so adding one today cannot be diluted by
        rows collected before it existed. shareOfVoice is 100 x mentions / every
        tracked brand mention in the window, so the shares of one window add to
        100; it is a share of the answers you collected for these prompts, not a
        share of any market. previous* are null when the comparison is not
        sound.
      required:
        - name
        - mentions
        - sampleSize
        - mentionRate
        - shareOfVoice
        - previousMentionRate
        - previousShareOfVoice
        - configured
      properties:
        name:
          type: string
        mentions:
          type: integer
        sampleSize:
          type: integer
          description: >-
            Scored answers this brand was measured over: every scored answer for
            __you__, and for a competitor only those scored while it was in the
            monitor's roster. 0 means the brand is configured but nothing in
            this window measured it, which is why its mentionRate is null
            instead of 0%.
        mentionRate:
          type:
            - number
            - 'null'
          description: >-
            100 x mentions / sampleSize. null when sampleSize is 0: a brand with
            no qualifying answers has no rate, and reporting one as 0% would
            read as a real disappearance.
        shareOfVoice:
          type:
            - number
            - 'null'
          description: null when this brand has neither a qualifying sample nor a mention.
        previousMentionRate:
          type:
            - number
            - 'null'
          description: >-
            null when the comparison is withheld, or when the brand had no
            qualifying sample in the previous interval either.
        previousShareOfVoice:
          type:
            - number
            - 'null'
          description: >-
            null when the comparison is withheld, or when the previous interval
            had no qualifying sample for this brand.
        configured:
          type: boolean
          description: >-
            True for your brand and for any competitor currently configured on
            the monitor; false for a name that is no longer configured but still
            appears in this window's history.
    MonitorVoicePoint:
      type: object
      description: >-
        One brand on one UTC day of the current window. mentionRate divides by
        that day's answers that actually measured the brand, so a competitor
        added mid-window has a null rate on the days before it was configured.
      properties:
        day:
          type: string
        name:
          type: string
        mentions:
          type: integer
        runs:
          type: integer
        mentionRate:
          type:
            - number
            - 'null'
        shareOfVoice:
          type:
            - number
            - 'null'
    MonitorPromptRow:
      allOf:
        - $ref: '#/components/schemas/MonitorRate'
        - type: object
          properties:
            prompt:
              type: string
            previous:
              $ref: '#/components/schemas/MonitorRate'
            engines:
              type: array
              items:
                $ref: '#/components/schemas/MonitorCell'
      description: >-
        One prompt's totals in the current window, weakest mention rate first,
        with its per-engine cells.
    MonitorCell:
      type: object
      description: >-
        One prompt x engine cell in the current window, with the same cell in
        the previous interval for comparison. Each task id is the latest answer
        of its kind: evidenceTaskId named a competitor and not your brand,
        mentionTaskId named your brand, latestTaskId is any answer.
      properties:
        prompt:
          type: string
        engine:
          $ref: '#/components/schemas/MonitorEngine'
        runs:
          type: integer
        mentioned:
          type: integer
        cited:
          type: integer
        competitorOnly:
          type: integer
        mentionRate:
          type:
            - number
            - 'null'
        citationRate:
          type:
            - number
            - 'null'
        competitorOnlyRate:
          type:
            - number
            - 'null'
        previous:
          $ref: '#/components/schemas/MonitorRate'
        mentionRateChangePp:
          type:
            - number
            - 'null'
        topCompetitor:
          type:
            - string
            - 'null'
          description: >-
            The competitor mentioned most often in this cell, or null if none
            was.
        topCompetitorRate:
          type:
            - number
            - 'null'
        evidenceTaskId:
          type:
            - string
            - 'null'
          description: >-
            The latest answer that named a competitor and not your brand. Safe
            to request from GET /v1/monitors/{id}/answers/{taskId}.
        mentionTaskId:
          type:
            - string
            - 'null'
          description: The latest answer that named your brand, or null if none did.
        latestTaskId:
          type:
            - string
            - 'null'
          description: The latest answer of the cell.
    MonitorPause:
      type: object
      description: >-
        A period the schedule was paused. resumedAt is null while the monitor is
        still paused.
      required:
        - pausedAt
        - resumedAt
      properties:
        pausedAt:
          type: string
          format: date-time
        resumedAt:
          type:
            - string
            - 'null'
          format: date-time
    MonitorQuality:
      type: object
      description: >-
        What the sample is made of, and what cannot be said with it. Read this
        before presenting a number: it is where a withheld comparison, a partial
        UTC day, or a low sample is declared instead of silently rendered.
      properties:
        comparable:
          type: boolean
          description: False when changes is withheld.
        comparisonReason:
          type:
            - string
            - 'null'
          enum:
            - insufficient_periods
            - legacy_scoring_unknown
            - scoring_definitions_changed
            - null
          description: >-
            Why a comparison is unavailable: no answers in one period, rows
            scored before scoring context was stored, or a scoring definition
            that changed between the periods.
        scoringVersions:
          type: array
          items:
            type: string
          description: >-
            The scoring definitions present in the rows read, or legacy for rows
            scored before versions were stored.
        noAnswerObservations:
          type: integer
          description: >-
            Completed observations whose answer text was empty. They count as
            not mentioned and stay in the denominator.
        unknownObservations:
          type: integer
          description: >-
            Rows whose observation state predates scoring context
            (scoringContext null).
        noAnswerIncluded:
          type: boolean
          const: true
        historicalFailures:
          type: 'null'
          description: >-
            Always null: a failed task writes no scored row and is never
            reconstructed as an absence. Failures are reported in health
            instead, for the tasks that are still visible.
        sampleSize:
          type: integer
          description: Scored answers in the current window.
        previousSampleSize:
          type: integer
        configuredCells:
          type: integer
          description: prompts x engines for this monitor, after the filters.
        observedCells:
          type: integer
          description: >-
            Configured cells that actually produced scored answers in this
            window.
        missingCells:
          type: integer
        lowSample:
          type: boolean
          description: True below 30 scored answers, where a rate is still noise.
        partialDays:
          type: array
          items:
            type: string
          description: UTC days only partly inside the window.
        denominator:
          type: string
          const: scored_answers
          description: What mentionRate and citationRate divide by.
        shareOfVoiceDenominator:
          type: string
          const: tracked_brand_mentions
          description: >-
            What brands[].shareOfVoice divides by, so it is not the answer
            count.
        trackedBrandMentions:
          type: integer
        answerTextLimit:
          type: integer
          const: 8000
        scoring:
          type: string
          const: collection_time_definitions
          description: >-
            Historical rows keep the definitions they were scored with; changing
            aliases or competitors does not rewrite them.
        failedTasksIncluded:
          type: boolean
          const: false
    MonitorHealth:
      type: object
      description: >-
        Run health for tasks that are still individually visible, which covers
        the latest run at every cadence this product sells. A failed task writes
        no scored row, so this is the only place failures appear - a report that
        silently stopped growing looks identical to one whose engine broke.
      required:
        - completed
        - failed
        - pending
        - topError
      properties:
        completed:
          type: integer
        failed:
          type: integer
        pending:
          type: integer
          description: Queued or still processing.
        topError:
          type:
            - string
            - 'null'
          description: The most common failure code in this window, or null.
    MonitorCategoryStats:
      type: object
      description: >-
        Scored answers in a period and how many of them named at least one
        tracked brand. namedRate is 100 x named / runs, or null when there were
        no scored answers.
      required:
        - runs
        - named
        - namedRate
      properties:
        runs:
          type: integer
        named:
          type: integer
          description: Answers that name at least one brand on the monitor's list.
        namedRate:
          type:
            - number
            - 'null'
    MonitorCategoryReport:
      type: object
      description: >-
        A category monitor's ranking. Every figure counts answers that name a
        brand, so it says which brands the engines name most for the monitor's
        questions.
      required:
        - name
        - brands
        - topics
        - engines
        - series
        - prompts
      properties:
        name:
          type:
            - string
            - 'null'
          description: The category the monitor follows.
        brands:
          type: array
          items:
            $ref: '#/components/schemas/MonitorCategoryBrand'
          description: >-
            Every brand on the monitor's list and every other brand the answers
            named in the window, most answers first. A brand no answer named has
            rank null.
        topics:
          type: array
          description: >-
            One row per sub-field, in the order the monitor asks them. topic
            null is the prompts that cover the whole category.
          items:
            type: object
            properties:
              topic:
                type:
                  - string
                  - 'null'
              prompts:
                type: integer
              runs:
                type: integer
              named:
                type: integer
              namedRate:
                type:
                  - number
                  - 'null'
              leaders:
                type: array
                maxItems: 3
                items:
                  $ref: '#/components/schemas/MonitorLeader'
                description: The brands named most in this sub-field.
        engines:
          type: array
          description: One row per engine that produced answers in the window.
          items:
            type: object
            properties:
              engine:
                $ref: '#/components/schemas/MonitorEngine'
              runs:
                type: integer
              named:
                type: integer
              namedRate:
                type:
                  - number
                  - 'null'
              leaders:
                type: array
                maxItems: 3
                items:
                  $ref: '#/components/schemas/MonitorLeader'
                description: The brands this engine names most.
        series:
          type: array
          description: Per UTC day, the five leading brands on the monitor's list.
          items:
            type: object
            properties:
              day:
                type: string
                description: UTC day, YYYY-MM-DD.
              name:
                type: string
              mentions:
                type: integer
              sampleSize:
                type: integer
              runs:
                type: integer
                description: All scored answers of the day.
              mentionRate:
                type:
                  - number
                  - 'null'
              partial:
                type: boolean
                description: True when this UTC day is only partly inside the window.
        prompts:
          type: array
          description: >-
            One row per prompt, in the order the monitor asks them, then prompts
            that were removed but still have answers in the window.
          items:
            type: object
            properties:
              prompt:
                type: string
              topic:
                type:
                  - string
                  - 'null'
              retired:
                type: boolean
                description: True for a prompt the monitor no longer asks.
              runs:
                type: integer
              named:
                type: integer
              namedRate:
                type:
                  - number
                  - 'null'
              leaders:
                type: array
                maxItems: 3
                items:
                  $ref: '#/components/schemas/MonitorLeader'
              engines:
                type: array
                items:
                  type: object
                  properties:
                    engine:
                      $ref: '#/components/schemas/MonitorEngine'
                    runs:
                      type: integer
                    named:
                      type: integer
                    evidenceTaskId:
                      type:
                        - string
                        - 'null'
                      description: >-
                        An answer of this cell that named a brand, to open with
                        GET /v1/monitors/{id}/answers/{taskId}.
    MonitorEngine:
      type: string
      description: >-
        An engine a monitor can schedule: the prompt surfaces sold to customers
        plus the deprecated NAVER alias. GOOGLE_AIO and GOOGLE_AIMODE are
        accepted as input aliases and echoed as GOOGLE and AIMODE.
        CITATION_ANALYSIS is an analysis task, not a prompt surface, and cannot
        be scheduled on a monitor.
      enum:
        - CHATGPT
        - GEMINI
        - PERPLEXITY
        - GOOGLE
        - AIMODE
        - NAVER_AI_BRIEF
        - NAVER_AI_TAB
        - NAVER
    MonitorCompetitor:
      type: object
      description: >-
        A brand scored alongside yours in the same answers. The name is always
        one of its own aliases, so a bare name matches reliably.
      required:
        - name
      properties:
        name:
          type: string
          maxLength: 80
          description: __you__ is reserved for your own brand.
        aliases:
          type: array
          maxItems: 20
          items:
            type: string
          description: Other spellings of the same brand. The name is added automatically.
        source:
          type: string
          enum:
            - user
            - auto
          readOnly: true
          description: >-
            user: you added it. auto: the weekly competitor read found it in the
            monitor's own answers. Entries you send with source auto are
            ignored, so a monitor read and written back keeps its found
            competitors.
        domain:
          type: string
          readOnly: true
          description: The competitor's site, when the competitor read found one.
    LocationPoint:
      type: object
      additionalProperties: false
      required:
        - latitude
        - longitude
      properties:
        latitude:
          type: number
          minimum: -90
          maximum: 90
        longitude:
          type: number
          minimum: -180
          maximum: 180
      example:
        latitude: 37.4979
        longitude: 127.0276
    GridSpec:
      type: object
      additionalProperties: false
      required:
        - center
        - size
        - radiusMeters
      description: >-
        A square grid of points. Row 0 is the north edge and column 0 the west
        edge; points sit 2 × radiusMeters ÷ (size − 1) apart.
      properties:
        center:
          $ref: '#/components/schemas/LocationPoint'
        size:
          type: integer
          enum:
            - 3
            - 5
            - 7
            - 9
          description: Points per side. Odd, so the center is one of the points.
        radiusMeters:
          type: number
          minimum: 100
          maximum: 50000
          description: Distance from the center to the middle of each edge.
    MonitorEngineSettings:
      type: object
      description: >-
        Per-engine cadence and answers per prompt, keyed by engine. An engine
        without an entry joins every run once. Values equal to the defaults are
        dropped, and an update that removes an engine removes its entry.
      additionalProperties:
        type: object
        additionalProperties: false
        properties:
          intervalHours:
            type: integer
            minimum: 1
            maximum: 168
            description: >-
              A multiple of the monitor's intervalHours. The engine joins every
              k-th run, counting from the first run, which every engine joins.
          samples:
            type: integer
            minimum: 1
            maximum: 10
            description: >-
              Answers per prompt and point in each run, each its own task in its
              own session. Default 1.
      example:
        CHATGPT:
          samples: 5
        GOOGLE:
          intervalHours: 168
    MonitorCategoryBrand:
      type: object
      description: >-
        One tracked brand in the current window. mentionRate divides by this
        brand's own sampleSize, the answers scored while it was on the monitor's
        list, so adding a brand today cannot be diluted by answers collected
        before it existed. shareOfVoice is 100 x mentions / every tracked brand
        mention in the window, so the shares of one window add to 100.
      required:
        - name
        - rank
        - mentions
        - sampleSize
        - mentionRate
        - shareOfVoice
        - previousMentionRate
        - previousShareOfVoice
        - changePp
        - configured
      properties:
        name:
          type: string
        rank:
          type:
            - integer
            - 'null'
          description: >-
            Place among the brands the answers named, by the number of answers
            naming the brand. null when no answer in the window named it.
        mentions:
          type: integer
          description: Answers that named the brand.
        sampleSize:
          type: integer
          description: >-
            Answers scored while the brand was on the monitor's list: the
            denominator of mentionRate.
        mentionRate:
          type:
            - number
            - 'null'
          description: 100 x mentions / sampleSize. null when sampleSize is 0.
        shareOfVoice:
          type:
            - number
            - 'null'
          description: null when no tracked brand was named in the window.
        previousMentionRate:
          type:
            - number
            - 'null'
          description: >-
            null when the comparison is withheld or the brand had no sample in
            the previous interval.
        previousShareOfVoice:
          type:
            - number
            - 'null'
        changePp:
          type:
            - number
            - 'null'
          description: >-
            mentionRate minus previousMentionRate, in points. null when either
            is null.
        configured:
          type: boolean
          description: >-
            True while the brand is on the monitor's list; false for a brand
            that left the list but was named in this window.
    MonitorLeader:
      type: object
      description: >-
        The brand a set of answers named most. mentionRate divides by
        sampleSize, the answers scored while the brand was on the monitor's
        list.
      properties:
        name:
          type: string
        mentions:
          type: integer
          description: Answers that named the brand.
        sampleSize:
          type: integer
          description: Answers scored while the brand was on the monitor's list.
        mentionRate:
          type:
            - number
            - 'null'
          description: 100 x mentions / sampleSize.
  responses:
    Unauthorized:
      description: Missing or invalid bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: MISSING_API_KEY
              message: Missing or invalid API key
              timestamp: '2026-07-09T04:12:00.000Z'
    NotFound:
      description: >-
        No monitor with that id for this key, or no scored row with that task
        id. A monitor owned by another account is reported the same way rather
        than as a 403.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: NOT_FOUND
              message: No monitor with that id
              timestamp: '2026-09-22T04:12:00.000Z'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Your API key, sent as `Authorization: Bearer <key>`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.