Ava Labs Looking Glass API
Looking Glass is a tool that allows users to look up information for future airdrops.
Looking Glass is a tool that allows users to look up information for future airdrops.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/ava-labs-looking-glass-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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