Uniswap v4 Subgraph
Query Uniswap v4 onchain-indexed data through The Graph decentralized network GraphQL API. Hosted service endpoints are deprecated; use the gateway URL with a Studio API key.
For expanded query examples and entity field tables, read
references/v4-queries.md.
API Overview
- Protocol: GraphQL over HTTPS (POST)
- Mainnet explorer: DiYPVdygkfjDWhbxGSqAQxwBKmfKnkWQojqeM2rkLb3G
- GraphQL endpoint template:
https://gateway.thegraph.com/api/<THEGRAPH_API_KEY>/subgraphs/id/DiYPVdygkfjDWhbxGSqAQxwBKmfKnkWQojqeM2rkLb3G - Auth: API key from The Graph Studio
- Schema / code: Uniswap/v4-subgraph
- Docs: v4 Queries, v4 Query Examples, Subgraphs Overview
Auth setup
export THEGRAPH_API_KEY="..."
# key from https://thegraph.com/studio/apikeys/
Never hardcode the key. Prefer $THEGRAPH_API_KEY from the environment.
Reliability note
Public explorer links and gateway IDs in Uniswap docs are example community deployments, not guaranteed official Uniswap Labs production indexers. Before relying on data: confirm the deployment is actively indexed, schema matches expectations, and chain/contracts align. For production, prefer deploying from the official v4-subgraph repo.
Key Differences from v3
- Query global metrics from
poolManager, notfactory. - Pool
idis a bytes32 hash of the pool key (tokens, fee, tick spacing, hooks) — not a deployed pool contract address. - Pool entities include
hooks(hook contract address, if any). - Positions track
subscriptions,unsubscriptions, andtransfers(not the v3 mint/burn/collect position model).
PoolManager IDs
Ethereum mainnet (and docs examples) use:
0x000000000004444c5dc75cb358380d2e3de08a90
Other chains use different PoolManager addresses. Resolve them from
v4 Deployments
or networks.json in the subgraph repo. Always lowercase hex IDs in queries
when the deployment expects checksum-insensitive IDs.
Known deployments by chain
The Graph Explorer / Uniswap docs only surface the Ethereum mainnet id
directly — for anything else you're on your own. These additional ids were
cross-referenced across three independent third-party integrations
(ParaSwap paraswap-dex-lib, DefiLlama DefiLlama-Adapters, and
salviega/streams-contracts) as of Jul 2026. Treat as community-sourced,
not Uniswap Labs-confirmed — re-verify indexing status before relying on
them in production (see Reliability note above).
| Chain | Subgraph id | PoolManager |
|---|---|---|
| Ethereum | DiYPVdygkfjDWhbxGSqAQxwBKmfKnkWQojqeM2rkLb3G |
0x000000000004444c5dc75cb358380d2e3de08a90 |
| Base | HNCFA9TyBqpo5qpe6QreQABAA1kV8g46mhkCcicu6v2R |
0x498581ff718922c3f8e6a244956af099b2652b2b |
| BNB Chain | 2qQpC8inZPZL4tYfRQPFGZhsE8mYzE67n5z3Yf5uuKMu |
0x28e2ea090877bf75740558f6bfb36a5ffee9e9df |
| Polygon | CwpebM66AH5uqS5sreKij8yEkkPcHvmyEs7EwFtdM5ND |
0x67366782805870060151383f4bbff9dab53e5cd6 |
Chains without a public v4 subgraph
- World Chain — Uniswap indexes v4 there on a private Goldsky
deployment (
GOLD_SKY_WORLDCHAIN_V4_ID, perUniswap/routing-apisource), not on The Graph decentralized network. No public subgraph id exists to query here — use GeckoTerminal (networkworld-chain, seecoingecko-and-coinmarketcap-apis) for pool/TVL data on this chain instead of guessing at an id. - Gnosis — Uniswap v4 is not deployed at all (only earlier versions elsewhere); nothing to query on any indexer.
If a chain you need isn't in the table above, don't guess an id from a single
source — cross-check at least two independent integrations (search GitHub for
gateway.thegraph.com/api/subgraphs/id or thegraph.com/api/subgraphs/id
near the chain name) before trusting one repo, since a single project can
carry a stale or wrong id.
Core Entities
| Entity | Use for |
|---|---|
PoolManager |
Protocol-wide pool count, tx count, volume, TVL, fees |
Pool |
Liquidity, sqrtPrice, tick, feeTier, hooks, volume |
Token |
Symbol/name/decimals and aggregates across v4 pools |
Swap |
Individual swaps (amounts, sender, timestamp) |
Position |
NFT tokenId positions + subscribe/transfer events |
PoolDayData / PoolHourData |
Pool time-series |
TokenDayData / TokenHourData |
Token time-series |
ModifyLiquidity |
Liquidity add/remove events |
Common Queries
Protocol metrics
{
poolManager(id: "0x000000000004444c5dc75cb358380d2e3de08a90") {
poolCount
txCount
totalVolumeUSD
totalVolumeETH
totalValueLockedUSD
}
}
Pool state
{
pool(id: "0x21c67e77068de97969ba93d4aab21826d33ca12bb9f565d8496e8fda8a82ca27") {
token0 { symbol id decimals }
token1 { symbol id decimals }
feeTier
liquidity
sqrtPrice
tick
hooks
volumeUSD
totalValueLockedUSD
}
}
Most liquid pools
{
pools(first: 100, orderBy: liquidity, orderDirection: desc) {
id
token0 { symbol }
token1 { symbol }
feeTier
liquidity
volumeUSD
hooks
}
}
Recent swaps in a pool
{
swaps(
first: 20
orderBy: timestamp
orderDirection: desc
where: { pool: "0x21c67e77068de97969ba93d4aab21826d33ca12bb9f565d8496e8fda8a82ca27" }
) {
sender
origin
amount0
amount1
amountUSD
timestamp
}
}
Token aggregates
{
token(id: "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984") {
symbol
name
decimals
volumeUSD
poolCount
totalValueLockedUSD
}
}
Position by NFT tokenId
{
position(id: "3") {
id
tokenId
owner
subscriptions { id }
unsubscriptions { id }
transfers { id }
}
}
Pool daily series
{
poolDayDatas(
first: 10
orderBy: date
where: {
pool: "0x21c67e77068de97969ba93d4aab21826d33ca12bb9f565d8496e8fda8a82ca27"
date_gt: 1735689600
}
) {
date
liquidity
sqrtPrice
token0Price
token1Price
volumeToken0
volumeToken1
}
}
Historical (time-travel) at a block
{
poolManager(
id: "0x000000000004444c5dc75cb358380d2e3de08a90"
block: { number: 22451931 }
) {
poolCount
totalVolumeUSD
}
}
How to Call (curl)
ENDPOINT="https://gateway.thegraph.com/api/${THEGRAPH_API_KEY}/subgraphs/id/DiYPVdygkfjDWhbxGSqAQxwBKmfKnkWQojqeM2rkLb3G"
curl -s "$ENDPOINT" \
-H 'Content-Type: application/json' \
-d '{"query":"{ poolManager(id: \"0x000000000004444c5dc75cb358380d2e3de08a90\") { poolCount txCount totalVolumeUSD } }"}' \
| jq '.'
Alternate auth style used by some clients:
curl -s "https://gateway.thegraph.com/api/subgraphs/id/DiYPVdygkfjDWhbxGSqAQxwBKmfKnkWQojqeM2rkLb3G" \
-H "Authorization: Bearer ${THEGRAPH_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{"query":"{ pools(first: 5, orderBy: liquidity, orderDirection: desc) { id liquidity } }"}' \
| jq '.'
Calling from a browser (CORS)
The gateway (gateway.thegraph.com) responds with
access-control-allow-origin: * (confirmed Jul 2026), so fetch() works
directly from client-side code — e.g. a static HTML artifact — without a
proxy. The API key is then visible to anyone reading the page's source or
localStorage; never embed a paid or high-quota key in anything public,
and prefer making the key an optional user-supplied input (stored in the
visitor's own localStorage) over baking it into shipped code.
Pagination
The Graph caps results at 1000 per request. Use first + skip:
{
pools(first: 1000, skip: 0, orderBy: liquidity, orderDirection: desc) {
id
}
}
Increment skip by 1000 until fewer than 1000 rows return.
Workflow
- Confirm intent: global metrics, pool state, swaps, token, position, or day data.
- Ensure
$THEGRAPH_API_KEYis set; if missing, ask the user to create one in Studio. - Pick the correct subgraph deployment for the chain (mainnet ID above; discover others in The Graph Explorer).
- Use the chain-correct
poolManagerid and pool bytes32 ids (not v3 pool addresses). - POST GraphQL with
curland parse withjq. - If more than 1000 rows are needed, paginate with
skip. - Present a short snapshot first (counts, top pools, latest swaps), then detail.
- Treat data as informational; do not give investment advice.
Error Handling
- Missing / invalid API key (
401/403): remind user to setTHEGRAPH_API_KEYfrom Studio. - GraphQL
errorsarray: show message; usually bad field, bad id, or schema mismatch. - Empty
data/ null entity: wrong chain deployment, wrong PoolManager id, or unknown pool/token id. - Timeouts / 429: backoff and retry 1–2 times; avoid tight polling loops.
- Stale or inconsistent TVL: public deployments can lag or disagree with app.uniswap.org; state the source deployment id used.
Presenting Results
- Global:
poolCount,txCount,totalVolumeUSD,totalValueLockedUSD. - Pools: pair symbols,
feeTier,liquidity,volumeUSD,hooks. - Swaps: amounts,
amountUSD,timestamp,sender/origin. - Positions:
tokenId,owner, subscription/transfer counts. - Always cite chain + subgraph id when summarizing.
Out of Scope
This skill does not cover in v1:
- Uniswap v2 / v3 subgraphs (separate deployments)
- Onchain contract calls / SDK swaps (Universal Router, Permit2)
- Private Uniswap Labs indexers used by the official app
- Deploying or maintaining a subgraph (point to the GitHub repo only)
Reference
Expanded examples and entity tables: references/v4-queries.md