MetaDAO Dex Screener API
DexScreener HTTP adapter v1.1. Block numbers are Solana slots.
DexScreener HTTP adapter v1.1. Block numbers are Solana slots.
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/metadao:metadao-dexscreener-api"
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.
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: 3.2.0
info:
title: Futarchy External Dex Screener API
version: 2.0.0
description: 'Public, read-only HTTP API serving Futarchy protocol DEX data (FutarchyAMM spot markets, plus Meteora pools for daily market data) to aggregators such as CoinGecko, CoinMarketCap, DexScreener and Jupiter, and to dashboards.
**Versioning.** Every data endpoint is served under `/v1` (e.g. `/v1/api/tickers`) and, unchanged, at its unversioned path, which is a frozen alias of v1. Health, probe, metrics and docs endpoints are not versioned. Breaking changes ship as a new version prefix. A deprecated version answers with `Deprecation` (RFC 9745), `Sunset` (RFC 8594) and `Link: ; rel="successor-version"` headers.
**Units.** Token amounts, prices and volumes are in human units (already divided by the mint decimals). Most adapters serve them as decimal strings; fields suffixed `Raw` are integer strings in base units. Adapters whose consumer requires JSON numbers (CoinMarketCap, DexScreener, the Jupiter supply endpoints) serve numbers, as noted per schema.
**Rate limits.** Anonymous clients get 60 requests per minute per IP. Trusted partners send an `X-API-Key` header and get a higher limit; an unknown key is rejected with 401 `INVALID_API_KEY`. Rate-limited responses carry `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` (seconds); a 429 also carries `Retry-After` (seconds). Container probes (`/health/startup`, `/health/ready`, `/health/live`) are not rate limited. Limits are enforced across all replicas when the deployment shares a Redis store.
**Caching.** Successful data responses are sent with `Cache-Control: private, max-age=30` (client-side reuse only; responses carry per-caller rate-limit headers). Errors, health and metrics responses are `Cache-Control: no-store`. Responses over 1 KB are compressed (`br`, `gzip` or `deflate`) when the request sends `Accept-Encoding`.
**Serving invariant.** Infrastructure failures (Solana RPC, served database) return a 5xx. The API never answers 200 with zero, empty, or placeholder financial data because a dependency failed. Retry on 5xx; treat a 200 as authoritative.
**Errors.** Every error is JSON in one shape, the `Error` schema: `{ error, code, field?, requestId }`. Branch on `code` (stable), not on the `error` message (human-readable, may change); `field` names the offending parameter on a 400. Each request may take each query parameter at most once: a repeated parameter is a 400 `INVALID_QUERY_PARAMETER`. Unknown routes return 404 `NOT_FOUND`. A request that exceeds the server timeout returns 503 `REQUEST_TIMEOUT`.'
servers:
- url: /
tags:
- name: DexScreener
description: DexScreener HTTP adapter v1.1. Block numbers are Solana slots.
paths:
/dexscreener/latest-block:
servers:
- url: /v1
description: Versioned (recommended for new integrations)
- url: /
description: Unversioned alias of v1, kept for existing integrations
get:
operationId: getDexScreenerLatestBlock
summary: Latest indexed block
description: Slot and timestamp of the newest indexed FutarchyAMM spot swap.
tags:
- DexScreener
security:
- {}
- apiKey: []
responses:
'200':
description: Latest block.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlPublic'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/json:
schema:
$ref: '#/components/schemas/DexScreenerLatestBlockResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/DexScreenerNotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
/dexscreener/asset:
servers:
- url: /v1
description: Versioned (recommended for new integrations)
- url: /
description: Unversioned alias of v1, kept for existing integrations
get:
operationId: getDexScreenerAsset
summary: Asset metadata
description: Token name, symbol, decimals and supply. Cached server-side for 5 minutes. If supply cannot be loaded (RPC failure) the request fails with a 5xx rather than returning the asset without it.
tags:
- DexScreener
security:
- {}
- apiKey: []
parameters:
- name: id
in: query
required: true
description: Token mint address.
schema:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: Solana public key (base58).
examples:
- So11111111111111111111111111111111111111112
responses:
'200':
description: Asset.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlPublic'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/json:
schema:
$ref: '#/components/schemas/DexScreenerAssetResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
/dexscreener/pair:
servers:
- url: /v1
description: Versioned (recommended for new integrations)
- url: /
description: Unversioned alias of v1, kept for existing integrations
get:
operationId: getDexScreenerPair
summary: Pair metadata
description: Pair identity and creation block (first spot swap). Cached server-side for 5 minutes. 404 when the DAO has no spot swaps.
tags:
- DexScreener
security:
- {}
- apiKey: []
parameters:
- name: id
in: query
required: true
description: 'Pair id: the DAO address.'
schema:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: Solana public key (base58).
examples:
- So11111111111111111111111111111111111111112
responses:
'200':
description: Pair.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlPublic'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/json:
schema:
$ref: '#/components/schemas/DexScreenerPairResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/DexScreenerNotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
/dexscreener/events:
servers:
- url: /v1
description: Versioned (recommended for new integrations)
- url: /
description: Unversioned alias of v1, kept for existing integrations
get:
operationId: getDexScreenerEvents
summary: Swap events by block range
description: FutarchyAMM spot swap events with `fromBlock <= slot <= toBlock`, ordered by slot then transaction. The range may span at most 500,000 slots (`toBlock - fromBlock <= 500000`); larger ranges, non-integer or negative bounds, and `toBlock < fromBlock` are 400.
tags:
- DexScreener
security:
- {}
- apiKey: []
parameters:
- name: fromBlock
in: query
required: true
description: First slot, inclusive.
schema:
type: integer
minimum: 0
- name: toBlock
in: query
required: true
description: Last slot, inclusive. Must be >= fromBlock and at most fromBlock + 500000.
schema:
type: integer
minimum: 0
responses:
'200':
description: Swap events.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlPublic'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
X-Request-Id:
$ref: '#/components/headers/XRequestId'
content:
application/json:
schema:
$ref: '#/components/schemas/DexScreenerEventsResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/ServiceUnavailable'
components:
schemas:
DexScreenerEventsResponse:
type: object
required:
- events
properties:
events:
type: array
items:
$ref: '#/components/schemas/DexScreenerSwapEvent'
DexScreenerSwapEvent:
type: object
description: A swap. asset0 is the base token, asset1 the quote token. Buys carry `asset1In` + `asset0Out`; sells carry `asset0In` + `asset1Out`. Amounts are JSON numbers in human units.
required:
- block
- eventType
- txnId
- txnIndex
- eventIndex
- maker
- pairId
- priceNative
properties:
block:
$ref: '#/components/schemas/DexScreenerBlock'
eventType:
type: string
const: swap
txnId:
type: string
description: Transaction signature.
txnIndex:
type: integer
description: Index of the transaction among this API's events in the slot.
eventIndex:
type: integer
description: Index of the event within the transaction.
maker:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: Trader wallet.
examples:
- So11111111111111111111111111111111111111112
pairId:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: DAO address (pair id).
examples:
- So11111111111111111111111111111111111111112
asset0In:
type: number
asset1In:
type: number
asset0Out:
type: number
asset1Out:
type: number
priceNative:
type: number
description: Quote per base.
reserves:
type: object
description: Post-swap pool reserves (human units). Omitted if unknown.
required:
- asset0
- asset1
properties:
asset0:
type: number
asset1:
type: number
DexScreenerAssetResponse:
type: object
required:
- asset
properties:
asset:
$ref: '#/components/schemas/DexScreenerAsset'
Error:
type: object
description: The error body of every endpoint.
required:
- error
- code
- requestId
properties:
error:
type: string
description: Human-readable message. May change; branch on `code`.
code:
type: string
description: Stable machine-readable code.
examples:
- NOT_FOUND
- RATE_LIMITED
- INVALID_API_KEY
- INVALID_QUERY_PARAMETER
- INVALID_MINT_ADDRESS
- SERVED_DB_UNAVAILABLE
- SERVED_DATA_STALE
- REQUEST_TIMEOUT
- INTERNAL_ERROR
field:
type: string
description: 'On a 400: the request parameter that was rejected.'
examples:
- startDate
- id
requestId:
type: string
description: Request id, same as the `X-Request-Id` header.
DexScreenerPair:
type: object
required:
- id
- dexKey
- asset0Id
- asset1Id
- feeBps
- createdAtBlockNumber
- createdAtBlockTimestamp
- createdAtTxnId
properties:
id:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: DAO address.
examples:
- So11111111111111111111111111111111111111112
dexKey:
type: string
const: futarchyAMM
asset0Id:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: Base token mint.
examples:
- So11111111111111111111111111111111111111112
asset1Id:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: Quote token mint.
examples:
- So11111111111111111111111111111111111111112
feeBps:
type: integer
description: Protocol fee in basis points (e.g. 50).
createdAtBlockNumber:
type: integer
description: Slot of the first spot swap.
createdAtBlockTimestamp:
type: integer
description: Unix seconds.
createdAtTxnId:
type: string
description: Signature of the first spot swap.
DexScreenerBlock:
type: object
required:
- blockNumber
- blockTimestamp
properties:
blockNumber:
type: integer
description: Solana slot.
blockTimestamp:
type: integer
description: Unix seconds.
DexScreenerPairResponse:
type: object
required:
- pair
properties:
pair:
$ref: '#/components/schemas/DexScreenerPair'
DexScreenerLatestBlockResponse:
type: object
required:
- block
properties:
block:
$ref: '#/components/schemas/DexScreenerBlock'
DexScreenerAsset:
type: object
required:
- id
- name
- symbol
- totalSupply
- circulatingSupply
- metadata
properties:
id:
type: string
pattern: ^[1-9A-HJ-NP-Za-km-z]{32,44}$
description: Token mint.
examples:
- So11111111111111111111111111111111111111112
name:
type: string
description: Falls back to the first 8 characters of the mint.
symbol:
type: string
description: Falls back to the first 8 characters of the mint.
totalSupply:
type: number
description: Human units.
circulatingSupply:
type: number
description: Human units.
metadata:
type: object
required:
- decimals
properties:
decimals:
type: string
description: Mint decimals as a string.
additionalProperties:
type: string
responses:
Unauthorized:
description: Unknown `X-API-Key` (`INVALID_API_KEY`), or missing/invalid metrics bearer token on `/metrics`.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlNoStore'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: 'Invalid request: `INVALID_MINT_ADDRESS` for a bad path address, `INVALID_QUERY_PARAMETER` for a missing, malformed or repeated query parameter. `field` names the parameter.'
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlNoStore'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ServiceUnavailable:
description: A dependency is unavailable or its data is stale (e.g. `SERVED_DB_UNAVAILABLE`, `SERVED_DATA_STALE`) or the request timed out (`REQUEST_TIMEOUT`). Retry later.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlNoStore'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
TooManyRequests:
description: Rate limit exceeded (`RATE_LIMITED`).
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlNoStore'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
DexScreenerNotFound:
description: 'No matching data (`NOT_FOUND`: "Pair not found" / "No blocks available").'
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlNoStore'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
InternalError:
description: Unexpected server or upstream (RPC/DB) failure. Retry later.
headers:
Cache-Control:
$ref: '#/components/headers/CacheControlNoStore'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
headers:
RetryAfter:
description: Seconds to wait before retrying.
schema:
type: integer
RateLimitRemaining:
description: Requests remaining in the current window.
schema:
type: integer
RateLimitReset:
description: Seconds until the current window resets.
schema:
type: integer
RateLimitLimit:
description: Requests allowed per window for this client tier.
schema:
type: integer
CacheControlPublic:
description: '`private, max-age=30` on successful data responses.'
schema:
type: string
examples:
- private, max-age=30
CacheControlNoStore:
description: '`no-store` on errors, health and metrics responses.'
schema:
type: string
const: no-store
XRequestId:
description: Request id (echoes a safe client-supplied `X-Request-Id`, otherwise a generated UUID). Quote it when reporting problems.
schema:
type: string
securitySchemes:
apiKey:
type: apiKey
in: header
name: X-API-Key
description: Optional partner key. Requests without it are served at the anonymous rate limit (60/min per IP); a valid key gets the trusted limit; an unknown key is rejected with 401 `INVALID_API_KEY`.
metricsBearer:
type: http
scheme: bearer
description: Required on `/metrics` only when the server sets `METRICS_TOKEN`; the token is that value. When `METRICS_TOKEN` is unset, `/metrics` is open.