{"openapi":"3.1.0","info":{"title":"Lodestar","version":"0.1.0","description":"The Graph protocol's indexers, delegators, curators and subgraphs, read from nuthatch nests rather than from a subgraph. Every answer carries a provenance envelope saying which block it was sealed through.\n\nPaths are generated from the router, so this document cannot describe a route that does not exist or omit one that does. A few routes are served but not described, because documenting them would advertise something that is not a public protocol read; those are listed under `x-withheld` with the reason, so this document is still a complete inventory of what is served."},"servers":[{"url":"https://api.lodestar-dashboard.com"}],"paths":{"/api/analytics/clickthrough":{"get":{"summary":"Record one trade click or protocol visit from the dashboard.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/apr-provenance/{address}":{"get":{"summary":"Why an indexer's APR moved: delegation events and cut changes on one timeline.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/chain-lag":{"get":{"summary":"Per-chain head, lag and liveness, sampled across indexers.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/curators":{"get":{"summary":"The curator directory.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/delegate/recommend":{"get":{"summary":"Which indexer to delegate to, ranked against four preference sliders, with the reasoning.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/delegation-events":{"get":{"summary":"Individual delegations and undelegations.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/delegation-flows":{"get":{"summary":"Delegation in and out, aggregated by day.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/developer-activity":{"get":{"summary":"Subgraph publishing and versioning activity.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/dips":{"get":{"summary":"Where protocol issuance actually goes.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/dips/agreements":{"get":{"summary":"The Direct Indexer Payments agreement lifecycle: offered, accepted, active, collected, ended. Empty on Arbitrum One until an agreement is funded, and it says so.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/disassembly":{"get":{"summary":"What a deployed subgraph's mappings can actually do, read off the WebAssembly.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/disassembly/diff":{"get":{"summary":"What changed between two deployments: handlers, host surface, risk flags and strings.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/dropped-chains":{"get":{"summary":"Chains an indexer has stopped serving since we last looked.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/ens":{"get":{"summary":"The primary ENS name for an address, forward-verified, or null where it has none. With ?name=, the address a .eth name resolves to.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/epochs":{"get":{"summary":"Recent epochs with their rewards and query fees.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/grt-flow":{"get":{"summary":"GRT minted, burned and bridged.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/horizon/activity":{"get":{"summary":"Recent Horizon protocol activity.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer-disputes/{address}":{"get":{"summary":"Disputes and slashing raised against one indexer.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer-node-health":{"get":{"summary":"Whether an indexer's own endpoints answer.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer-stake-history/{address}":{"get":{"summary":"Twenty-six weeks of one indexer's stake and delegation.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer-status/{address}":{"get":{"summary":"What one indexer's own endpoint says it is serving.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}":{"get":{"summary":"One indexer in full. A section that could not be read is left out and named under `degraded`.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/delegators":{"get":{"summary":"Every delegator of one indexer, a page at a time: `first` (at most 1,000), `skip`, `orderBy` one of stake, delegatedAt, lastChangeAt or thawingTokens, and `orderDirection`. Each row carries its shares, what they are worth now, what is thawing and until when, and when the position opened and last changed; `total` counts every listed position and `active` those still holding shares.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/pnl":{"get":{"summary":"That revenue netted against a modelled infrastructure cost. The cost side is an estimate the caller may override, not a measurement.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/qos":{"get":{"summary":"Edge & Node's gateway QoS for one indexer per UTC day, read from the oracle's own postings: queries, success rate and latency weighted by queries, fees, five-minute buckets seen and how many were bad, and seconds behind the freshest peer.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/qos-deployments":{"get":{"summary":"The deployments behind the QoS Quality score, heaviest drag first.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/qos-score":{"get":{"summary":"The QoS Quality score over thirty days of that feed, its four sub-scores and served gap, and the score for each of the last thirty days.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/revenue":{"get":{"summary":"What an indexer received over a window ending today, by UTC day and by deployment: query fees after the protocol, curators and delegators, and rewards after the delegators, each dated by the collection that paid it, with the collected figures beside them.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexer/{address}/trends":{"get":{"summary":"Indexing rewards, split between the indexer and its delegators, and query fees collected, to curators, to the protocol and what the indexer received after the delegators' cut, per UTC day. Dated by the event that paid them, not by allocation close.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexers":{"get":{"summary":"The indexer directory, scored and ordered.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexers-enriched":{"get":{"summary":"The directory with the computed columns the dashboard ranks by.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/indexing-status/{hash}":{"get":{"summary":"Who is serving a deployment, whether they are synced, and whether anyone can answer a paid query.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/issue-forms":{"get":{"summary":"The graph-support issue forms, parsed into fields, and whether this deployment can file.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/manifest":{"get":{"summary":"How hard a subgraph is to sync, scored out of a hundred with the reasoning attached.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/network-stats":{"get":{"summary":"Protocol-wide totals: stake, delegation, signal, allocation, supply and the current epoch.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/operator-preflight":{"get":{"summary":"What would happen if an address tried to run a data service. Read-only: no wallet, no gas.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/parameter-history/{address}":{"get":{"summary":"When an indexer changed its cut, and what it changed from.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/payments":{"get":{"summary":"Query-fee collections and RAV redemptions.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/poi":{"get":{"summary":"Proof-of-indexing consensus across indexers.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/portfolio":{"get":{"summary":"One address's position as a delegator or an indexer.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/price":{"get":{"summary":"The GRT price in USD, with its age.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/provisions":{"get":{"summary":"One indexer's Horizon provisions.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/provisions/detail":{"get":{"summary":"One indexer's thaw requests, fee cuts, service ranges and Horizon activity.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/qos/capture":{"get":{"summary":"How allocated stake sits across quality bands. Unscored means not measured, which is most of it.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/reo":{"get":{"summary":"The rewards-eligibility oracle's verdict for an address, with its staleness.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/rewards-history":{"get":{"summary":"One address's indexing rewards over time.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/service-census":{"get":{"summary":"Every data service's registered providers, and whether their endpoints actually answer.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/sql/catalog":{"get":{"summary":"The datasets the SQL surface exposes, and what is in them.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/sql/named":{"get":{"summary":"The named-query tier: what may be asked, and asking it by name.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-curation/{hash}":{"get":{"summary":"Who has signalled on a deployment, and how much.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-deployment/{hash}":{"get":{"summary":"One subgraph deployment's directory row, by IPFS hash.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-deployment/{hash}/graft-children":{"get":{"summary":"Deployments whose cached manifest grafts onto this hash, with graft block and published name and label where known.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-deployments":{"get":{"summary":"Deployments with their signal, stake and fees. With ?hash=Qm…, that one deployment.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-directory":{"get":{"summary":"Every listed deployment, filtered by signal, stake, ratio, fees, network, complexity, category and age, sorted and paged.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-fees-30d":{"get":{"summary":"Thirty days of query fees per deployment.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-history/{hash}":{"get":{"summary":"A deployment's weekly signal and stake.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-names":{"get":{"summary":"Display names for a set of deployments.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-schema/{hash}":{"get":{"summary":"The GraphQL schema a deployment was built from, as text.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-search":{"get":{"summary":"Search deployments by name, hash prefix or contract address.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/subgraph-versions/{hash}":{"get":{"summary":"Every version of the subgraph that published a deployment, with its signal and stake.","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/support":{"get":{"summary":"The nightswatchhq/graph-support archive, mirrored twice a day.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/support/templates":{"get":{"summary":"The graph-support issue forms, as the repository's own YAML.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/support/{number}":{"get":{"summary":"One graph-support thread: the opening post and every reply.","parameters":[{"name":"number","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/token-metrics":{"get":{"summary":"Supply and price over time.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}},"/api/tvl":{"get":{"summary":"Total value locked on Arbitrum.","parameters":[],"responses":{"200":{"description":"The answer, with a provenance envelope."},"400":{"description":"The request was not understood; the message says why."},"429":{"description":"Rate limited."},"503":{"description":"A source this route depends on is not answering."}}}}},"x-withheld":[{"path":"/api/sql/query","reason":"takes arbitrary SQL. The named tier at /api/sql/named is the described one: it answers the same questions with a name and typed arguments, and can be documented without documenting a way to ask anything at all"},{"path":"/api/file-issue","reason":"opens an issue in a public repository on a reporter's behalf, authored by one credential. Documenting it as an anonymous endpoint would be an invitation to write into somebody else's issue tracker through us"},{"path":"/api/health","reason":"reports on this deployment rather than on the protocol. It exists under /api because that is the URL the platform's health endpoint had and monitors already point at it"},{"path":"/api/whoami","reason":"a diagnostic that reports the caller's own address back to them; it describes the request rather than the protocol"},{"path":"/api/studio/auth","reason":"a session- and wallet-signature-scoped product route, not a public protocol read"},{"path":"/api/studio/bounties","reason":"the Dock's shared write-side state; reads and mutations belong to signed-in Studio users"},{"path":"/api/studio/bounties/{id}","reason":"reconciles one shared bounty against its on-chain state"},{"path":"/api/studio/deploy-key","reason":"mints an account secret and must not be advertised as anonymous API access"},{"path":"/api/studio/ipfs/{*path}","reason":"a deploy-key-authenticated IPFS proxy, not a public IPFS gateway"},{"path":"/api/studio/metadata","reason":"uploads metadata to IPFS for a signed-in Studio user"},{"path":"/api/studio/node","reason":"a deploy-key-authenticated graph-cli compatibility endpoint"},{"path":"/api/studio/subgraphs","reason":"lists and mutates the signed-in Studio user's subgraphs"},{"path":"/api/studio/subgraphs/{id}","reason":"mutates one signed-in Studio user's subgraph"},{"path":"/api/sql/receipt","reason":"issues a signed receipt and is a POST; this document describes GET operations, and a receipt is obtained by asking for one rather than by reading a path"},{"path":"/api/data-services/query","reason":"runs a real sample query against a provider and is a POST; it spends a signed receipt rather than reading the protocol"},{"path":"/api/indexer/present-poi","reason":"queues an action on an indexer's own agent and is a POST; it acts on somebody's infrastructure rather than reading the protocol"},{"path":"/api/foghorn/{*path}","reason":"a pass-through to Foghorn's QoS API; its shape is Foghorn's rather than ours, and it is documented where that service is"}]}