Ava Labs Looking Glass API

Looking Glass is a tool that allows users to look up information for future airdrops.

Operations 6

GET /v2/chains/{chainId}/contracts/{address}/nfts:listHolders Get NFT holders by contract address #
GET /v2/chains/{chainId}/contracts/{address}/balances Get addresses by balance over time #
GET /v2/chains/43114/btcb/bridged:getAddresses Get addresses by BTCb bridged balance #
GET /v2/subnets/{subnetId}/validators:getAddresses Get addresses running validators during a given time frame #
POST /v1/lookingGlass/compositeQuery Composite query #
POST /v2/lookingGlass/compositeQuery Composite query #

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/ava-labs-looking-glass-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

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

OpenAPI Specification

ava-labs-looking-glass-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Metrics Looking Glass API
  description: The Metrics API provides metrics and analytics of on-chain activity. The API is in Beta and may be subject to change.</br></br>If you have feedback or feature requests for the API, please submit them <a href="https://portal.productboard.com/dndv9ahlkdfye4opdm8ksafi/tabs/4-glacier-api">here</a>. Bug reports can be submitted <a href="https://docs.google.com/forms/d/e/1FAIpQLSeJQrcp7QoNiqozMDKrVJGX5wpU827d3cVTgF8qa7t_J1Pb-g/viewform">here</a>, and any potential security issues can be reported <a href="https://hackenproof.com/avalanche">here</a>.
  version: 1.0.0
  contact: {}
servers:
- url: https://metrics.avax.network
tags:
- name: Looking Glass
  description: Looking Glass is a tool that allows users to look up information for future airdrops.
paths:
  /v2/chains/{chainId}/contracts/{address}/nfts:listHolders:
    get:
      operationId: getNftHoldersByContractAddress
      x-execution-weight: large
      x-speakeasy-group: metrics.chains
      x-speakeasy-name-override: listNftHolders
      x-speakeasy-pagination:
        type: cursor
        inputs:
        - name: pageToken
          in: parameters
          type: cursor
        outputs:
          nextCursor: $.nextPageToken
      x-codeSamples:
      - lang: javascript
        label: JavaScript
        source: "import { Avalanche } from \"@avalanche-sdk/chainkit\";\n\nconst avalanche = new Avalanche({\n  chainId: \"43114\",\n});\n\nasync function run() {\n  const result = await avalanche.metrics.chains.listNftHolders({\n    pageSize: 10,\n    address: \"0x7a420AEFF902AAa2c85a190D7B91Ce8BEFffFE14\",\n  });\n\n  for await (const page of result) {\n    console.log(page);\n  }\n}\n\nrun();"
      summary: Get NFT holders by contract address
      description: Get list of NFT holders and number of NFTs held by contract address.
      parameters:
      - name: pageToken
        required: false
        in: query
        description: A page token, received from a previous list call. Provide this to retrieve the subsequent page.
        schema:
          type: string
      - name: pageSize
        required: false
        in: query
        description: The maximum number of items to return. The minimum page size is 1. The maximum pageSize is 5000.
        schema:
          type: integer
          default: 1000
          minimum: 1
          maximum: 5000
        example: '10'
      - name: chainId
        required: true
        in: path
        description: A supported evm chain id. Use the `/chains` endpoint to get a list of supported chain ids.
        example: '43114'
        schema:
          type: string
      - name: address
        required: true
        in: path
        description: Contract address on the relevant chain.
        example: '0x7a420AEFF902AAa2c85a190D7B91Ce8BEFffFE14'
        schema:
          type: string
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NftHoldersResponse'
        '400':
          description: "Bad requests generally mean the client has passed invalid \n    or malformed parameters. Error messages in the response could help in \n    evaluating the error."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: "When a client attempts to access resources that require \n    authorization credentials but the client lacks proper authentication \n    in the request, the server responds with 401."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Unauthorized'
        '403':
          description: "When a client attempts to access resources with valid\n    credentials but doesn't have the privilege to perform that action, \n    the server responds with 403."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Forbidden'
        '404':
          description: "The error is mostly returned when the client requests\n    with either mistyped URL, or the passed resource is moved or deleted, \n    or the resource doesn't exist."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFound'
        '429':
          description: "This error is returned when the client has sent too many,\n    and has hit the rate limit."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequests'
        '500':
          description: "The error is a generic server side error that is \n    returned for any uncaught and unexpected issues on the server side. \n    This should be very rare, and you may reach out to us if the problem \n    persists for a longer duration."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
        '502':
          description: "This is an internal error indicating invalid response \n      received by the client-facing proxy or gateway from the upstream server."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadGateway'
        '503':
          description: "The error is returned for certain routes on a particular\n    Subnet. This indicates an internal problem with our Subnet node, and may \n    not necessarily mean the Subnet is down or affected."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
      tags:
      - Looking Glass
  /v2/chains/{chainId}/contracts/{address}/balances:
    get:
      operationId: getAddressesByBalanceOverTime
      x-execution-weight: xl
      x-speakeasy-group: metrics.chains
      x-speakeasy-name-override: listTokenHoldersAboveThreshold
      x-speakeasy-pagination:
        type: cursor
        inputs:
        - name: pageToken
          in: parameters
          type: cursor
        outputs:
          nextCursor: $.nextPageToken
      x-codeSamples:
      - lang: javascript
        label: JavaScript
        source: "import { Avalanche } from \"@avalanche-sdk/chainkit\";\n\nconst avalanche = new Avalanche({\n  chainId: \"43114\",\n});\n\nasync function run() {\n  const result = await avalanche.metrics.chains.listTokenHoldersAboveThreshold({\n    threshold: \"1000000\",\n    startTimestamp: 1689541049,\n    endTimestamp: 1689800249,\n    pageSize: 10,\n    address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n  });\n\n  for await (const page of result) {\n    console.log(page);\n  }\n}\n\nrun();"
      summary: Get addresses by balance over time
      description: Get list of addresses and their latest balances that have held more than a certain threshold of a given token during the specified time frame.
      parameters:
      - name: threshold
        required: true
        in: query
        description: The minimum balance for which addresses should be considered.
        example: '1000000'
        schema:
          type: string
      - name: startTimestamp
        required: false
        in: query
        description: Query param for retrieving items after a specific timestamp.
        example: 1689541049
        schema:
          minimum: 0
          type: integer
      - name: endTimestamp
        required: false
        in: query
        description: Query param for retrieving items before a specific timestamp.
        example: 1689800249
        schema:
          minimum: 0
          type: integer
      - name: pageToken
        required: false
        in: query
        description: A page token, received from a previous list call. Provide this to retrieve the subsequent page.
        schema:
          type: string
      - name: pageSize
        required: false
        in: query
        description: The maximum number of items to return. The minimum page size is 1. The maximum pageSize is 5000.
        schema:
          type: integer
          default: 1000
          minimum: 1
          maximum: 5000
        example: '10'
      - name: chainId
        required: true
        in: path
        description: A supported evm chain id. Use the `/chains` endpoint to get a list of supported chain ids.
        example: '43114'
        schema:
          type: string
      - name: address
        required: true
        in: path
        description: Contract address on the relevant chain.
        example: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E'
        schema:
          type: string
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LookingGlassResponse'
        '400':
          description: "Bad requests generally mean the client has passed invalid \n    or malformed parameters. Error messages in the response could help in \n    evaluating the error."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: "When a client attempts to access resources that require \n    authorization credentials but the client lacks proper authentication \n    in the request, the server responds with 401."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Unauthorized'
        '403':
          description: "When a client attempts to access resources with valid\n    credentials but doesn't have the privilege to perform that action, \n    the server responds with 403."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Forbidden'
        '404':
          description: "The error is mostly returned when the client requests\n    with either mistyped URL, or the passed resource is moved or deleted, \n    or the resource doesn't exist."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFound'
        '429':
          description: "This error is returned when the client has sent too many,\n    and has hit the rate limit."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequests'
        '500':
          description: "The error is a generic server side error that is \n    returned for any uncaught and unexpected issues on the server side. \n    This should be very rare, and you may reach out to us if the problem \n    persists for a longer duration."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
        '502':
          description: "This is an internal error indicating invalid response \n      received by the client-facing proxy or gateway from the upstream server."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadGateway'
        '503':
          description: "The error is returned for certain routes on a particular\n    Subnet. This indicates an internal problem with our Subnet node, and may \n    not necessarily mean the Subnet is down or affected."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
      tags:
      - Looking Glass
  /v2/chains/43114/btcb/bridged:getAddresses:
    get:
      operationId: getAddressesByBtcbBridged
      x-execution-weight: large
      x-speakeasy-group: metrics.chains
      x-speakeasy-name-override: listBTCbBridgersAboveThreshold
      x-speakeasy-pagination:
        type: cursor
        inputs:
        - name: pageToken
          in: parameters
          type: cursor
        outputs:
          nextCursor: $.nextPageToken
      x-codeSamples:
      - lang: javascript
        label: JavaScript
        source: "import { Avalanche } from \"@avalanche-sdk/chainkit\";\n\nconst avalanche = new Avalanche();\n\nasync function run() {\n  const result = await avalanche.metrics.chains.listBTCbBridgersAboveThreshold({\n    threshold: \"1000000\",\n    pageSize: 10,\n  });\n\n  for await (const page of result) {\n    console.log(page);\n  }\n}\n\nrun();"
      summary: Get addresses by BTCb bridged balance
      description: Get list of addresses and their net bridged amounts that have bridged more than a certain threshold.
      parameters:
      - name: threshold
        required: true
        in: query
        description: The minimum balance for which addresses should be considered.
        example: '1000000'
        schema:
          type: string
      - name: pageToken
        required: false
        in: query
        description: A page token, received from a previous list call. Provide this to retrieve the subsequent page.
        schema:
          type: string
      - name: pageSize
        required: false
        in: query
        description: The maximum number of items to return. The minimum page size is 1. The maximum pageSize is 5000.
        schema:
          type: integer
          default: 1000
          minimum: 1
          maximum: 5000
        example: '10'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LookingGlassResponse'
        '400':
          description: "Bad requests generally mean the client has passed invalid \n    or malformed parameters. Error messages in the response could help in \n    evaluating the error."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: "When a client attempts to access resources that require \n    authorization credentials but the client lacks proper authentication \n    in the request, the server responds with 401."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Unauthorized'
        '403':
          description: "When a client attempts to access resources with valid\n    credentials but doesn't have the privilege to perform that action, \n    the server responds with 403."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Forbidden'
        '404':
          description: "The error is mostly returned when the client requests\n    with either mistyped URL, or the passed resource is moved or deleted, \n    or the resource doesn't exist."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFound'
        '429':
          description: "This error is returned when the client has sent too many,\n    and has hit the rate limit."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequests'
        '500':
          description: "The error is a generic server side error that is \n    returned for any uncaught and unexpected issues on the server side. \n    This should be very rare, and you may reach out to us if the problem \n    persists for a longer duration."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
        '502':
          description: "This is an internal error indicating invalid response \n      received by the client-facing proxy or gateway from the upstream server."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadGateway'
        '503':
          description: "The error is returned for certain routes on a particular\n    Subnet. This indicates an internal problem with our Subnet node, and may \n    not necessarily mean the Subnet is down or affected."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
      tags:
      - Looking Glass
  /v2/subnets/{subnetId}/validators:getAddresses:
    get:
      operationId: getValidatorsByDateRange
      x-execution-weight: large
      x-speakeasy-group: metrics.subnets
      x-speakeasy-name-override: getValidators
      x-speakeasy-pagination:
        type: cursor
        inputs:
        - name: pageToken
          in: parameters
          type: cursor
        outputs:
          nextCursor: $.nextPageToken
      x-codeSamples:
      - lang: javascript
        label: JavaScript
        source: "import { Avalanche } from \"@avalanche-sdk/chainkit\";\n\nconst avalanche = new Avalanche();\n\nasync function run() {\n  const result = await avalanche.metrics.subnets.getValidators({\n    startTimestamp: 1689541049,\n    endTimestamp: 1689800249,\n    pageSize: 10,\n    subnetId: \"11111111111111111111111111111111LpoYY\",\n    network: \"mainnet\",\n  });\n\n  for await (const page of result) {\n    console.log(page);\n  }\n}\n\nrun();"
      summary: Get addresses running validators during a given time frame
      description: Get list of addresses and AddValidatorTx timestamps set to receive awards for validation periods during the specified time frame.
      parameters:
      - name: startTimestamp
        required: false
        in: query
        description: Query param for retrieving items after a specific timestamp.
        example: 1689541049
        schema:
          minimum: 0
          type: integer
      - name: endTimestamp
        required: false
        in: query
        description: Query param for retrieving items before a specific timestamp.
        example: 1689800249
        schema:
          minimum: 0
          type: integer
      - name: pageToken
        required: false
        in: query
        description: A page token, received from a previous list call. Provide this to retrieve the subsequent page.
        schema:
          type: string
      - name: pageSize
        required: false
        in: query
        description: The maximum number of items to return. The minimum page size is 1. The maximum pageSize is 5000.
        schema:
          type: integer
          default: 1000
          minimum: 1
          maximum: 5000
        example: '10'
      - name: subnetId
        required: true
        in: path
        description: The subnet ID to filter by.
        example: 11111111111111111111111111111111LpoYY
        schema:
          type: string
      - name: network
        required: false
        in: query
        description: Either mainnet or testnet/fuji.
        example: mainnet
        schema:
          $ref: '#/components/schemas/Network'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PChainLookingGlassResponse'
        '400':
          description: "Bad requests generally mean the client has passed invalid \n    or malformed parameters. Error messages in the response could help in \n    evaluating the error."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: "When a client attempts to access resources that require \n    authorization credentials but the client lacks proper authentication \n    in the request, the server responds with 401."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Unauthorized'
        '403':
          description: "When a client attempts to access resources with valid\n    credentials but doesn't have the privilege to perform that action, \n    the server responds with 403."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Forbidden'
        '404':
          description: "The error is mostly returned when the client requests\n    with either mistyped URL, or the passed resource is moved or deleted, \n    or the resource doesn't exist."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFound'
        '429':
          description: "This error is returned when the client has sent too many,\n    and has hit the rate limit."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequests'
        '500':
          description: "The error is a generic server side error that is \n    returned for any uncaught and unexpected issues on the server side. \n    This should be very rare, and you may reach out to us if the problem \n    persists for a longer duration."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
        '502':
          description: "This is an internal error indicating invalid response \n      received by the client-facing proxy or gateway from the upstream server."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadGateway'
        '503':
          description: "The error is returned for certain routes on a particular\n    Subnet. This indicates an internal problem with our Subnet node, and may \n    not necessarily mean the Subnet is down or affected."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
      tags:
      - Looking Glass
  /v1/lookingGlass/compositeQuery:
    post:
      operationId: compositeQueryV1
      x-execution-weight: xxl
      x-speakeasy-ignore: true
      summary: Composite query
      description: Composite query to get list of addresses from multiple subqueries.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompositeQueryRequestDto'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompositeQueryResponse'
        '400':
          description: "Bad requests generally mean the client has passed invalid \n    or malformed parameters. Error messages in the response could help in \n    evaluating the error."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: "When a client attempts to access resources that require \n    authorization credentials but the client lacks proper authentication \n    in the request, the server responds with 401."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Unauthorized'
        '403':
          description: "When a client attempts to access resources with valid\n    credentials but doesn't have the privilege to perform that action, \n    the server responds with 403."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Forbidden'
        '404':
          description: "The error is mostly returned when the client requests\n    with either mistyped URL, or the passed resource is moved or deleted, \n    or the resource doesn't exist."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFound'
        '429':
          description: "This error is returned when the client has sent too many,\n    and has hit the rate limit."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequests'
        '500':
          description: "The error is a generic server side error that is \n    returned for any uncaught and unexpected issues on the server side. \n    This should be very rare, and you may reach out to us if the problem \n    persists for a longer duration."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
        '502':
          description: "This is an internal error indicating invalid response \n      received by the client-facing proxy or gateway from the upstream server."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadGateway'
        '503':
          description: "The error is returned for certain routes on a particular\n    Subnet. This indicates an internal problem with our Subnet node, and may \n    not necessarily mean the Subnet is down or affected."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
      tags:
      - Looking Glass
  /v2/lookingGlass/compositeQuery:
    post:
      operationId: compositeQueryV2
      x-execution-weight: xxl
      x-speakeasy-name-override: compositeQuery
      x-speakeasy-pagination:
        type: cursor
        inputs:
        - name: pageToken
          in: requestBody
          type: cursor
        outputs:
          nextCursor: $.nextPageToken
      summary: Composite query
      description: Composite query to get list of addresses from multiple subqueries.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompositeQueryRequestDto'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompositeQueryResponse'
        '400':
          description: "Bad requests generally mean the client has passed invalid \n    or malformed parameters. Error messages in the response could help in \n    evaluating the error."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequest'
        '401':
          description: "When a client attempts to access resources that require \n    authorization credentials but the client lacks proper authentication \n    in the request, the server responds with 401."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Unauthorized'
        '403':
          description: "When a client attempts to access resources with valid\n    credentials but doesn't have the privilege to perform that action, \n    the server responds with 403."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Forbidden'
        '404':
          description: "The error is mostly returned when the client requests\n    with either mistyped URL, or the passed resource is moved or deleted, \n    or the resource doesn't exist."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFound'
        '429':
          description: "This error is returned when the client has sent too many,\n    and has hit the rate limit."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequests'
        '500':
          description: "The error is a generic server side error that is \n    returned for any uncaught and unexpected issues on the server side. \n    This should be very rare, and you may reach out to us if the problem \n    persists for a longer duration."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerError'
        '502':
          description: "This is an internal error indicating invalid response \n      received by the client-facing proxy or gateway from the upstream server."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadGateway'
        '503':
          description: "The error is returned for certain routes on a particular\n    Subnet. This indicates an internal problem with our Subnet node, and may \n    not necessarily mean the Subnet is down or affected."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailable'
      tags:
      - Looking Glass
components:
  schemas:
    BadGateway:
      type: object
      properties:
        message:
          description: The error message describing the reason for the exception
          oneOf:
          - type: string
          - type: array
            items:
              type: string
        statusCode:
          type: number
          description: The HTTP status code of the response
          examples:
          - 502
        error:
          type: string
          description: The type of error
          examples:
          - Bad Gateway
      required:
      - message
      - statusCode
      - error
    DateRangeStarsArenaMinBalanceParam:
      type: object
      properties:
        firstDate:
          type: string
        lastDate:
          type: string
        minBalance:
          type: string
        subjectAddress:
          type: string
      required:
      - firstDate
      - lastDate
      - minBalance
      - subjectAddress
    DateRangeNftHoldersParam:
      type: object
      properties:
        firstDate:
          type: string
        lastDate:
          type: string
        evmChainId:
          type: string
        contractAddress:
          type: string
      required:
      - firstDate
      - lastDate
      - evmChainId
      - contractAddress
    DateRangeMinBalanceParam:
      type: object
      properties:
        firstDate:
          type: string
        lastDate:
          type: string
        minBalance:
          type: string
        evmChainId:
          type: string
      required:
      - firstDate
      - lastDate
      - minBalance
      - evmChainId
    TimestampRangeNftHoldersParam:
      type: object
      properties:
        evmChainId:
          type: string
        contractAddress:
          type: string
        startTs:
          type: number
        endTs:
          type: number
      required:
      - evmChainId
      - contractAddress
      - startTs
      - endTs
    AllTimeNativeBalanceQueryDto:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
          enum:
          - AllTimeNativeBalance
        params:
          $ref: '#/components/schemas/DateRangeMinBalanceParam'
      required:
      - id
      - type
      - params
    Unauthorized:
      type: object
      properties:
        message:
          description: The error message describing the reason for the exception
          oneOf:
          - type: string
          - type: array
            items:
              type: string
        statusCode:
          type: number
          description: The HTTP status code of the response
          examples:
          - 401
        error:
          type: string
          description: The type of error
          examples:
          - Unauthorized
      required:
      - message
      - statusCode
      - error
    LookingGlassResponse:
      type: object
      properties:
        nextPageToken:
          type: string
          description: A token, which can be sent as `pageToken` to retrieve the next page. If this field is omitted or empty, there are no subsequent pages.
        addresses:
          description: List of addresses that match provided criteria.
          type: array
          items:
            $ref: '#/components/schemas/AddressDetails'
      required:
      - addresses
    ServiceUnavailable:
      type: object
      properties:
        message:
          description: The error message describing the reason for the exception
          oneOf:
          - type: string
          - type: array
            items:
              type: string
        statusCode:
          type: number
          description: The HTTP status code of the response
          examples:
          - 503
        error:
          type: string
          description:

# --- truncated at 32 KB (45 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/ava-labs/refs/heads/main/openapi/ava-labs-looking-glass-api-openapi.yml