Read-only GraphQL for Boros market data. Clients call named persisted operations — no raw query strings.
Every request is a POST with an operationName and a variables object. Raw query text is rejected — the GraphQL document for each operation lives on the server and is selected by name. Advanced clients may send operationId instead, but not together with operationName.
The beta endpoint is public and does not require an API key. It is still constrained to the persisted operations and variable caps listed below. Usehttps://graphql.borosexplorer.com as the canonical public URL.
curl -s https://graphql.borosexplorer.com \
-H 'content-type: application/json' \
--data '{"operationName":"MarketDirectory","variables":{"status":"live","limit":10,"offset":0}}'Try any operation directly from this page. Pick a name, fill the variables, and run it against the live endpoint.
query ApiInfo {
api_info(limit: 1) {
api_name
schema_version
release_channel
read_only
public_unauthenticated
generated_at
}
}Click Run to see a live response.Every accepted operation is listed below with its root response key, variables, and bounds. Inputs use camelCase variable names such as marketId, fromTs, and toTs. Calls outside these bounds are rejected with a 400 before reaching the GraphQL backend. A ! suffix marks a required variable; = marks the default when omitted. Status filters accept live, pending, and expired.
| Name | Root key | Variables | Limit cap | Cache TTL |
|---|---|---|---|---|
| ApiInfo | api_info | none | fixed | 300s |
| Freshness | freshness | none | fixed | 15s |
| MarketById | market_details | marketId! | fixed | 15s |
| MarketDirectory | markets | status=live, limit=50, offset=0 | 100 | 15s |
| MarketHistory | market_history_hourly | marketId!, fromTs!, toTs!, limit=500, offset=0 | 500 | 120s |
| MarketLiquidationsV2 | liquidations_v2 | marketId!, limit=100, offset=0 | 100 | 30s |
| MarketLiquidations | liquidations | marketId!, limit=100, offset=0 | 100 | 30s |
| MarketSettlementRates | settlement_rates | marketId!, fromTs!, toTs!, limit=100, offset=0 | 100 | 120s |
| MarketTradeExecutionsV1 | trade_executions_v1 | marketId!, limit=100, offset=0 | 100 | 0s |
| MarketTradesV2 | trades_v2 | marketId!, limit=100, offset=0 | 100 | 30s |
| MarketTrades | trades | marketId!, limit=100, offset=0 | 100 | 30s |
| RecentLiquidationsV2 | liquidations_v2 | limit=100, offset=0 | 100 | 30s |
| RecentLiquidations | liquidations | limit=100, offset=0 | 100 | 30s |
| RecentTradeExecutionsV1 | recent_trade_executions_v1 | limit=100 | 100 | 0s |
| RecentTradesV2 | trades_v2 | limit=100, offset=0 | 100 | 15s |
| RecentTrades | trades | limit=100, offset=0 | 100 | 15s |
| SettlementRates | settlement_rates | limit=100, offset=0 | 100 | 120s |
| VaultDirectory | vaults | status=live, limit=100, offset=0 | 100 | 60s |
| VaultHistory | vault_history | marketId!, fromTs!, toTs!, limit=500, offset=0 | 500 | 300s |
Operations select from the models below. The public response root key is the key under data; the underlying view name is included for provenance.
| View | Root key | Purpose |
|---|---|---|
| gql.market_summaries | markets | Filterable market directory with status, OI, volume, APR, and provenance. |
| gql.market_details | market_details | Single-market detail fields with current snapshot and parameter context. |
| gql.market_history_hourly | market_history_hourly | Hourly market chart points for APR, OI, volume, mark, bid/ask. |
| gql.trades | trades | Trade ledger with raw size and USD-estimate fields, joined to market metadata. |
| gql.trade_execution_state_v1 | trade_execution_state_v1 | Execution publication readiness, paging generation, compatible writer contracts, integrity, and pending-source state. |
| gql.trade_executions_v1 | trade_executions_v1 | Certified orderbook and OTC executions with complete, deterministic party-role arrays. |
| gql.recent_trade_executions_v1 | recent_trade_executions_v1 | Hard-bounded global top-100 certified executions, expanded only after indexed candidate selection. |
| gql.liquidations | liquidations | Forced-close events with signed raw size, USD estimate, and fee fields. |
| gql.settlement_rates | settlement_rates | Exchange funding settlement rows joined to Boros market windows. |
| gql.vault_summaries | vaults | Current AMM vault state joined to market metadata. |
| gql.vault_history | vault_history | Historical AMM vault TVL, APY, capacity, and utilization. |
| gql.api_info | api_info | API metadata: version, channel, read-only state. |
| gql.freshness | freshness | Latest source timestamps and freshness state. |
Conventions that hold across every operation:
0.0521 = 5.21%). Output time fields ending in _at are UTC ISO strings. Input window variables fromTs and toTsmust be Unix epoch seconds, not ISO strings or JavaScript milliseconds.limit variable normally also accept offset.RecentTradeExecutionsV1 is the exception: it is a fixed global top-100 snapshot with no offset. The market-bounded canonical execution operation caps offset at 1,000. Compare its scope_generation on every page and restart at offset zero if the generation changes. Offset pagination on live trade and liquidation ledgers is best-effort because new rows can land between requests. Trades are ordered by block_timestamp desc, id desc; market-bounded canonical executions use block_number desc, log_index desc, execution_id desc; liquidations by block_timestamp desc, block_number desc, log_index desc.Freshness when you need a global staleness check without pulling market rows. It accepts no variables and returns the fixed source set.X-Boros-GraphQL-Cache response header. The canonical execution operations list a zero-second TTL and return no-storeso writer publication changes are visible immediately.Validation errors from this endpoint return { "error": { "message": "..." } }. Backend execution errors are normalized to the same envelope instead of exposing backend-specific paths.
| Status | Cause |
|---|---|
| 400 | malformed body, raw query text, unknown operation, or variables outside the manifest cap |
| 413 | request body exceeds 64 KiB |
| 415 | missing application/json content-type |
| 405 | method other than POST or OPTIONS |
| 500 | proxy configuration is missing |
| 502 | GraphQL backend did not respond or returned an execution error |