SQD developer resources
Everything needed to build against SQD, each at a URL that does not move. The SQD Portal API and its OpenAPI specification, how authentication and rate limits work, what the API guarantees and how it announces a change, the SQD MCP servers, the Squid CLI, and the files an agent reads before any of it.
If you are an agent, start with llms.txt and openapi.json. Every page on sqd.dev is also served as Markdown to a request that asks for it.
SQD Portal API
The SQD Portal is a plain HTTP API serving onchain data from 130+ networks, with no node,
archive, or indexer of your own. Responses to the stream endpoints are
JSON Lines, so a client reads them
incrementally instead of buffering a whole range. Start at
GET /datasets: the dataset name every other call takes
comes from that list.
- SQD Portal base URLhttps://portal.sqd.devHost every Portal API call goes to
- SQD Portal API referencehttps://docs.sqd.dev/en/api/evm/introductionEndpoint reference and request playground
- SQD Portal quickstarthttps://docs.sqd.dev/en/portal/evm/quickstartFirst query, start to finish
- Dataset listhttps://portal.sqd.dev/datasetsEvery network this Portal serves, with aliases
OpenAPI specification
The whole documented Portal surface is described in OpenAPI 3.1 at
sqd.dev/openapi.json. Every
operation carries a stable operationId, typed
parameters, and a response schema, which is what a function-calling adapter or a client
generator needs. It is also the document to diff in a pipeline when you want to detect a
change to the API.
- OpenAPI specificationhttps://sqd.dev/openapi.jsonOpenAPI 3.1, an operationId and a response schema per operation
- OpenAPI specification (documentation copy)https://docs.sqd.dev/openapi.jsonThe same API, published from the documentation site
Authentication
The public Portal at https://portal.sqd.dev is shared
capacity, intended for development and bounded evaluation. Authenticated and dedicated
portals take an API key in the x-api-key request
header. Paths and payloads are identical either way, so a client written against the public
Portal moves to a dedicated one by adding one header and changing the host.
- API keys and access optionshttps://docs.sqd.dev/en/portal/pricingPublic, authenticated and dedicated portals, and how keys are issued
- Request a dedicated portalhttps://sqd.dev/contact/Contact form for keys, volume and dedicated capacity
Rate limits and retries
When the Portal is at capacity it answers with error type
rate_limit_error and code
overloaded. A
Retry-After header is mandatory on those responses, is
always at least one second, and is always a count of seconds rather than an HTTP date. Honor
it: that value is the throttle signal, and there is no separate quota header to poll.
A transient failure arrives as availability_error
instead, which may also carry Retry-After and is safe to
retry with your own backoff when it does not. Branch on
error.type, match on
error.code, and never parse
error.message.
Browser clients can read the throttle signal: the Portal exposes
retry-after and
x-request-id through CORS, alongside the stream
metadata headers x-sqd-data-source,
x-sqd-head-number,
x-sqd-finalized-head-number and
x-sqd-finalized-head-hash. None of those are on the
Fetch safelist, so without that exposure a browser would see a status code and nothing else.
Quote x-request-id when reporting a problem.
- Error handling and retrieshttps://docs.sqd.dev/en/portal/introduction/error-handlingThe error envelope, the four error types, and when to retry
- Rate limitshttps://docs.sqd.dev/en/portal/introduction/versioningShared capacity, Retry-After, and the authenticated options
Versioning and deprecation policy
The Portal API carries no version in its URL and no version header. There is no
/v1/. Every client talks to the same surface at
https://portal.sqd.dev, and that works because the
surface grows by addition: new dataset types, new block and transaction fields, and new
datasets appear without changing what an existing request means.
- Endpoint paths and HTTP methodsThe prose in error.message
- The error envelope {"error":{"type","code","message"}}The order of datasets in GET /datasets
- error.type, a closed set of four valuesThe set of datasets, which grows and is occasionally pruned
- error.code values, once publishedWorker assignments in GET /datasets/{dataset}/state
- Field names in a selector, once accepted
The surface that does move is the dataset catalogue. Datasets are added as networks are
onboarded, and occasionally retired. A retirement is announced in advance on the
Announcements page and in
the developer chat, naming the
affected datasets and a date, so watch that page rather than polling for removals. After the
date, GET /datasets/{dataset}/metadata answers
404 with error.code of
unknown_dataset.
The SDKs are versioned separately, as npm packages following semantic versioning. A breaking change lands in a major release with a migration guide, and the Portal keeps serving older SDK versions: the wire format they depend on is the same additive surface described above.
- Versioning and change policyhttps://docs.sqd.dev/en/portal/introduction/versioningWhat is stable, what is not, and how the API changes
- Announcementshttps://docs.sqd.dev/announcementsDeprecations and dataset retirements, announced ahead of the date
- Changeloghttps://docs.sqd.dev/changelogWhat was released, and when
MCP servers
Two SQD MCP servers, for two different jobs. The SQD Portal MCP server at
https://portal.sqd.dev/mcp exposes onchain queries as
agent tools, across EVM, Solana, Bitcoin, Substrate and Hyperliquid. The SQD Documentation
MCP server at https://docs.sqd.dev/mcp answers
questions from the documentation. Both speak the Streamable HTTP transport and negotiate
protocol version 2025-06-18. Neither needs a key.
One handshake detail decides whether a client connects at all. The Streamable HTTP transport
requires the initializing POST to accept both media types, and a request sending only
application/json is answered
406 Not Acceptable, as is a request with no
Accept header. The exact call that works:
Most MCP clients send that header pair for you. Add the server by URL and the client handles the rest; the setup guides cover Claude, Cursor, VS Code and the rest.
- SQD Portal MCP serverhttps://portal.sqd.dev/mcpOnchain queries as agent tools, over Streamable HTTP
- SQD Documentation MCP serverhttps://docs.sqd.dev/mcpSearch and retrieval over the documentation, over Streamable HTTP
- MCP server cardhttps://sqd.dev/.well-known/mcp.jsonMachine-readable description of the Portal MCP server
- Portal MCP setup guidehttps://docs.sqd.dev/en/ai/mcp-serverClient configuration for Claude, Cursor, VS Code and others
- Documentation MCP setup guidehttps://docs.sqd.dev/en/ai/mcp-server-docsClient configuration for the documentation server
Squid CLI
The Squid CLI is published on npm as
@subsquid/cli and installs one command,
sqd. It scaffolds an indexer from a template, runs it
locally, and deploys and manages it on SQD Cloud, which means an agent or a script can drive
the whole lifecycle without writing an API client first.
- Squid CLI on npmhttps://www.npmjs.com/package/@subsquid/cliPackage @subsquid/cli, which installs the sqd command
- Squid CLI sourcehttps://github.com/subsquid/squid-cliRepository, issues and release history
- SQD Cloud deploymenthttps://docs.sqd.dev/en/cloud/overviewWhat sqd deploy targets, and how to operate it
SDKs
Two SDKs and the raw API, for three different jobs. The Pipes SDK builds streaming pipelines into ClickHouse, PostgreSQL, BigQuery or Parquet. The Squid SDK builds indexers that serve a generated GraphQL API over PostgreSQL. Calling the Portal API directly needs no dependency at all and works from any language.
- SDK overviewhttps://docs.sqd.dev/en/sdk/overviewPipes SDK, Squid SDK and the raw API compared on the same job
- Pipes SDK quickstarthttps://docs.sqd.dev/en/sdk/pipes-sdk/evm/quickstartPackage @subsquid/pipes: streaming pipelines into a warehouse
- Squid SDK quickstarthttps://docs.sqd.dev/en/sdk/squid-sdk/evm/quickstartIndexers that serve a generated GraphQL API over PostgreSQL
- Pipes SDK on npmhttps://www.npmjs.com/package/@subsquid/pipesPackage @subsquid/pipes, released on semantic versioning
Files for agents
The machine-readable surfaces sqd.dev publishes, each at its standard location. The API
catalog is RFC 9727, the MCP server card follows the
SEP-1649 draft,
and the skill index follows the
Agent Skills discovery RFC.
The homepage advertises all of them in a Link response
header, so a client that reads headers finds them without a second request.
Any page on sqd.dev is also served as Markdown to a request that asks for it. There is no
.md suffix to append: negotiation is on the
Accept header alone.
- llms.txthttps://sqd.dev/llms.txtSite index for LLMs: when to use SQD, and every page
- llms-full.txthttps://sqd.dev/llms-full.txtFull reference: architecture, endpoints, pricing, examples
- Agent skillhttps://sqd.dev/.well-known/agent-skills/sqd/SKILL.mdWhen to use SQD, how to call it, and what it does not serve
- Agent Skills indexhttps://sqd.dev/.well-known/agent-skills/index.jsonDiscovery index with a digest for each published skill
- Indexer-building skillhttps://docs.sqd.dev/skill.mdDeeper skill covering squid.yaml, schemas, targets and deployment
- API cataloghttps://sqd.dev/.well-known/api-catalogRFC 9727 linkset of every SQD API surface
- Sitemaphttps://sqd.dev/sitemap.xmlEvery indexable URL on sqd.dev
Support
Technical questions go to the developer chat, where the engineers who maintain the Portal and the SDKs answer. Dedicated portals, volume, and pricing go through the contact form.
- Developer chathttps://t.me/hydradevsTelegram community, where the maintainers answer
- Contact SQDhttps://sqd.dev/contact/Sales, dedicated portals and partnerships
- Supported networkshttps://sqd.dev/chains/Every network SQD indexes, searchable