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

# Fan-out query aggregation

> > **[BETA]** This is a beta API. The response spec may change without notice.

Aggregates the search queries (fan-out) that the AI actually issued while generating answers.

- `fanouts` is a ranking that contains only the top `limit` queries by fan-out occurrence count (`fanoutCount`) in descending order. It is not paginated.
- The total fan-out occurrence count across the whole query scope (`totalFanouts`) is returned as well.
- Distinct model and region lists per query are included only when requested with `include=models` or `include=regions`.
- Fan-outs are collected only from CHATGPT · PERPLEXITY · CLAUDE · META_MUSE · BAIDU_AI_SEARCH · GROK · BAIDU_AI_TAB · DEEPSEEK answers. Other models always return empty results.

### Errors

| HTTP | Code | Description |
| --- | --- | --- |
| 400 | `COMMON_VALIDATION` | • Both runIDs and promptIDs missing • Too many runIDs (max 5) or promptIDs (max 10) • limit out of range (1 to 200) • Unsupported model or include value |
| 400 | `COMMON_BINDING` | Invalid runIDs or promptIDs format (`PLATFORM_INVALID_ID` in details) |
| 401 | `COMMON_UNAUTHORIZED` | API key or access token is missing or invalid |
| 402 | `INSUFFICIENT_CREDITS` | Organization credit balance is lower than the unit price of this request |
| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | Rate limit exceeded. Wait for the number of seconds in the `Retry-After` header, then retry |
| 500 | — | Internal server error. Returns `message` and `requestID` without `code` |

See the [Analyzing with statistics](https://docs.trychainshift.ai/en/guides/analytics.md#fan-out-query-aggregation) guide for the fan-out concept and real examples, and [Supported models](https://docs.trychainshift.ai/en/models.md) for per-model support.


## OpenAPI

````yaml openapi.en.json GET /v1beta/platform/fanouts/statistics
openapi: 3.1.0
info:
  description: >-
    Platform API for external partners. Uses organization API key based
    authentication.

    ### Common request limits

    - The request body size is limited to 2MiB. Exceeding it returns 413 with
    the `COMMON_REQUEST_BODY_TOO_LARGE` code.

    - Array parameters and string fields have per-endpoint count and length
    limits. The limits are stated in each field or parameter description, and
    violating them returns 400 with the `COMMON_VALIDATION` code.

    ### Error responses

    The error response body always has the same three fields regardless of the
    status code.

    | Field | Type | Meaning |

    | --- | --- | --- |

    | `code` | string | A fixed identifier for the error type. This is the only
    value clients should branch on. The codes each endpoint returns are listed
    in the "Errors" table of that API. |

    | `message` | string | A human-readable, one-line summary of the whole
    error. There is always exactly one. |

    | `details` | array of strings | Individual reasons that do not fit in the
    single `message` line. Even a single reason is returned as an array of
    length 1, and the field is omitted when there is nothing to include. |

    - `details` is an array in every error. It is never returned as a string or
    an object, so no type-based branching is needed.

    - The wording of `details` is not a fixed contract. Use it only for display
    and debugging, and do not parse the strings to branch. Branch on `code`
    instead.

    - `details` is the only field that carries multiple reasons. There is no
    `messages` field in the response.

    - On validation failure (`COMMON_VALIDATION`), `details` contains one
    `"field: reason"` line per violated field. Example:
    `{"code":"COMMON_VALIDATION","message":"Data validation
    failed","details":["keywords: up to 100 items can be entered"]}`

    - `message` defaults to Korean and is returned in English when you send
    `Accept-Language: en`. `details` follows the same rule when it carries
    per-field reasons such as validation failures, but errors that include raw
    text for diagnostic purposes may contain wording in a language other than
    the requested one.

    - Only 500 has a different shape. It returns `message` and a `requestID` to
    reference when contacting support, without `code`.
  title: Platform API
  version: '1.0'
servers:
  - url: https://platform-api.trychainshift.ai/api
security: []
tags:
  - description: >-
      The top-level account unit that API keys belong to. Retrieve the
      organization's basic information.
    name: Organization
  - description: >-
      A target brand whose exposure in AI services is monitored. Provides brand
      registration, retrieval, update, and deletion.
    name: Brand
  - description: >-
      Keyword intelligence for analyzing brands and markets. Provides Google and
      Naver search metrics, related and autocomplete keyword lookups, and site
      URL based keyword analysis.
    name: Keyword (Beta)
  - description: >-
      A group that organizes prompts by purpose. Provides create, get, update,
      and delete operations for prompt sets.
    name: PromptSet
  - description: >-
      A sentence-level unit of a query sent to an AI service. Provides prompt
      create, get, update, and delete, plus bulk creation.
    name: Prompt
  - description: AI service models used for prompt runs. Lists the supported models.
    name: Model
  - description: The region used to run prompts. Retrieves the list of supported regions.
    name: Region
  - description: >-
      The unit of work that actually runs prompts against AI services. Provides
      prompt run requests and retrieval of progress status and lists.
    name: Run
  - description: >-
      An AI service response collected by a run. Retrieves answers including
      sources and search queries.
    name: Answer
  - description: >-
      Statistics on the sources cited in answers, at the domain and URL level.
      Retrieve the citation summary and per-domain and per-URL citation
      statistics.
    name: SourceStatistics (Beta)
  - description: >-
      Statistics on tokens (Kiwi nouns) in answer bodies. Retrieves a ranking of
      the most frequent tokens and the tokens near a specific word.
    name: AnswerStatistics (Beta)
  - description: >-
      Statistics on the search queries (fan-outs) the AI actually issued while
      generating answers. Retrieves a ranking of search queries by occurrence
      count.
    name: FanoutStatistics (Beta)
  - description: >-
      An auxiliary feature that identifies proper nouns in text. Provides proper
      noun extraction.
    name: ProperNoun (Beta)
  - description: >-
      Organization credit balance and Platform API billing information.
      Retrieves the current credit balance.
    name: Credit
externalDocs:
  description: ''
  url: ''
paths:
  /v1beta/platform/fanouts/statistics:
    get:
      tags:
        - FanoutStatistics (Beta)
      summary: Get fan-out (search query) statistics
      description: >-
        > **[BETA]** This is a beta API. The response spec may change without
        notice.


        Aggregates the search queries (fan-out) that the AI actually issued
        while generating answers.


        - `fanouts` is a ranking that contains only the top `limit` queries by
        fan-out occurrence count (`fanoutCount`) in descending order. It is not
        paginated.

        - The total fan-out occurrence count across the whole query scope
        (`totalFanouts`) is returned as well.

        - Distinct model and region lists per query are included only when
        requested with `include=models` or `include=regions`.

        - Fan-outs are collected only from CHATGPT · PERPLEXITY · CLAUDE ·
        META_MUSE · BAIDU_AI_SEARCH · GROK · BAIDU_AI_TAB · DEEPSEEK answers.
        Other models always return empty results.


        ### Errors


        | HTTP | Code | Description |

        | --- | --- | --- |

        | 400 | `COMMON_VALIDATION` | • Both runIDs and promptIDs missing • Too
        many runIDs (max 5) or promptIDs (max 10) • limit out of range (1 to
        200) • Unsupported model or include value |

        | 400 | `COMMON_BINDING` | Invalid runIDs or promptIDs format
        (`PLATFORM_INVALID_ID` in details) |

        | 401 | `COMMON_UNAUTHORIZED` | API key or access token is missing or
        invalid |

        | 402 | `INSUFFICIENT_CREDITS` | Organization credit balance is lower
        than the unit price of this request |

        | 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | Rate limit exceeded. Wait for
        the number of seconds in the `Retry-After` header, then retry |

        | 500 | — | Internal server error. Returns `message` and `requestID`
        without `code` |
      operationId: listFanoutStatistics
      parameters:
        - description: >-
            Prompt run filter (IDs issued when the run request was made,
            repeatable, up to 5; multiple values are combined as a union). At
            least one of runIDs or promptIDs is required
          example: S8cqDSjSot67bCK6YtmvHw
          in: query
          name: runIDs
          schema:
            items:
              type: string
            type: array
          style: form
        - description: >-
            Prompt filter (the id from the prompt list or create response,
            repeatable, up to 10; multiple values are combined as a union). At
            least one of runIDs or promptIDs is required
          example: KNUETdAfRhDY9lQTgu9wuw
          in: query
          name: promptIDs
          schema:
            items:
              type: string
            type: array
          style: form
        - description: Model filter. Only models retrievable from GET /models are allowed
          example: CHATGPT
          in: query
          name: model
          schema:
            enum:
              - CHATGPT
              - GOOGLE_OVERVIEW
              - GOOGLE_AI
              - PERPLEXITY
              - GEMINI
              - NAVER_AI_BRIEFING
              - NAVER_AI_TAB
              - CLAUDE
              - META_MUSE
              - BAIDU_AI_SEARCH
              - GROK
              - BAIDU_AI_TAB
              - DEEPSEEK
            type: string
        - description: >-
            Additional fields to include. models=distinct model list per query,
            regions=distinct region list per query
          example: models
          in: query
          name: include
          schema:
            items:
              type: string
            type: array
          style: form
        - description: Number of top queries to return (default 50, maximum 200)
          example: 50
          in: query
          name: limit
          schema:
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/domain.ListFanoutStatisticsResponse'
          description: OK
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/domain.ValidationError'
          description: >-
            Both runIDs and promptIDs missing, runIDs count (5) or promptIDs
            count (10) exceeded, limit out of range (1 to 200), unsupported
            model or include value
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/domain.UnauthorizedError'
          description: API key or access token is missing or invalid
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/domain.InsufficientCreditsError'
          description: >-
            The organization's credit balance is lower than the unit price of
            this request
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/domain.RateLimitExceededError'
          description: >-
            Rate limit exceeded. Wait the number of seconds in the Retry-After
            header, then retry
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/domain.InternalServerError'
          description: >-
            Internal server error. Include the requestID in your report so it
            can be traced
      security:
        - OrgAPIKeyAuth: []
components:
  schemas:
    domain.ListFanoutStatisticsResponse:
      properties:
        fanouts:
          description: >-
            Search query ranking by occurrence count in descending order (top
            limit items)
          items:
            $ref: '#/components/schemas/domain.FanoutStatisticDTO'
          type: array
          uniqueItems: false
        totalFanouts:
          description: >-
            Total number of fan-out occurrences in the scope (each occurrence of
            the same query counts as 1). The denominator for fanoutCount in
            ranking items
          example: 128
          type: integer
      type: object
    domain.ValidationError:
      properties:
        code:
          description: Error code
          example: COMMON_VALIDATION
          type: string
        details:
          description: 'List of reasons per violating field (one "field: reason" per line)'
          example:
            - 'limit: must be 100 or less'
          items:
            type: string
          type: array
          uniqueItems: false
        message:
          description: >-
            Error message (Korean by default, English when Accept-Language: en
            is specified)
          example: Data validation failed
          type: string
      type: object
    domain.UnauthorizedError:
      properties:
        code:
          description: Error code
          example: COMMON_UNAUTHORIZED
          type: string
        message:
          description: >-
            Error message (Korean by default, English when Accept-Language: en
            is specified)
          example: Unauthenticated user
          type: string
      type: object
    domain.InsufficientCreditsError:
      properties:
        code:
          description: Error code
          example: INSUFFICIENT_CREDITS
          type: string
        message:
          description: >-
            Error message (Korean by default, English when Accept-Language: en
            is specified)
          example: Insufficient credits.
          type: string
      type: object
    domain.RateLimitExceededError:
      properties:
        code:
          description: Error code
          example: PLATFORM_RATE_LIMIT_EXCEEDED
          type: string
        message:
          description: >-
            Error message (Korean by default, English when Accept-Language: en
            is specified)
          example: Too many requests. Please try again later.
          type: string
      type: object
    domain.InternalServerError:
      properties:
        message:
          description: Error message (not localized)
          example: Internal Server Error
          type: string
        requestID:
          description: >-
            Request identifier to reference in support inquiries (same value as
            the X-Request-Id response header)
          example: bkZqnHQepkgTOocTvyHWSlHcGzRqQbZk
          type: string
      type: object
    domain.FanoutStatisticDTO:
      properties:
        fanoutCount:
          description: >-
            Fan-out occurrence count for this query (named analogously to
            citationCount in citation statistics, FND-1495)
          example: 9
          type: integer
        latestCreatedAt:
          description: Time this query most recently appeared (RFC3339)
          example: '2026-08-03T11:39:44Z'
          type: string
        models:
          description: >-
            List of models that issued this query (only when include=models,
            deduplicated)
          example:
            - PERPLEXITY
          items:
            type: string
          type: array
          uniqueItems: false
        query:
          description: Search query string issued by the AI
          example: How to optimize AI search visibility
          type: string
        regions:
          description: >-
            List of regions this query came from (only when include=regions,
            deduplicated)
          example:
            - KR
          items:
            type: string
          type: array
          uniqueItems: false
      type: object
  securitySchemes:
    OrgAPIKeyAuth:
      description: '"Enter your organization API key. Example: ''cs_live_xxxx''"'
      in: header
      name: API-Key
      type: apiKey

````

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