Gauntlet TVL API

The TVL API from Gauntlet — 1 operation(s) for tvl.

Operations 2

GET /v1/tvl Get live aggregate TVL #
GET /v1/tvl/timeseries Get the daily aggregate TVL timeseries #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/gauntlet:gauntlet-tvl-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

gauntlet-tvl-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Gauntlet TVL API
  description: Gauntlet vault data, user positions, and event analytics API.
  contact:
    name: Gauntlet
    url: https://gauntlet.xyz
  license:
    name: ''
  version: 1.0.0
tags:
- name: TVL
paths:
  /v1/tvl:
    get:
      tags:
      - TVL
      summary: Get live aggregate TVL
      description: 'Returns live aggregate Gauntlet TVL composed from indexed Gaia vault data and configured external TVL sources. `totals` always carries three coarse tranches: `vault_curation` (every indexed non-Aera vault plus Solana — Morpho, Moolah and Symbiotic on EVM plus Kamino on Solana, which is why it is not named for a protocol), `aera_v2` and `aera` (Aera V3); the Aera generations are separate product lines, not part of `vault_curation`. Pass `?mode=chain` for one `breakdown` row per chain, or `?mode=strategy` for one row per curated strategy from the admin registry, with indexed vaults no strategy claims under `uncategorized`. Aera V3 (`aera_indexed`), `aera_v2` and `solana` are whole rows in either mode, so the rows always sum to the headline total. Without `mode` no `breakdown` is returned.'
      operationId: get_tvl
      parameters:
      - name: mode
        in: query
        description: 'Breakdown to return: `chain` or `strategy`. Omit for the headline figures only.'
        required: false
        schema:
          $ref: '#/components/schemas/TvlBreakdownMode'
      responses:
        '200':
          description: Live aggregate TVL
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TvlResponse'
        '401':
          description: Missing or invalid auth
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Data source unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /v1/tvl/timeseries:
    get:
      tags:
      - TVL
      summary: Get the daily aggregate TVL timeseries
      description: 'Returns a fixed trailing 3-month daily series of aggregate Gauntlet TVL. Without `mode` each point''s `sources` carry the same three coarse tranches the live `/v1/tvl` totals report — `vault_curation` (every indexed non-Aera vault plus Solana), `aera_v2` and `aera` (Aera V3). Pass `?mode=strategy` for a per-point `sources` breakdown with one entry per curated strategy (`prime_lending`, `balanced_lending`, `frontier_lending`, …), or `?mode=chain` for one entry per chain; indexed vaults that no curated strategy claims roll up under `uncategorized`. `aera` (Aera V3) is a whole entry in either mode, as are `aera_v2` and `solana`, which are read from the `tvl_history` table (populated by the hourly TVL-history job and its backfill) since neither source is indexed. The rest is derived at read time from indexed Envio vault history plus historical USD pricing. Every point carries the same source ids in the same order, and they sum to that point''s total, which does not depend on `mode`. A day with no data for a source contributes 0 to that day''s total rather than carrying the last known value forward.


        Served from a cached snapshot that is refreshed off the request path, so no caller pays for a recompute. `meta.data_as_of` is set when the snapshot is past its refresh window and a refresh is running behind the response; it is absent when the series is current.


        A numeraire token with no USD price for part of the window is named in `meta.partial_errors`, and the balances it backs are excluded from the totals on those days. `TOKEN_PRICE_UNAVAILABLE` is a gap that should close, so it is retried on the next read; `TOKEN_PRICE_UNAVAILABLE_ACCEPTED` is one that cannot, with the reason in its message. Both mean the totals are short by that token; only the first is worth alerting on.'
      operationId: get_tvl_timeseries
      parameters:
      - name: mode
        in: query
        description: 'Per-point breakdown to return: `chain` or `strategy`. Omit for the daily total only.'
        required: false
        schema:
          $ref: '#/components/schemas/TvlBreakdownMode'
      responses:
        '200':
          description: Daily aggregate TVL timeseries
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TvlTimeseriesResponse'
        '401':
          description: Missing or invalid auth
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Data source unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    PartialResponseError:
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          description: Machine-readable error code for the isolated item failure.
        message:
          type: string
          description: Human-readable error message.
        resource_id:
          type:
          - string
          - 'null'
          description: Resource that failed inside the aggregate response, when known.
    TvlTimeseriesPoint:
      type: object
      required:
      - timestamp
      - tvl
      - sources
      properties:
        sources:
          type: array
          items:
            $ref: '#/components/schemas/TvlTimeseriesSourceAmount'
          description: 'The day''s breakdown. `?mode=` picks how it is partitioned; the

            total above never depends on that choice.'
        timestamp:
          type: string
          format: date-time
        tvl:
          $ref: '#/components/schemas/TvlAmount'
    TvlBreakdownMode:
      type: string
      description: 'Which partition of indexed vault TVL the caller asked for. Absent

        from a request means the headline figures only, with no breakdown.'
      enum:
      - chain
      - strategy
    TvlBreakdown:
      type: object
      required:
      - id
      - label
      - source_id
      - tvl
      - updated_at
      properties:
        id:
          type: string
        label:
          type: string
        source_id:
          type: string
        tvl:
          $ref: '#/components/schemas/TvlAmount'
        updated_at:
          type: string
          format: date-time
    TvlResponse:
      type: object
      required:
      - meta
      - data
      properties:
        data:
          $ref: '#/components/schemas/TvlSummary'
        meta:
          $ref: '#/components/schemas/BasicMeta'
    ErrorBody:
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          description: Machine-readable error code (e.g. `NOT_FOUND`, `UNAUTHORIZED`)
        details: {}
        message:
          type: string
          description: Human-readable error message
    TvlTimeseriesSourceAmount:
      type: object
      description: 'One series of the day''s breakdown. `id` is a curated strategy id

        (`prime_lending`, `balanced_lending`, `frontier_lending`, …) in

        `mode=strategy`, an admin chain slug (`ethereum`, `base`, …) in

        `mode=chain`, or one of the reserved ids `aera`, `aera_v2`,

        `solana`, `uncategorized`. Every point carries the same ids in the

        same order, and they sum to the point''s `tvl`.'
      required:
      - id
      - label
      - tvl
      properties:
        id:
          type: string
        label:
          type: string
        tvl:
          $ref: '#/components/schemas/TvlAmount'
    TvlSummary:
      type: object
      required:
      - tvl
      - updated_at
      - totals
      properties:
        breakdown:
          type:
          - array
          - 'null'
          items:
            $ref: '#/components/schemas/TvlBreakdown'
        totals:
          type: array
          items:
            $ref: '#/components/schemas/TvlTotal'
        tvl:
          $ref: '#/components/schemas/TvlAmount'
        updated_at:
          type: string
          format: date-time
    BasicMeta:
      type: object
      required:
      - request_id
      - refreshed_at
      properties:
        refreshed_at:
          type: string
          format: date-time
        request_id:
          type: string
    TvlAmount:
      type: object
      required:
      - usd
      properties:
        usd:
          type: string
    WindowMeta:
      type: object
      description: 'Doc type for a windowed timeseries served as one fixed grid: every

        point in the window, so there is no page cap and no cursor. Split

        from [`TimeseriesMeta`], whose required `limit` those handlers leave

        `None`. That would put a never-populated required field in the

        generated SDK types.'
      required:
      - request_id
      - refreshed_at
      - count
      - start
      - end
      properties:
        count:
          type: integer
          format: int64
          description: Number of points in this response.
        data_as_of:
          type:
          - string
          - 'null'
          format: date-time
          description: 'When the served data was computed, on endpoints that serve a

            cached snapshot past its refresh window while a refresh runs

            behind the response. Absent means the data is current.'
        end:
          type: string
          format: date-time
        partial_errors:
          type:
          - array
          - 'null'
          items:
            $ref: '#/components/schemas/PartialResponseError'
          description: Item-scoped failures isolated from an aggregate response.
        refreshed_at:
          type: string
          format: date-time
        request_id:
          type: string
        start:
          type: string
          format: date-time
          description: Window bounds the response covers.
    ErrorResponse:
      type: object
      description: Standard error response envelope returned on 4xx/5xx
      required:
      - error
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
    TvlTotal:
      type: object
      required:
      - id
      - label
      - tvl
      - updated_at
      properties:
        id:
          type: string
        label:
          type: string
        tvl:
          $ref: '#/components/schemas/TvlAmount'
        updated_at:
          type: string
          format: date-time
    TvlTimeseriesResponse:
      type: object
      required:
      - meta
      - data
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/TvlTimeseriesPoint'
        meta:
          $ref: '#/components/schemas/WindowMeta'
x-provenance:
  method: harvested
  publisher: Gauntlet
  source: https://api.gauntlet.xyz/docs/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)