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

# Top Analysts

> The asset's analysts ranked by accuracy_score among those active in the last three calendar months, each with its tier badge. Public, no API key.

## What it returns

The asset's analysts ranked by `accuracy_score` among those active in the last three calendar
months. `asset` = any registered asset (default `BTC`); `limit` 1–50 (default 20).

Each row carries its tier badge (Top 1% / 5% / 10% / Tracked — quote the badge, not the score).

<Note>
  Accuracy scoring covers **crypto** today: for stocks, ETFs and commodities the list is returned
  with `scored: false` and `null` scores.
</Note>

## Access

Public — no API key, no session. Responses are CDN-cached for one hour and carry `score_notes`
explaining every number.

## Reading the scores

Scores are **comparative 0–100 values, not win probabilities** — see the
[Methodology](https://consensus.cryptoquant.com/methodology).

* `accuracy_score` — overall accuracy, 0–100: an Empirical-Bayes-adjusted hit rate of the
  analyst's directional calls against subsequent price moves, shrunk toward the pool mean when the
  sample is small. Rank analysts on the same asset by it.
* `accuracy_sample_size` — number of evaluated calls behind `accuracy_score`. Treat scores with a
  sample below \~10 as weak evidence.

<Tip>
  Building an agent tool? The same call backs the CryptoQuant MCP tool `get_top_analysts` — see
  [For AI Agents](/sentiment/for-agents).
</Tip>


## OpenAPI

````yaml openapi/sentiment.json GET /analysts/top
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:
  /analysts/top:
    get:
      tags:
        - Analyst track record
      summary: Top analysts for an asset by accuracy (public, no API key)
      description: >-
        The asset's analysts ranked by accuracy_score among those active in the
        last three calendar months — the same rows and order as the site's
        /analysts list sorted by accuracy (ties: sample size, then handle).
        Public; CDN-cached for one hour (`Cache-Control: public, s-maxage=3600,
        stale-while-revalidate=86400`). Accuracy scoring covers crypto assets
        today: other asset classes return `scored: false` with null scores and
        the list in activity order. Backs the MCP tool get_top_analysts.
      operationId: getTopAnalysts
      parameters:
        - name: asset
          in: query
          required: false
          description: >-
            Registered asset symbol or route key (BTC, ETH, SOL, NVDA, 005930
            …), case-insensitive. Unknown → 400 UNKNOWN_ASSET.
          schema:
            type: string
            default: BTC
          example: BTC
        - name: limit
          in: query
          required: false
          description: Rows to return, clamped to 1–50 silently; unparsable = 20.
          schema:
            type: integer
            minimum: 1
            maximum: 50
            default: 20
          example: 5
      responses:
        '200':
          description: Ranked analysts
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TopAnalystsResponse'
              example:
                asset: BTC
                asset_name: Bitcoin
                asset_class: crypto
                as_of: '2026-10-06T07:48:27.635Z'
                scored: true
                ranking: >-
                  accuracy_score desc among analysts active in the last three
                  calendar months (ties: sample size, then handle)
                tier_asset_class: crypto
                count: 1
                total_ranked: 72
                total_tracked: 125
                analysts:
                  - rank: 1
                    tier:
                      asset_class: crypto
                      tier: 1
                      badge: top1
                      label: Top 1%
                      eligible: true
                      reason: null
                      pool_rank: 2
                      pool_size: 108
                      percentile: 1.8519
                      score_version: v20
                      computed_at: '2026-10-06T00:59:17.501379+00:00'
                    handle: CarpeNoctom
                    name: CarpeNoctom
                    profile_url: https://consensus.cryptoquant.com/analyst/CarpeNoctom
                    source_url: https://x.com/CarpeNoctom
                    sources:
                      - twitter
                    role: PM & Head of Trading
                    company: Canary Capital
                    category: null
                    citation_count: null
                    accuracy_score: 69.9
                    accuracy_sample_size: 2081
                    call_count: 5374
                    bull_score: 76
                    bear_score: 50.3
                    short_score: 51
                    long_score: 63.3
                    balanced_score: 50.3
                    bullish_bias_pct: 54
                    bias: balanced
                    last_post_at: '2026-10-02T21:04:12+00:00'
                score_notes:
                  accuracy_score: >-
                    Overall accuracy, 0–100: an Empirical-Bayes-adjusted hit
                    rate of the analyst's directional calls against subsequent
                    price moves, shrunk toward the pool mean when the sample is
                    small. Comparative — rank analysts on the same asset by it;
                    it is NOT a win probability.
                  accuracy_sample_size: >-
                    Number of evaluated calls behind accuracy_score. Treat
                    scores with a sample below ~10 as weak evidence.
                list_url: >-
                  https://consensus.cryptoquant.com/analysts?asset=btc&sort=accuracy
                methodology_url: https://consensus.cryptoquant.com/methodology
                docs_url: >-
                  https://consensus.cryptoquant.com/docs/api#analyst-track-record
        '400':
          description: '`UNKNOWN_ASSET`'
          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
        '503':
          description: >-
            `SERVICE_UNAVAILABLE` — the analyst list could not be loaded; retry
            shortly
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: Analyst list unavailable
                code: SERVICE_UNAVAILABLE
                message: The analyst list could not be loaded. Try again shortly.
                docs_url: https://consensus.cryptoquant.com/docs/api#errors
      security: []
      x-codeSamples:
        - lang: Shell
          source: >-
            curl -X GET
            "https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5"
        - lang: JavaScript
          source: >-
            fetch("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
              .then(response => response.json())
              .then(data => console.log(data))
        - lang: NodeJS
          source: |-
            require('axios')
              .get("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
              .then(response => console.log(response))
        - lang: Ruby
          source: >-
            require 'net/http'

            uri =
            URI("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")

            res = Net::HTTP.get_response(uri)

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

            url =
            "https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5"

            print(requests.get(url).json())
components:
  schemas:
    TopAnalystsResponse:
      type: object
      required:
        - asset
        - asset_name
        - asset_class
        - as_of
        - scored
        - ranking
        - tier_asset_class
        - count
        - total_ranked
        - total_tracked
        - analysts
        - score_notes
      properties:
        asset:
          type: string
        asset_name:
          type: string
        asset_class:
          type: string
          enum:
            - crypto
            - equities
            - indices
            - commodities
        as_of:
          type: string
          format: date-time
        scored:
          type: boolean
          description: >-
            false = accuracy scoring does not cover this asset yet; scores are
            null and the order is the list order.
        ranking:
          type: string
          description: Plain-language statement of the sort rule.
        tier_asset_class:
          type: string
          enum:
            - crypto
            - equities
            - indices
            - commodities
            - macro
          description: The asset class each entry's `tier` was read for.
        count:
          type: integer
          minimum: 0
        total_ranked:
          type: integer
          minimum: 0
        total_tracked:
          type: integer
          minimum: 0
        analysts:
          type: array
          items:
            $ref: '#/components/schemas/TopAnalystEntry'
        score_notes:
          type: object
          additionalProperties:
            type: string
          description: What each score field means — quote the caveat with the number.
        list_url:
          type: string
          format: uri
        methodology_url:
          type: string
          format: uri
        docs_url:
          type: string
          format: uri
    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.
    TopAnalystEntry:
      type: object
      required:
        - rank
        - tier
        - handle
        - profile_url
        - sources
        - accuracy_score
        - call_count
        - bias
      properties:
        rank:
          type: integer
          minimum: 1
          description: >-
            Position in the asset's accuracy ranking among analysts active in
            the last three calendar months.
        tier:
          allOf:
            - $ref: '#/components/schemas/AccuracyTier'
          description: >-
            The badge for the requested asset's class (tier_asset_class) — show
            this, not accuracy_score.
        handle:
          type: string
          description: X handle, or `<platform>:<slug>` for a platform-only analyst.
        name:
          type:
            - string
            - 'null'
        profile_url:
          type: string
          format: uri
          description: The analyst page on the site (cite this).
        source_url:
          type:
            - string
            - 'null'
          format: uri
          description: >-
            Where the analyst publishes (X, CryptoQuant, TradingView, Seeking
            Alpha, Substack).
        sources:
          type: array
          items:
            type: string
            enum:
              - twitter
              - cryptoquant
              - seekingalpha
              - tradingview
              - substack
              - other
          description: Stored provenance of the analyst row (`twitter` = X).
        role:
          type:
            - string
            - 'null'
        company:
          type:
            - string
            - 'null'
        category:
          type:
            - string
            - 'null'
          description: >-
            Analyst category label (e.g. `technical`, `macro`); free text, null
            when unset.
        citation_count:
          type:
            - integer
            - 'null'
          minimum: 0
          description: Times cited by name in tracked news articles.
        accuracy_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: >-
            Overall accuracy, 0–100: Empirical-Bayes-adjusted hit rate of
            directional calls vs. subsequent price, shrunk toward the pool mean
            for small samples. Comparative within an asset; NOT a win
            probability.
        accuracy_sample_size:
          type:
            - integer
            - 'null'
          minimum: 0
          description: Evaluated calls behind accuracy_score; below ~10 is weak evidence.
        call_count:
          type:
            - integer
            - 'null'
          minimum: 0
          description: All-time directional (bullish or bearish) posts on tracked assets.
        bull_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: Accuracy, 0–100, on calls made in bull market phases.
        bear_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: Accuracy, 0–100, on calls made in bear market phases.
        short_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: Accuracy, 0–100, of calls evaluated over the short horizon.
        long_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: Accuracy, 0–100, of calls evaluated over the long horizon.
        balanced_score:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: Mean of bull_score and bear_score when both exist.
        bullish_bias_pct:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: >-
            Share of bullish among recent directional calls on the asset (50 =
            balanced). A stance, not a quality signal.
        bias:
          type:
            - string
            - 'null'
          enum:
            - bullish
            - bearish
            - balanced
            - null
        last_post_at:
          type:
            - string
            - 'null'
          format: date-time
    AccuracyTier:
      type: object
      description: >-
        Accuracy percentile-tier badge for one asset class (Ki 2026-09-30). What
        people see is the badge, stated against all analysts: tier 1 = "Top 1%"
        (top 10% of the eligible tracked pool), 5 = "Top 5%" (top 50%), 10 =
        "Top 10%" (the rest of the eligible pool); null = "Tracked" (no badge,
        `reason` says why). Computed daily from the stored accuracy score; the
        precise position (pool_rank / pool_size / percentile) is for detail
        views and agents only.
      required:
        - asset_class
        - tier
        - badge
        - label
        - eligible
        - reason
      properties:
        asset_class:
          type: string
          enum:
            - crypto
            - equities
            - indices
            - commodities
            - macro
        tier:
          type:
            - integer
            - 'null'
          enum:
            - 1
            - 5
            - 10
            - null
          description: >-
            Badge number: 1 = Top 1%, 5 = Top 5%, 10 = Top 10%; null = no badge
            (Tracked).
        badge:
          type: string
          enum:
            - top1
            - top5
            - top10
            - tracked
          description: Stable key for the UI (i18n / icon).
        label:
          type: string
          enum:
            - Top 1%
            - Top 5%
            - Top 10%
            - Tracked
          description: English badge text.
        eligible:
          type: boolean
          description: >-
            True when the analyst is inside the class pool (scored, not
            excluded, ≥ 30 directional calls). A thin pool (< 10) keeps
            eligible=true with tier null and reason pool_too_small.
        reason:
          type:
            - string
            - 'null'
          enum:
            - excluded
            - ineligible
            - news_feed
            - company
            - unscored
            - insufficient_calls
            - pool_too_small
            - null
          description: >-
            Why tier is null; null when a tier is set. unscored = no accuracy
            score for this asset class.
        pool_rank:
          type:
            - number
            - 'null'
          minimum: 1
          description: >-
            Midrank position from the top inside the eligible pool (1 = best;
            tied analysts share one position, e.g. 2.5).
        pool_size:
          type:
            - integer
            - 'null'
          minimum: 0
          description: Eligible analysts in the class when computed.
        percentile:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 100
          description: >-
            100 × pool_rank / pool_size: position from the top in percent (0 =
            best).
        score_version:
          type:
            - string
            - 'null'
          description: >-
            Score source the tier was computed from (`v20`, or an active
            alternative such as `v20r-btc-amp31-dir`).
        computed_at:
          type:
            - string
            - 'null'
          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.