> ## 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.

# Analyst Consensus Index

> The daily Analyst Consensus Index — one analyst = one vote, from −100 (all bearish) to +100 (all bullish). Public for the latest point; API key for the daily history.

## What it measures

The Analyst Consensus Index: one analyst = one vote (their latest directional post on the asset,
weighted by recency and accuracy), **−100** (all bearish) to **+100** (all bullish), one daily
series per asset.

* **Without a key** it answers the latest point for any asset with the bull / bear case, the
  30-day split and the links to cite.
* **With a key** it answers the daily history (Premium / Enterprise: the whole range; Free: the
  latest point only).

## Response fields (series)

| Field | Description |
| - | - |
| `consensus_index` | Raw daily index (−100 … +100); `null` on a day without enough calls. |
| `consensus_index_30d_ma` | 30-day moving average of the index. |
| `z_score` | 90-day rolling z-score of the 30-day MA. Colour rule used on the site: z ≥ +0.8 bullish (green), z ≤ −1.5 bearish (red). |
| `bullish_analysts` / `bearish_analysts` / `total_analysts` | Voters by side that day. |
| `bullish_opinions` / `bearish_opinions` / `total_opinions` | Directional posts counted that day. |

## Notes

* `days` counts days of history ending yesterday UTC (keyed only). Positive integer, capped at the
  plan's limit (36,500 = everything on Premium / Enterprise). The full BTC history is ≈ 1,950
  rows.
* `granularity` — only `daily` is offered (there is no hourly series).
* `via` — public form only: tags the payload's links with `utm_source` (`chatgpt`, `claude`,
  `mcp`, `gemini`, `perplexity`, `api`).
* An unregistered `asset` answers `400 UNKNOWN_ASSET`; the list is
  [`GET /assets`](/sentiment/assets).
* Public payloads carry `page_url`, `cite_as` and `data_by` ("Data by CryptoQuant Consensus")
  — show the attribution with the numbers.

<Note>
  The same daily index for BTC, ETH and SOL is also served with a **CryptoQuant API key** through
  the [Indicator API](/indicator-api/consensus) (`Authorization: Bearer`, `from`/`to`/`limit`/
  `order`) — the index only, without the breakdown, stance or track record.
</Note>


## OpenAPI

````yaml openapi/sentiment.json GET /consensus
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:
    get:
      tags:
        - Consensus
      summary: >-
        Analyst Consensus Index — latest point (public) or daily series (API
        key)
      description: >-
        WITHOUT a key (the agent path): the latest end-of-day Analyst Consensus
        Index point for ANY registered asset — `consensus_index` (−100 all
        bearish … +100 all bullish), `consensus_index_30d_ma`, the bullish /
        bearish share, `total_analysts`, the one-line `bull_case` / `bear_case`,
        plus `page_url` / `cite_as` / `data_by` (`ConsensusPublic`,
        `plan:"public"`). Public, no API key. Per-IP limit 60 requests / minute
        (per function instance); CDN-cached 5 minutes (`Cache-Control: public,
        s-maxage=300, stale-while-revalidate=3600`). Use this for "what do
        analysts think about X / is the market bullish on X".


        WITH a key: the daily series for ANY registered asset (one series per
        asset the index publisher writes — crypto since 2021-06-01, equities /
        indices / commodities from their first coverage day; an asset without
        rows answers an empty series, `count: 0`) with the 30-day MA, a 90-day
        z-score, analyst and opinion counts, oldest first. Premium / Enterprise
        keys get `days` of history ending yesterday UTC (capped at the plan's
        max_days_history, 36,500 = everything); the FREE plan gets ONLY the
        latest point as a flat object with `plan:"free"` (`days` ignored). No
        pagination: the whole range is one response.
      operationId: getConsensusIndex
      parameters:
        - name: asset
          in: query
          required: false
          description: >-
            Any registered asset, case-insensitive: the symbol (`BTC`, `NVDA`,
            `005930`, `XAU`), the route key (`bitcoin`, `samsung-electronics`),
            the display name (`Bitcoin`), an alias ticker (`GLD` → XAU) or a
            retired ticker (`MATIC` → POL). The response reports the canonical
            symbol. The full list: `GET /assets`. A market aggregate
            (`crypto-market`) is not accepted. Unknown → 400 `UNKNOWN_ASSET`.
          schema:
            type: string
            default: BTC
          example: NVDA
        - name: days
          in: query
          required: false
          description: >-
            Keyed only — days of history ending yesterday UTC. Positive integer
            (anything else → 400 INVALID_PARAMETER); silently capped at the
            plan's max_days_history (free 7, premium / enterprise 36500).
            Ignored without a key and on the free plan's single point.
          schema:
            type: integer
            minimum: 1
            maximum: 36500
            default: 7
          example: 365
        - name: granularity
          in: query
          required: false
          description: >-
            Keyed only — `daily` is the only value (there is no hourly series);
            anything else → 400 INVALID_PARAMETER.
          schema:
            type: string
            enum:
              - daily
            default: daily
        - name: via
          in: query
          required: false
          description: >-
            The surface the agent runs on; sets `utm_source` on every link in
            the payload. Unknown values fall back to the default.
          schema:
            type: string
            enum:
              - chatgpt
              - claude
              - mcp
              - gemini
              - perplexity
              - api
            default: chatgpt
          example: claude
      responses:
        '200':
          description: >-
            Latest point (no key: ConsensusPublic), series (premium /
            enterprise: ConsensusSeries) or latest point (free:
            ConsensusLatest). The three shapes are told apart by `plan` (public
            / absent / free).
          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:
                oneOf:
                  - $ref: '#/components/schemas/ConsensusPublic'
                  - $ref: '#/components/schemas/ConsensusSeries'
                  - $ref: '#/components/schemas/ConsensusLatest'
              examples:
                public_no_key:
                  summary: No key — latest point for NVDA
                  value:
                    asset: NVDA
                    asset_name: NVIDIA
                    asset_class: equities
                    date: '2026-10-05'
                    consensus_index: 71.28
                    consensus_index_30d_ma: 75.85
                    bullish_percent: 86
                    bearish_percent: 14
                    total_analysts: 62
                    bull_case: Early AI buildout plus cheap valuation fuels growth
                    bear_case: Limited upside ahead; take profits and rotate
                    window: 30d
                    plan: public
                    history: >-
                      The daily index history needs an API key (X-API-Key) —
                      https://consensus.cryptoquant.com/docs/api
                    page_url: >-
                      https://consensus.cryptoquant.com/consensus/nvda?utm_source=api&utm_medium=gpt-action&utm_campaign=consensus
                    top_analysts_url: >-
                      https://consensus.cryptoquant.com/analysts?asset=nvda&sort=accuracy&utm_source=api&utm_medium=gpt-action&utm_campaign=consensus
                    methodology_url: >-
                      https://consensus.cryptoquant.com/methodology?utm_source=api&utm_medium=gpt-action&utm_campaign=consensus
                    cite_as: >-
                      Data by CryptoQuant Consensus —
                      https://consensus.cryptoquant.com/consensus/nvda
                    data_by: Data by CryptoQuant Consensus
                    as_of: '2026-10-06T07:48:24.833Z'
                series_paid_key:
                  summary: Premium / Enterprise key — daily series
                  value:
                    asset: BTC
                    period:
                      start: '2026-10-04'
                      end: '2026-10-05'
                    granularity: daily
                    count: 2
                    data:
                      - date: '2026-10-04'
                        consensus_index: 48.73
                        consensus_index_30d_ma: 40.2
                        z_score: 1.09
                        avg_sentiment_score: 71.93
                        bullish_analysts: 122
                        bearish_analysts: 38
                        total_analysts: 160
                        bullish_opinions: 20
                        bearish_opinions: 7
                        total_opinions: 27
                      - date: '2026-10-05'
                        consensus_index: 49.54
                        consensus_index_30d_ma: 40.37
                        z_score: 1.12
                        avg_sentiment_score: 72.22
                        bullish_analysts: 125
                        bearish_analysts: 35
                        total_analysts: 160
                        bullish_opinions: 26
                        bearish_opinions: 3
                        total_opinions: 29
                latest_free_key:
                  summary: Free key — latest point only
                  value:
                    asset: BTC
                    date: '2026-10-05'
                    consensus_index: 49.54
                    consensus_index_30d_ma: 40.37
                    z_score: 1.12
                    avg_sentiment_score: 72.22
                    bullish_analysts: 125
                    bearish_analysts: 35
                    total_analysts: 160
                    bullish_opinions: 26
                    bearish_opinions: 3
                    total_opinions: 29
                    plan: free
                    upgrade_message: Contact us for Enterprise access to full historical data
        '400':
          description: >-
            `UNKNOWN_ASSET` (asset not registered / an aggregate) or
            `INVALID_PARAMETER` (days, granularity)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Unknown asset
                code: UNKNOWN_ASSET
                message: >-
                  "DOGE2" is not a registered asset. Use a ticker, route key or
                  name from https://consensus.cryptoquant.com/api/v1/assets
                  (symbol / key / name / aliases, case-insensitive). Market
                  aggregates are not assets.
                docs_url: https://consensus.cryptoquant.com/docs/api#errors
                param: asset
        '401':
          description: >-
            Keyed path only: `INVALID_API_KEY`. A request WITHOUT a key is never
            401 — it gets the public snapshot.
          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
        '404':
          description: 'Free plan only: `NO_DATA` when the last 90 days hold no rows'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: No data available
                code: NO_DATA
                message: No index rows for this asset in the last 90 days.
                docs_url: https://consensus.cryptoquant.com/docs/api#errors
        '429':
          description: >-
            No key: per-IP limit (`RATE_LIMIT_EXCEEDED`, `Retry-After`). Key:
            per-minute limit, or on the free plan the daily limit
            (`DAILY_LIMIT_EXCEEDED`).
          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
      security:
        - {}
        - ApiKeyHeader: []
        - ApiKeyQuery: []
      x-codeSamples:
        - lang: Shell
          source: >-
            curl -X GET
            "https://consensus.cryptoquant.com/api/v1/consensus?asset=BTC&days=365"
            \

            -H "X-API-Key: <YOUR_API_KEY>"
        - lang: JavaScript
          source: >-
            fetch("https://consensus.cryptoquant.com/api/v1/consensus?asset=BTC&days=365",
            { 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?asset=BTC&days=365", { 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?asset=BTC&days=365")

            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?asset=BTC&days=365"

            print(requests.get(url, headers=headers).json())
components:
  schemas:
    ConsensusPublic:
      type: object
      description: >-
        No key: the latest end-of-day index point for the asset (what the asset
        page's band shows) with the bull / bear case and the links to quote.
      required:
        - asset
        - asset_name
        - asset_class
        - date
        - consensus_index
        - plan
        - page_url
        - cite_as
        - data_by
        - as_of
      properties:
        asset:
          type: string
          description: Canonical symbol.
        asset_name:
          type: string
        asset_class:
          type: string
          enum:
            - crypto
            - equities
            - indices
            - commodities
        date:
          type:
            - string
            - 'null'
          format: date
          description: UTC day of the reading (null = no index yet for this asset).
        consensus_index:
          type:
            - number
            - 'null'
          minimum: -100
          maximum: 100
          description: >-
            Analyst Consensus Index: −100 all bearish … +100 all bullish (one
            analyst = one vote, decay × accuracy weighted; see /methodology).
        consensus_index_30d_ma:
          type:
            - number
            - 'null'
          minimum: -100
          maximum: 100
        bullish_percent:
          type:
            - integer
            - 'null'
          minimum: 0
          maximum: 100
          description: >-
            round((consensus_index + 100) / 2) — the bullish share the site
            shows.
        bearish_percent:
          type:
            - integer
            - 'null'
          minimum: 0
          maximum: 100
          description: 100 − bullish_percent.
        total_analysts:
          type:
            - integer
            - 'null'
          minimum: 0
          description: Analysts voting in that day's index.
        bull_case:
          type:
            - string
            - 'null'
          description: >-
            One-line bull case for the window (null when no bullish consensus
            formed).
        bear_case:
          type:
            - string
            - 'null'
        window:
          type: string
          enum:
            - 30d
          description: Window of the bull / bear case.
        plan:
          type: string
          enum:
            - public
        history:
          type: string
          description: How to get the daily history (API key).
        page_url:
          type: string
          format: uri
          description: >-
            The canonical page on the site for this answer, UTM-tagged for the
            calling surface (`via`). Link it in every answer.
        top_analysts_url:
          type: string
          format: uri
          description: The asset's analysts ranked by accuracy (site page).
        methodology_url:
          type: string
          format: uri
          description: How the numbers are made.
        cite_as:
          type: string
          description: >-
            Attribution line + the untagged canonical URL, e.g. "Data by
            CryptoQuant Consensus —
            https://consensus.cryptoquant.com/consensus/btc".
        data_by:
          type: string
          enum:
            - Data by CryptoQuant Consensus
          description: Show this next to the numbers.
        as_of:
          type: string
          format: date-time
          description: Generation time of the payload (UTC).
    ConsensusSeries:
      type: object
      description: 'Premium / Enterprise plans: the requested window, oldest first.'
      required:
        - asset
        - period
        - granularity
        - count
        - data
      properties:
        asset:
          type: string
          description: Canonical symbol.
        period:
          type: object
          required:
            - start
            - end
          properties:
            start:
              type: string
              format: date
              description: First UTC day requested (today − days).
            end:
              type: string
              format: date
              description: Yesterday UTC.
        granularity:
          type: string
          enum:
            - daily
        count:
          type: integer
          minimum: 0
          description: Rows in `data` (0 for an asset without index rows in the range).
        data:
          type: array
          items:
            $ref: '#/components/schemas/DailyIndexPoint'
    ConsensusLatest:
      type: object
      description: >-
        Free plan: the latest end-of-day point as a flat object (no `data`
        array).
      required:
        - asset
        - date
        - plan
      allOf:
        - $ref: '#/components/schemas/DailyIndexPoint'
        - type: object
          properties:
            asset:
              type: string
            plan:
              type: string
              enum:
                - free
            upgrade_message:
              type: string
    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.
    DailyIndexPoint:
      type: object
      required:
        - date
        - consensus_index
        - consensus_index_30d_ma
        - z_score
        - bullish_analysts
        - bearish_analysts
        - total_analysts
      properties:
        date:
          type: string
          format: date
          description: >-
            UTC calendar day (end-of-day value; the current UTC day is never
            included).
        consensus_index:
          type:
            - number
            - 'null'
          minimum: -100
          maximum: 100
          description: >-
            Daily raw Analyst Consensus Index: weighted bullish − bearish votes
            over total, −100 (all bearish) … +100 (all bullish). null = no vote
            that day.
        consensus_index_30d_ma:
          type:
            - number
            - 'null'
          minimum: -100
          maximum: 100
          description: >-
            30-day moving average of consensus_index (null until enough
            history).
        z_score:
          type:
            - number
            - 'null'
          description: >-
            90-day rolling z-score of the 30-day MA, computed on its 0–100
            rescale, 2 decimals. The site colours z ≥ +0.8 bullish and z ≤ −1.5
            bearish.
        avg_sentiment_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          deprecated: true
          description: >-
            Legacy unweighted mean sentiment (0–100). null once the stance
            pipeline is on; use consensus_index.
        bullish_analysts:
          type:
            - integer
            - 'null'
          minimum: 0
          description: Analysts whose latest stance that day was bullish.
        bearish_analysts:
          type:
            - integer
            - 'null'
          minimum: 0
        total_analysts:
          type:
            - integer
            - 'null'
          minimum: 0
          description: bullish_analysts + bearish_analysts (neutral analysts do not vote).
        bullish_opinions:
          type:
            - integer
            - 'null'
          minimum: 0
          description: Directional posts published that day, bullish.
        bearish_opinions:
          type:
            - integer
            - 'null'
          minimum: 0
        total_opinions:
          type:
            - integer
            - 'null'
          minimum: 0
  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.