GraphQL
GMX provides GraphQL endpoints powered by Subsquid for querying indexed on-chain data. Arbitrum, Avalanche, and MegaETH continue to index new activity; the Botanix endpoint is a frozen historical surface.
| Network | Status | URL |
|---|---|---|
| Arbitrum One | ✅ Active | https://gmx.squids.live/gmx-synthetics-arbitrum:prod/api/graphql |
| Avalanche C-Chain | ✅ Active | https://gmx.squids.live/gmx-synthetics-avalanche:prod/api/graphql |
| MegaETH | ✅ Active | https://gmx.squids.live/gmx-synthetics-megaeth:prod/api/graphql |
| Botanix | ⚠️ Frozen historical data | https://gmx.squids.live/gmx-synthetics-botanix:prod/api/graphql |
The Botanix endpoint remains available for historical queries, but it no longer advances with new chain activity. Don't use it for current activity or as evidence of active Botanix trading support. Its schema is frozen along with its data, so the additions listed below aren't available there — glvUserEarnings, for example, is missing on Botanix while present on the active endpoints. Query the schema before reusing an active-chain query against it.
Schema changes
2026-07-21 — Referral flow and positive funding PnL clarified
Affiliate analytics now distinguish traders who leave an affiliate because they graduated to a GMX direct-discount code from traders who were otherwise lost.
| Surface | Change |
|---|---|
AffiliateTraderStatsByHour | Added tradersGraduated |
affiliateStats points | Added tradersGraduated |
affiliateStats summary | Added tradersGraduated and tradersGraduatedDelta |
tradersNet is calculated as tradersGained - tradersGraduated - tradersLost. The AccountStat.positiveFundingFeesUsd field is the signed PnL contribution from funding received through ClaimableFundingUpdated, whether claimed or not. It is excluded from realizedFees, so add it to PnL once rather than treating it as another realized fee.
2026-07-17 — TWAP grouping metadata migrated
The indexer now reads TWAP grouping metadata from the first valid gmxo entry in Order.dataList. It falls back to decoding the legacy synthetic uiFeeReceiver format for older orders. The public numberOfParts and twapGroupId fields remain the integration surface; you don't need to decode either metadata format yourself.
2026-07-15 — Order UI fee snapshots added
Order and TradeAction now expose uiFeeFactor, the factor snapshotted when the order was created. The field is nullable because historical rows created before the snapshot was added don't contain it. Treat null as unavailable historical data, not as a zero factor.
2026-07-14 — GLV user earnings added
The schema now tracks GLV fee earnings by account and exposes a public glvUserEarnings(account: String!) resolver.
| Entity or resolver | Added surface |
|---|---|
Glv | glvTokenSupply, cumulativeFeeUsdPerGlvToken |
CollectedFeesInfo | cumulativeFeeUsdPerGlvToken |
GlvTokenBalance | Current balance, realized cumulative income, and entry snapshot for one account and GLV |
GlvTokenBalanceChange | Ordered balance-change history used to reconstruct the 7-day window |
glvUserEarnings | glvAddress, lifetimeFeeUsd, and recent7dFeeUsd for each GLV held by an account |
The resolver calculates lifetime earnings from realized income plus the account's unrealized share of the current fee accumulator. Its 7-day value uses hourly snapshots at the window edge and clamps a negative result to zero.
2026-06-23 — Referral code update support
The GraphQL schema now includes the referral entities needed to evaluate GMX-managed protocol referral code updates. These additions support the backend workflow that moves eligible traders to organic volume-discount codes or graduated direct-discount codes.
Expanded referral fields.
| Entity | Added fields |
|---|---|
TraderReferralTradeStatsByHour | affiliateRewardsUsd |
Additional referral entities.
| Entity | What it provides |
|---|---|
TraderFirstReferral | First-assignment timestamp for a trader and referral code pair |
ReferralTier | Tier configuration with totalRebate and discountShare |
ReferrerTier | Current tier id for a referrer address |
The private referralCodeUpdates resolver is used by GMX-maintained services and is not a public integration surface. Public referral dashboards should continue to use affiliateStats, traderReferralStats, and the referral entities described below.
2026-05-28 — Trade PnL, market info, and funding snapshots expanded
The GraphQL schema and indexer-derived analytics now expose a more detailed split between realized PnL, swap fees, discounts, market funding state, and hourly rate snapshots.
Expanded fields.
| Entity | Added fields |
|---|---|
AccountStat | realizedSwapFees, realizedSwapImpact |
PositionChange | swapFeeUsd |
TradeAction | swapFeeUsd, traderDiscountAmount |
PositionFeesEntity | traderDiscountAmount |
MarketInfo | minCollateralFactorForLiquidation, savedFundingFactorPerSecond, fundingUpdatedAt, useOpenInterestInTokensForBalance |
The account PnL summary server extension also includes a fuller debug breakdown for fees, price impact, discounts, and swap impact. Use these fields when you need to distinguish base realized PnL from fee and impact components instead of treating trade-history PnL as one all-in number.
Hourly rate snapshots now replay the funding formula from indexed market state, including MarketInfo, savedFundingFactorPerSecond, fundingUpdatedAt, open interest, and relevant DataStore settings. They are still historical indexer snapshots, not realtime market state.
2026-03-31 — Referral analytics added
The GraphQL schema now exposes referral analytics for both affiliates and traders. Five new entities track referral code ownership and hourly trade statistics, and two new query resolvers aggregate that data into time-windowed summaries with period-over-period comparisons.
New entities.
| Entity | What it provides |
|---|---|
ReferralCodeOwner | Maps a referral code to its owner address, with updatedAtTimestamp, updatedAtBlock, and updatedTxnHash |
TraderReferral | Records which referralCode and affiliate a trader is associated with, plus update metadata |
AffiliateReferralTradeStatsByHour | Hourly trade stats for an affiliate: volumeUsd, tradesCount, and rebatesUsd |
TraderReferralTradeStatsByHour | Hourly trade stats for a trader using a referral code: volumeUsd, discountsUsd, and affiliateRewardsUsd |
AffiliateTraderStatsByHour | Hourly net trader flow for an affiliate: tradersGained, tradersLost, and tradersNet |
New query resolvers.
These are custom server-extension resolvers, not standard entity queries. Call them by name with a where argument:
| Resolver | Input fields | What it returns |
|---|---|---|
affiliateStats | affiliate (required), from?, to? | Time-windowed volume, trade count, rebates, and trader flow for an affiliate, with optional period comparison |
traderReferralStats | trader (required), from?, to? | Time-windowed volume and discounts for a trader using a referral code, with optional period comparison |
Both resolvers align timestamps to hourly buckets and choose a bucket size automatically based on the requested window length.
Example queries.
# Affiliate dashboard: volume, rebates, and trader flow for a 7-day window
query AffiliateStats($affiliate: String!) {
affiliateStats(where: { affiliate: $affiliate, from: 1743292800, to: 1743897600 }) {
affiliate
from
to
bucketSizeSeconds
hasComparison
summary {
volumeUsd
volumeUsdDelta
rebatesUsd
rebatesUsdDelta
tradersNet
tradersNetDelta
}
points {
timestamp
volumeUsd
rebatesUsd
tradersGained
tradersLost
tradersNet
}
}
}
# Trader dashboard: volume and discounts earned through a referral code
query TraderReferralStats($trader: String!) {
traderReferralStats(where: { trader: $trader, from: 1743292800, to: 1743897600 }) {
trader
from
to
bucketSizeSeconds
summary {
volumeUsd
discountsUsd
}
points {
timestamp
volumeUsd
discountsUsd
}
}
}
2026-03-10 - Staking power and account analytics added
The GraphQL schema now exposes staking power analytics plus expanded daily account aggregates for PnL and capital-tracking queries.
New entities.
| Entity | What it provides |
|---|---|
StakingPower | Per-account staking power state, including accumulatedPower, currentStakedBalance, historicalMaxStaked, lastPowerResetAt, and powerResetCount |
NetworkStakingPower | Network-wide staking power totals through totalAccumulatedPower, totalCurrentStaked, and lastUpdateTimestamp |
Expanded analytics fields.
| Entity | Added fields |
|---|---|
AccountStat | account, period, dayTimestamp, netCapitalDelta, maxNetCapitalRunningDelta |
Position | maxCapital |
These additions let you query staking-power history and daily account-level capital changes without replaying raw position-change events yourself.
Example query.
query AccountAnalytics($account: String!) {
stakingPower(id: $account) {
accumulatedPower
currentStakedBalance
historicalMaxStaked
lastPowerResetAt
powerResetCount
}
accountStats(
where: { account_eq: $account, period_eq: "1d" }
orderBy: dayTimestamp_DESC
limit: 7
) {
dayTimestamp
netCapitalDelta
maxNetCapitalRunningDelta
volume
realizedPnl
}
}
2026-02-24 — Transaction entity removed
The Transaction entity type has been removed from the GraphQL schema. This change is live on all main endpoints. A backward-compatible endpoint is available until March 1, 2026:
https://gmx.squids.live/gmx-synthetics-arbitrum@786bd0/api/graphql
Field changes. Entities that previously referenced transaction: Transaction! now expose a flat transactionHash: String! field. The timestamp field that was nested inside Transaction is now a top-level field on each entity.
| Entity | Old field | New field |
|---|---|---|
TradeAction | transaction: Transaction! | transactionHash: String! |
ClaimAction | transaction: Transaction! | transactionHash: String! |
Order | createdTxn: Transaction! | createdTxnHash: String! |
Order | cancelledTxn: Transaction | cancelledTxnHash: String |
Order | executedTxn: Transaction | executedTxnHash: String |
SwapFeesInfo | transaction: Transaction! | transactionHash: String! |
SwapInfo | transaction: Transaction! | transactionHash: String! |
PositionFeesEntity | transaction: Transaction! | transactionHash: String! |
Distribution | transaction: Transaction! | transactionHash: String! |
Sort field changes. Sort values that referenced the transaction relation are replaced with direct field sorts:
| Old sort value | New sort value |
|---|---|
transaction_timestamp_DESC | timestamp_DESC |
transaction_timestamp_ASC | timestamp_ASC |
Example migration. A TradeAction query before and after:
# Before
tradeActions(limit: 50, orderBy: transaction_timestamp_DESC) {
eventName
transaction {
timestamp
hash
}
}
# After
tradeActions(limit: 50, orderBy: timestamp_DESC) {
eventName
timestamp
transactionHash
}