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

# Consensus Breakdown

> Structured per-asset analyst-consensus breakdown for a time window — summary stats, bull / bear case, viewpoints grouped by thesis with their analysts and source posts.

## What it returns

Structured per-asset analyst-consensus breakdown for a time window. A single call returns
everything needed to render a consensus view:

* **Aggregated stats** → `summary` (opinion counts, bullish / bearish %, `consensus_index`,
  `z_score`)
* **Bull / bear case summaries** → `overall.bull_case` / `overall.bear_case`
* **Viewpoints grouped by thesis** → `analyst_consensus.bullish[]` / `bearish[]`, each with its
  analysts and the underlying source posts
* **Source text per key** → `source_text` + `note`: a key cleared under an Integration agreement
  (per-key clearance, not a plan) receives `sources[].statement` (the original post); every other
  key — Free, Premium, Enterprise, admin — receives `sources[].excerpt` (first ≤ 200 characters)
  * `url`. Viewpoint titles, theses, the bull / bear case, the index and the labels are identical
    on every plan. See [Raw source text](/sentiment/plans-and-access#raw-source-text).

## Access

API key, any plan. Raw source text on Integration keys only.

## Parameters

| Name | Default | Description |
| - | - | - |
| `asset` | `BTC` | Any registered asset (see [`/assets`](/sentiment/assets)). |
| `window` | `3d` | One of `1d`, `3d`, `7d`, `30d`. |
| `lang` | `en` | Output language of the generated text (summaries, viewpoint titles): `en`, `ko`, `zh`, `ja`, `es`, `pt`, `ru`, `hi`, `de`, `fr`, `tr`, `vi`, `id`, `it`, `th`, `pl`, `nl`, `uk`. Source posts stay in their original language; a missing translation falls back to English. |
| `source_text` | what the key may receive | `statement` or `excerpt`. `statement` on a key without Integration raw access → `403 RAW_ACCESS_REQUIRED` (contact [sales@cryptoquant.com](mailto:sales@cryptoquant.com)); `excerpt` is always allowed. |

## Field notes

* `sources[].statement` (original post title / text) is provided under an Integration agreement
  only — a per-key clearance, never a plan: Premium, Enterprise and admin-owned keys without it get
  `sources[].excerpt` — the first ≤ 200 characters of the original, cut on a sentence / word
  boundary with an ellipsis, original language (never a translation). `source_text` names the
  field you received; `note` says the same in a sentence. Integration use that needs the original
  source text: contact [sales@cryptoquant.com](mailto:sales@cryptoquant.com).
* `sources[].url` always links the underlying post; `source_type` is one of the
  [`source_type`](/sentiment/enums) values (`tweet` = X, `quicktake` = CryptoQuant, …).
* An analyst's `x_url` and `profile_url` are each nullable — CryptoQuant-native authors have no X
  link, and some have no public profile page; `avatar_url` may be `null` or a generated
  placeholder.
* `consensus_index` and `z_score` are the latest daily index of the asset (they do not vary by
  `window`); `null` for an asset that has no index series yet.
* `updated_at` is the timestamp of the most recent source post in the response — use it to detect
  freshness for the selected window.

## Response on a key with Integration raw access

`source_text: "statement"` — everything else identical to the excerpt form; only the `sources[]`
items change shape:

```json theme={null}
[
  {
    "analyst_handle": "CryptoMichNL",
    "statement": "What to expect from #Bitcoin? Honestly, I don't think we're done with the run.",
    "url": "https://x.com/CryptoMichNL/status/2103900910501990879",
    "source_type": "tweet",
    "published_at": "2026-09-26T17:34:00+00:00"
  },
  {
    "analyst_handle": "the_daily_digits",
    "statement": "$2.1B sits on $95K BTC calls for Oct 30, Deribit's biggest strike.",
    "url": "https://cryptoquant.com/insights/quicktake/6ac453b68fa8e62507c0bf1b",
    "source_type": "quicktake",
    "published_at": "2026-10-06T01:49:42+00:00"
  }
]
```


## OpenAPI

````yaml openapi/sentiment.json GET /consensus/breakdown
openapi: 3.1.0
info:
  title: Analyst Consensus API — CryptoQuant
  version: 2.2.0
  summary: >-
    What curated analysts say about crypto, stocks, indices and commodities, as
    numbers.
  description: >-
    What curated analysts on X, CryptoQuant, Seeking Alpha, TradingView and
    Substack (plus licensed sell-side ratings on equities) say about 1712 assets
    — crypto, US and KR equities, index ETFs, commodities — as numbers: the
    daily Analyst Consensus Index (−100 … +100, one series per asset), a
    per-asset consensus breakdown (bull / bear case, viewpoints grouped by
    thesis, source posts), per-analyst stance series, and each analyst's
    accuracy track record.


    **Two access levels.** Public, no key (per-IP rate limit, CDN-cached): `GET
    /assets` (the asset registry + every enum), `GET /consensus` without a key
    (the LATEST index point for any asset with the bull / bear case), `GET
    /analyst-views`, `GET /calls`, `GET /analysts/top`, `GET
    /analysts/{handle}`. Every public payload carries `page_url` (link it),
    `cite_as` and `data_by` ("Data by CryptoQuant Consensus" — show it with the
    numbers). With an API key (`X-API-Key` header or `api_key` query parameter):
    the index HISTORY (`GET /consensus` with `days`) and `GET
    /consensus/breakdown` on any plan; the per-analyst series `GET /sentiment`
    on the Premium and Enterprise plans only (`PLAN_REQUIRED` below). Keys are
    provisioned with the CryptoQuant Premium plan or an Enterprise agreement;
    there is no self-serve key endpoint on this host. **Raw source text** (the
    original post title / text) is provided under an Integration agreement only,
    per API key (`api_keys.raw_access`, never a plan): `GET
    /consensus/breakdown` sends `sources[].statement` on a cleared key and a ≤
    200-character `sources[].excerpt` + url on every other key — Premium,
    Enterprise and admin-owned keys included; the key-free `/analyst-views` and
    `/calls` excerpts follow the same rule. Integration use that needs the
    original text: contact sales@cryptoquant.com (`x-raw-source-text`). Thesis,
    narratives, index and labels are the same on every plan.


    **Conventions.** Dates: `date` = UTC calendar day `YYYY-MM-DD`; `date-time`
    = RFC 3339 / ISO 8601 with offset, UTC. Index and stance series are
    end-of-day: the current UTC day is excluded until complete, so values never
    change retroactively. No pagination anywhere: a series comes back whole
    (`days` is capped by the plan, 36,500 = everything; the full BTC history is
    ≈ 1,950 rows); lists are capped by `limit` (1–50). Sorting is fixed per
    endpoint and stated in its description. Filters combine with AND. Every
    error is the `Error` object: branch on `code`, read `message`, follow
    `docs_url`; `x-errors` lists every code with its recovery. Every operation
    carries `x-plan` (who may call it).


    **Agents.** Import this document as a ChatGPT GPT Action (Authentication:
    None for the public operations) or any OpenAPI tool loader; the Markdown
    version of these docs is `/llms.txt`; the same data is an MCP server at
    `/mcp` (Streamable HTTP, no auth). Pass `via=chatgpt|claude|…` so the links
    you show carry the right `utm_source`.


    **Freshness.** Index and stance series: end-of-day UTC. The breakdown is
    recomputed daily (English by 04:00 UTC, translations by 06:00 UTC); its
    opinion counts refresh every 4 hours. Public payloads are CDN-cached 5
    minutes (track record and assets: 1 hour).


    Human docs: https://consensus.cryptoquant.com/docs/api · how the numbers are
    made: https://consensus.cryptoquant.com/methodology · Markdown for agents:
    https://consensus.cryptoquant.com/llms.txt
  contact:
    name: CryptoQuant — API access and Enterprise data
    url: https://cryptoquant.com/get-in-touch
    email: support@cryptoquant.com
  termsOfService: https://consensus.cryptoquant.com/terms
  license:
    name: Proprietary — CryptoQuant Terms of Service
    url: https://consensus.cryptoquant.com/terms
servers:
  - url: https://consensus.cryptoquant.com/api/v1
    description: Analyst Consensus by CryptoQuant
security:
  - ApiKeyHeader: []
  - ApiKeyQuery: []
tags:
  - name: Registry
    description: Public, no API key. The assets the API covers and every enum it uses.
  - name: Consensus
    description: >-
      The Analyst Consensus Index: latest point public (no key); history and the
      per-asset breakdown with an API key.
  - name: Analyst views
    description: >-
      Public, no API key. What analysts are saying: narratives, per-analyst
      views, the newest calls.
  - name: Analyst track record
    description: >-
      Public, no API key. Who to trust: accuracy scores, ranks and badges per
      analyst.
  - name: Analyst stance
    description: Premium / Enterprise API key. One analyst's daily stance on an asset.
externalDocs:
  description: Sentiment Data documentation (the human rendering of this document)
  url: https://docs.cryptoquant.com/sentiment/overview
paths:
  /consensus/breakdown:
    get:
      tags:
        - Consensus
      summary: >-
        Per-asset consensus breakdown — snapshot (API key, any plan; the
        original source text only on a key with Integration raw access)
      description: >-
        One point-in-time snapshot of an asset's analyst consensus for a window:
        directional opinion counts and shares, the latest daily index + z-score
        (null for an asset without an index series), the bull-case / bear-case
        sentences, the viewpoints grouped by thesis with their analysts and
        source posts. `lang` localises the generated text (titles, cases);
        source posts stay in their original language. Recomputed daily; opinion
        counts every 4 hours. Any plan, including free (counts against the free
        daily limit). **Source text per key** (`source_text` + `note` in the
        response): a key cleared under an Integration agreement (per-key
        raw_access, not a plan) gets `sources[].statement` = the original post
        title / text; every other key — Free, Premium, Enterprise, admin-owned —
        gets `sources[].excerpt` = the first ≤ 200 characters + `url` instead.
        `source_text=statement` asks for the original explicitly and is refused
        with 403 `RAW_ACCESS_REQUIRED` on a key without the clearance
        (Integration use: contact sales@cryptoquant.com). Viewpoint `title` /
        `thesis`, the bull / bear case, the index and the labels are identical
        on every plan.
      operationId: getConsensusBreakdown
      parameters:
        - name: asset
          in: query
          required: false
          description: >-
            Asset SYMBOL, upper-cased by the server (`btc` → `BTC`); NOT
            resolved through the registry — route keys / names are not accepted
            here, and an unknown symbol comes back as an empty breakdown (no
            viewpoints, null index), not a 400. Use the `symbol` from `GET
            /assets`.
          schema:
            type: string
            default: BTC
          example: BTC
        - name: window
          in: query
          required: false
          description: Window of the opinion counts and viewpoints.
          schema:
            type: string
            enum:
              - 1d
              - 3d
              - 7d
              - 30d
            default: 3d
        - name: lang
          in: query
          required: false
          description: >-
            Output language of the generated text (bull / bear case, viewpoint
            titles); a missing translation falls back to English.
          schema:
            type: string
            enum:
              - en
              - ko
              - zh
              - ja
              - es
              - pt
              - ru
              - hi
              - de
              - fr
              - tr
              - vi
              - id
              - it
              - th
              - pl
              - nl
              - uk
            default: en
        - name: source_text
          in: query
          required: false
          description: >-
            Which source-text field to receive. Omitted = what the key may
            receive (statement on a key with Integration raw access, excerpt
            otherwise). `statement` on a key without the clearance → 403
            RAW_ACCESS_REQUIRED (contact sales@cryptoquant.com); `excerpt` is
            always allowed.
          schema:
            type: string
            enum:
              - statement
              - excerpt
      responses:
        '200':
          description: >-
            Breakdown snapshot — `source_text` says which source field the key
            received
          headers:
            X-RateLimit-Limit:
              description: Requests allowed per minute on your plan.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-Daily-Limit:
              description: 'Free plan only: requests allowed per UTC day.'
              schema:
                type: integer
            X-Daily-Used:
              description: 'Free plan only: requests used today, including this one.'
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BreakdownResponse'
              examples:
                integration:
                  summary: >-
                    Key with Integration raw access (api_keys.raw_access):
                    sources[].statement
                  value:
                    asset:
                      symbol: BTC
                      name: Bitcoin
                    updated_at: '2026-10-06T03:34:55+00:00'
                    window: 3d
                    lang: en
                    source_text: statement
                    note: >-
                      sources[].statement = the original post title / text (this
                      key holds Integration raw-text access). Viewpoint title /
                      thesis, bull / bear case, index and labels are the same on
                      every plan.
                    summary:
                      total_opinions: 56
                      bullish_opinions: 46
                      bearish_opinions: 10
                      bullish_pct: 82
                      bearish_pct: 18
                      consensus_index: 49.54
                      z_score: 1.12
                    overall:
                      bull_case:
                        title: Regulatory wins and dovish data fuel breakout
                      bear_case:
                        title: Macro pressure and resistance threaten deeper pullback
                    analyst_consensus:
                      bullish:
                        - id: a3f1c2d4-7b8e-4a90-9c1d-2e3f4a5b6c7d
                          stance: bullish
                          analyst_count: 2
                          title: >-
                            BTC's first weekly close above the 50WMA in 45
                            weeks: bear market lows look in
                          thesis: 50WMA reclaim
                          analysts:
                            - handle: CryptoMichNL
                              display_name: Michael van de Poppe
                              avatar_url: >-
                                https://pbs.twimg.com/profile_images/1890745133325676544/kcXk6nZx_400x400.jpg
                              x_url: https://x.com/CryptoMichNL
                              profile_url: null
                            - handle: the_daily_digits
                              display_name: The Daily Digits
                              avatar_url: null
                              x_url: null
                              profile_url: https://cryptoquant.com/profile/u/QKJizHT
                          sources:
                            - analyst_handle: CryptoMichNL
                              statement: >-
                                What to expect from #Bitcoin? Honestly, I don't
                                think we're done with the run.
                              url: >-
                                https://x.com/CryptoMichNL/status/2103900910501990879
                              source_type: tweet
                              published_at: '2026-09-26T17:34:00+00:00'
                            - analyst_handle: the_daily_digits
                              statement: >-
                                $2.1B sits on $95K BTC calls for Oct 30,
                                Deribit's biggest strike.
                              url: >-
                                https://cryptoquant.com/insights/quicktake/6ac453b68fa8e62507c0bf1b
                              source_type: quicktake
                              published_at: '2026-10-06T01:49:42+00:00'
                      bearish: []
                premium:
                  summary: >-
                    Any other key — Premium / Free / Enterprise / admin without
                    the clearance: sources[].excerpt (≤ 200 characters) + url
                  value:
                    asset:
                      symbol: BTC
                      name: Bitcoin
                    updated_at: '2026-10-06T03:34:55+00:00'
                    window: 3d
                    lang: en
                    source_text: excerpt
                    note: >-
                      sources[].excerpt = the first ≤ 200 characters of the
                      original post (sentence / word boundary, original
                      language) + url; the full statement is provided under an
                      Integration agreement only — contact
                      sales@cryptoquant.com. Viewpoint title / thesis, bull /
                      bear case, index and labels are the same on every plan.
                    summary:
                      total_opinions: 56
                      bullish_opinions: 46
                      bearish_opinions: 10
                      bullish_pct: 82
                      bearish_pct: 18
                      consensus_index: 49.54
                      z_score: 1.12
                    overall:
                      bull_case:
                        title: Regulatory wins and dovish data fuel breakout
                      bear_case:
                        title: Macro pressure and resistance threaten deeper pullback
                    analyst_consensus:
                      bullish:
                        - id: a3f1c2d4-7b8e-4a90-9c1d-2e3f4a5b6c7d
                          stance: bullish
                          analyst_count: 2
                          title: >-
                            BTC's first weekly close above the 50WMA in 45
                            weeks: bear market lows look in
                          thesis: 50WMA reclaim
                          analysts:
                            - handle: CryptoMichNL
                              display_name: Michael van de Poppe
                              avatar_url: >-
                                https://pbs.twimg.com/profile_images/1890745133325676544/kcXk6nZx_400x400.jpg
                              x_url: https://x.com/CryptoMichNL
                              profile_url: null
                            - handle: the_daily_digits
                              display_name: The Daily Digits
                              avatar_url: null
                              x_url: null
                              profile_url: https://cryptoquant.com/profile/u/QKJizHT
                          sources:
                            - analyst_handle: CryptoMichNL
                              excerpt: >-
                                What to expect from #Bitcoin? Honestly, I don't
                                think we're done with the run.
                              url: >-
                                https://x.com/CryptoMichNL/status/2103900910501990879
                              source_type: tweet
                              published_at: '2026-09-26T17:34:00+00:00'
                            - analyst_handle: the_daily_digits
                              excerpt: >-
                                $2.1B sits on $95K BTC calls for Oct 30,
                                Deribit's biggest strike.
                              url: >-
                                https://cryptoquant.com/insights/quicktake/6ac453b68fa8e62507c0bf1b
                              source_type: quicktake
                              published_at: '2026-10-06T01:49:42+00:00'
                      bearish: []
        '400':
          description: >-
            `INVALID_PARAMETER` — window / lang / source_text outside their enum
            (`message` lists the accepted values)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Invalid window
                code: INVALID_PARAMETER
                message: 'window must be one of: 1d, 3d, 7d, 30d'
                docs_url: https://consensus.cryptoquant.com/docs/api#errors
                param: window
        '401':
          description: >-
            Missing key → `API_KEY_REQUIRED`; unknown / inactive / expired key
            or inactive subscription → `INVALID_API_KEY`. `Authorization:
            Bearer` is not read.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                missing:
                  value:
                    error: API key required
                    code: API_KEY_REQUIRED
                    message: >-
                      Use the X-API-Key header or the api_key query parameter.
                      Keys start with "unbias_live_".
                    docs_url: https://consensus.cryptoquant.com/docs/api#errors
                    docs: https://consensus.cryptoquant.com/docs/api
                invalid:
                  value:
                    error: Invalid API key
                    code: INVALID_API_KEY
                    message: >-
                      The key is unknown, inactive or expired, or its
                      subscription is not active.
                    docs_url: https://consensus.cryptoquant.com/docs/api#errors
        '403':
          description: >-
            `RAW_ACCESS_REQUIRED` — `source_text=statement` on a key without
            Integration raw access (per-key clearance, not a plan). Drop the
            parameter for the excerpt + url, or contact sales@cryptoquant.com
            (contact_email) for Integration raw-text access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Integration agreement required
                code: RAW_ACCESS_REQUIRED
                message: >-
                  The original source statement (full post text) is provided
                  under an Integration agreement only, per key (not a plan:
                  premium, enterprise and admin-owned keys without it get the
                  excerpt). Drop source_text=statement to receive the ≤
                  200-character excerpt + source link, or contact
                  sales@cryptoquant.com (contact_email) for Integration raw-text
                  access. Do not retry unchanged.
                docs_url: https://consensus.cryptoquant.com/docs/api#raw-source-text
                contact_email: sales@cryptoquant.com
                contact_url: https://cryptoquant.com/get-in-touch
        '429':
          description: >-
            Per-minute limit (`RATE_LIMIT_EXCEEDED`, header `Retry-After: 60`)
            or, on the free plan, the daily limit (`DAILY_LIMIT_EXCEEDED`,
            header `X-RateLimit-Reset: midnight UTC`).
          headers:
            Retry-After:
              description: Seconds to wait (per-minute limit only).
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Remaining:
              schema:
                type: integer
            X-RateLimit-Reset:
              description: 'Daily limit only: the literal `midnight UTC`.'
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                per_minute:
                  value:
                    error: Rate limit exceeded
                    code: RATE_LIMIT_EXCEEDED
                    message: >-
                      Public endpoint: per-IP limit reached. Wait 37 s
                      (Retry-After), or use an API key for higher limits.
                    docs_url: https://consensus.cryptoquant.com/docs/api#errors
                    retry_after: 37
                daily:
                  value:
                    error: Daily API limit exceeded
                    code: DAILY_LIMIT_EXCEEDED
                    message: >-
                      Free plan: the daily request quota is used up. It resets
                      at 00:00 UTC; the Premium and Enterprise plans have no
                      daily cap.
                    docs_url: https://consensus.cryptoquant.com/docs/api#errors
                    limit: 100
                    used: 100
                    reset: Daily at midnight UTC
                    upgrade_url: https://cryptoquant.com/pricing
                    contact_url: https://cryptoquant.com/get-in-touch
        '500':
          description: '`INTERNAL_ERROR` — retry once after a few seconds.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Internal server error
                code: INTERNAL_ERROR
                message: >-
                  Something went wrong on our side. Retry once after a few
                  seconds; if it persists, report the URL to support.
                docs_url: https://consensus.cryptoquant.com/docs/api#errors
      x-codeSamples:
        - lang: Shell
          source: >-
            curl -X GET
            "https://consensus.cryptoquant.com/api/v1/consensus/breakdown?asset=BTC&window=3d"
            \

            -H "X-API-Key: <YOUR_API_KEY>"
        - lang: JavaScript
          source: >-
            fetch("https://consensus.cryptoquant.com/api/v1/consensus/breakdown?asset=BTC&window=3d",
            { headers: { "X-API-Key": "<YOUR_API_KEY>"} })
              .then(response => response.json())
              .then(data => console.log(data))
        - lang: NodeJS
          source: |-
            require('axios')
              .get("https://consensus.cryptoquant.com/api/v1/consensus/breakdown?asset=BTC&window=3d", { headers: { 'X-API-Key': '<YOUR_API_KEY>' } })
              .then(response => console.log(response))
        - lang: Ruby
          source: >-
            require 'net/http'

            uri =
            URI("https://consensus.cryptoquant.com/api/v1/consensus/breakdown?asset=BTC&window=3d")

            req = Net::HTTP::Get.new(uri)

            req["X-API-Key"] = "<YOUR_API_KEY>"

            res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) {
            |http| http.request(req) }

            puts res.body
        - lang: Python
          source: >-
            import requests

            headers = {'X-API-Key': '<YOUR_API_KEY>'}

            url =
            "https://consensus.cryptoquant.com/api/v1/consensus/breakdown?asset=BTC&window=3d"

            print(requests.get(url, headers=headers).json())
components:
  schemas:
    BreakdownResponse:
      type: object
      required:
        - asset
        - updated_at
        - window
        - lang
        - source_text
        - note
        - summary
        - overall
        - analyst_consensus
      properties:
        asset:
          type: object
          required:
            - symbol
            - name
          properties:
            symbol:
              type: string
            name:
              type: string
        updated_at:
          type: string
          format: date-time
          description: Most recent source post in the response (now when none).
        window:
          type: string
          enum:
            - 1d
            - 3d
            - 7d
            - 30d
        lang:
          type: string
          enum:
            - en
            - ko
            - zh
            - ja
            - es
            - pt
            - ru
            - hi
            - de
            - fr
            - tr
            - vi
            - id
            - it
            - th
            - pl
            - nl
            - uk
        source_text:
          type: string
          enum:
            - statement
            - excerpt
          description: >-
            Which source-text field this key received: `statement` (original
            statement (full post title / text) — Integration agreement keys only
            (per-key raw_access clearance, not a plan); contact
            sales@cryptoquant.com) or `excerpt` (excerpt only: the first ≤ 200
            characters of the original post (sentence / word boundary, original
            language) + the source url).
        note:
          type: string
          description: >-
            One sentence saying what sources[] carries on this plan — show it
            with the sources.
        summary:
          type: object
          required:
            - total_opinions
            - bullish_opinions
            - bearish_opinions
            - bullish_pct
            - bearish_pct
            - consensus_index
            - z_score
          properties:
            total_opinions:
              type: integer
              minimum: 0
              description: bullish_opinions + bearish_opinions (neutral excluded).
            bullish_opinions:
              type: integer
              minimum: 0
            bearish_opinions:
              type: integer
              minimum: 0
            bullish_pct:
              type:
                - integer
                - 'null'
              minimum: 0
              maximum: 100
              description: null when total_opinions is 0.
            bearish_pct:
              type:
                - integer
                - 'null'
              minimum: 0
              maximum: 100
            consensus_index:
              type:
                - number
                - 'null'
              minimum: -100
              maximum: 100
              description: >-
                Latest daily index; does not vary by window; null for an asset
                without an index series.
            z_score:
              type:
                - number
                - 'null'
        overall:
          type: object
          required:
            - bull_case
            - bear_case
          properties:
            bull_case:
              type: object
              required:
                - title
              properties:
                title:
                  type:
                    - string
                    - 'null'
                  description: Null when no bullish consensus has formed.
            bear_case:
              type: object
              required:
                - title
              properties:
                title:
                  type:
                    - string
                    - 'null'
        analyst_consensus:
          type: object
          required:
            - bullish
            - bearish
          properties:
            bullish:
              type: array
              items:
                $ref: '#/components/schemas/BreakdownViewpoint'
            bearish:
              type: array
              items:
                $ref: '#/components/schemas/BreakdownViewpoint'
    Error:
      type: object
      description: >-
        Every non-2xx body. Branch on `code`; `error` is the legacy short reason
        kept for pre-2026-10-06 clients.
      required:
        - error
        - code
        - message
        - docs_url
      properties:
        error:
          type: string
          description: >-
            Legacy short reason ("Invalid asset", "API key required", "Rate
            limit exceeded" …), unchanged wording.
        code:
          type: string
          enum:
            - API_KEY_REQUIRED
            - INVALID_API_KEY
            - PLAN_REQUIRED
            - RAW_ACCESS_REQUIRED
            - DAILY_LIMIT_EXCEEDED
            - RATE_LIMIT_EXCEEDED
            - INVALID_PARAMETER
            - UNKNOWN_ASSET
            - ANALYST_NOT_FOUND
            - ANALYST_NOT_ELIGIBLE
            - NO_DATA
            - SERVICE_UNAVAILABLE
            - INTERNAL_ERROR
          description: >-
            Stable machine code. Status and recovery per code: see `x-errors` at
            the document root.
        message:
          type: string
          description: Human explanation, with the accepted values for a parameter error.
        docs_url:
          type: string
          format: uri
          description: >-
            Where the error is documented (/docs/api#errors, or #plans for
            PLAN_REQUIRED).
        param:
          type: string
          description: The offending query parameter (INVALID_PARAMETER, UNKNOWN_ASSET).
        required_plans:
          type: array
          items:
            type: string
            enum:
              - premium
              - enterprise
          description: Plans that may call the endpoint (PLAN_REQUIRED).
        plan:
          type: string
          description: The key's current plan label, upper-cased (PLAN_REQUIRED).
        upgrade_url:
          type: string
          format: uri
          description: Self-serve upgrade (PLAN_REQUIRED, DAILY_LIMIT_EXCEEDED).
        contact_url:
          type: string
          format: uri
          description: Enterprise / sales contact (PLAN_REQUIRED, DAILY_LIMIT_EXCEEDED).
        limit:
          type:
            - integer
            - 'null'
          description: Daily quota (DAILY_LIMIT_EXCEEDED).
        used:
          type:
            - integer
            - 'null'
          description: Requests used today (DAILY_LIMIT_EXCEEDED).
        reset:
          type: string
          description: When the quota resets ("Daily at midnight UTC").
        retry_after:
          type: integer
          minimum: 1
          description: Seconds to wait (RATE_LIMIT_EXCEEDED; also the Retry-After header).
        docs:
          type: string
          format: uri
          deprecated: true
          description: Legacy alias of docs_url on API_KEY_REQUIRED.
        upgradeUrl:
          type: string
          format: uri
          deprecated: true
          description: Legacy alias of upgrade_url on PLAN_REQUIRED.
    BreakdownViewpoint:
      type: object
      required:
        - id
        - stance
        - analyst_count
        - title
        - thesis
        - analysts
        - sources
      properties:
        id:
          type: string
          description: Cluster id (opaque).
        stance:
          type: string
          enum:
            - bullish
            - bearish
        analyst_count:
          type: integer
          minimum: 0
        title:
          type:
            - string
            - 'null'
          description: Localised when `lang` ≠ en and a translation exists.
        thesis:
          type:
            - string
            - 'null'
          description: Short thesis label the viewpoint is grouped by.
        analysts:
          type: array
          items:
            $ref: '#/components/schemas/BreakdownAnalyst'
        sources:
          type: array
          items:
            $ref: '#/components/schemas/BreakdownSource'
    BreakdownAnalyst:
      type: object
      required:
        - handle
        - display_name
        - avatar_url
        - x_url
        - profile_url
      properties:
        handle:
          type: string
        display_name:
          type:
            - string
            - 'null'
        avatar_url:
          type:
            - string
            - 'null'
          description: May be a generated placeholder.
        x_url:
          type:
            - string
            - 'null'
          format: uri
          description: Only when the X handle is known — never synthesised.
        profile_url:
          type:
            - string
            - 'null'
          format: uri
          description: CryptoQuant profile, when the author has one.
    BreakdownSource:
      type: object
      description: >-
        One source post. Exactly one of `statement` (only on a key with
        Integration raw access — per-key clearance, not a plan: the original
        title or text) or `excerpt` (every other key: the first ≤ 200
        characters) is present; `BreakdownResponse.source_text` says which.
      required:
        - analyst_handle
        - url
        - source_type
        - published_at
      oneOf:
        - required:
            - statement
        - required:
            - excerpt
      properties:
        analyst_handle:
          type:
            - string
            - 'null'
        statement:
          type: string
          description: >-
            Original post title or text, original language — provided under an
            Integration agreement only, per API key (api_keys.raw_access);
            absent on every other key whatever its plan (Premium, Enterprise,
            admin). Integration use that needs the original text: contact
            sales@cryptoquant.com.
        excerpt:
          type: string
          maxLength: 200
          description: >-
            The first ≤ 200 characters of the original post (sentence / word
            boundary, ellipsis when cut, original language) — every key without
            Integration raw access; absent on a cleared key. Read the full post
            at `url`.
        url:
          type: string
          format: uri
          description: The underlying post.
        source_type:
          type: string
          enum:
            - tweet
            - quicktake
            - research
            - news
            - seekingalpha
            - tradingview
            - substack
            - youtube
            - telegram
            - bluesky
          description: Stored source type (`tweet` = X, `quicktake` = CryptoQuant).
        published_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Provisioned with the CryptoQuant Premium plan or an Enterprise agreement
        (no self-serve). Keys start with `unbias_live_`.
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api_key
      description: Same key as a query parameter (avoid in logged URLs).

````

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