Skip to content

Features and limitations

Evaluating an edge is mostly a question of what it does not do, because that is what lands back on your team. This page is the inventory, with links to the detail. If a term is unfamiliar, the glossary defines the vocabulary these docs use.

A request is GraphQL when GraphPilot parses a GraphQL operation from it: its path is one of request.graphql_paths (/graphql by default) and it carries an operation. Every other request is plain HTTP, and gets everything in the first column. See how GraphPilot works.

FeaturePlain HTTPGraphQL
Caching from your origin’s Cache-Control, including s-maxage and stale-while-revalidateYesYes
Lifetimes and audiences from the schema with @cacheControlNoYes
Cache keyMethod, URI with query string, and request bodyQuery text, operation name and variables, whatever the method
Error responses (4xx, 5xx) with a storable Cache-ControlNot stored unless you opt inNot stored unless you opt in
Partitioning per caller or per group: private, vary rules, verified claims, headers, cookies, URL parametersYesYes
Named scopes, such as one entry per organization, declared on schema typesNo, use a vary ruleYes
Authenticated requests, following RFC 9111 §3.5YesYes
Your origin’s VaryYesYes
Bypass for preview or editor trafficYesYes
Request collapsingYesYes
gp-cache status headersYesYes
Response bodyPassed through byte for byteKey fields GraphPilot added are removed
FeaturePlain HTTPGraphQL
Tagging from your origin with a Surrogate-Key response headerYes, on GET and HEADYes, on queries
Purging from your origin with a Surrogate-Key header on a write’s responseYes, on POST, PUT, PATCH and DELETEYes, on mutations
Surrogate keys derived from the schema, with selection set expansionNoYes
Automatic purging of what a mutation returnedNoYes
The purge API and gpilot purge, hard or soft: by key, by cache key, by request id, or everythingYesYes, and by query hash
Purges that reach every edge locationYesYes
FeaturePlain HTTPGraphQL
JWT verification and opaque API keys at the edgeYesYes
Request signing and TLS to your originYesYes
Published edge IP ranges for your firewallYesYes
Request body limitYesYes
Header and cookie filtersYesYes
Client profilesIdentification, refusing unknown clients, minimum version, body limit, cache settingsYes, plus depth, size, selection and persisted-query rules
Persisted queries and trusted documentsNoYes
Limits on query depth, document size and selection countNoYes
Introspection blocked by defaultNoYes
GraphQL batches and multipart uploadsNot applicableRefused unless you forward them unchecked with request.forward_unchecked_bodies
FeaturePlain HTTPGraphQL
What a deployment needsgpilot.toml onlygpilot.toml and schema.graphql
Deploy findingsConfig findings, without a schemaSchema and config findings
Origin timeoutsYesYes
Retries, off until you enable [origin.retry]GET, HEAD and OPTIONS; other methods only with retry_unsafe_methodsQueries; mutations only with retry_mutations
Compression toward the clientYesYes
WebSocket upgradesYesYes
Per-request telemetry in Insights, on every planYes, without the GraphQL fieldsYes
Codes on every refusalYes, as application/problem+jsonYes, as a GraphQL error
Custom domains with managed certificates, from Jet (Starter)YesYes
Redeploying an earlier deployment from the portalYesYes
Shielding, on paid plans, when you set origin.shieldGET and HEAD onlyQueries, mutations and persisted-query hashes, not subscriptions
Lean mode when the Glider (Free) allowance is used up, a payment is overdue or GraphPilot pauses the account: no edge caching, no shielding, nothing recordedYesYes

These are not gaps. They are decisions, and each one is a decision about who is the authority.

Authorization. GraphPilot verifies who is calling. It does not decide what they may see, and on a cache hit your origin is not consulted at all. An entry keyed to one caller keeps being served to that caller until it expires or is purged, so revoking access is two steps. Detail.

Whether a response may be cached. GraphPilot never decides on its own that something is reusable. Either your origin says so or, for a GraphQL API, your schema does. A service that says neither caches nothing, which is the safe default rather than an oversight.

Query validation. For a GraphQL operation, the edge parses and plans; it does not validate the operation against your schema. Your origin remains the authority on what is a valid request.

Verifying GraphPilot’s signature. GraphPilot signs every forwarded request. Whether your origin checks it is yours to implement, and until it does, your origin is reachable by anyone who learns its address. This is the first item on the go-live checklist.

WebSocket traffic past the handshake. The WebSocket upgrade goes through the whole pipeline; the messages after it are a tunnel. Everything the edge guarantees stops at the upgrade, the query depth, document and introspection checks included. Detail.

Composing subgraphs. GraphPilot does not compose a federated graph. Put it in front of your federation router or gateway as one service, and it caches and protects the composed graph like any other GraphQL API. This works on every plan. Detail.

Not availableConsequence
@cacheControl cannot express a shared-cache lifetimemaxAge sets both how long GraphPilot keeps the entry and the max-age of any downstream header; a separate edge lifetime needs s-maxage from an origin header
No conditional revalidationno-cache is refused rather than stored-and-revalidated, and a background refresh is a full request
Schema-declared invalidation on mutationsA mutation invalidates what it returned; to invalidate more, name a key on the response header
Field-level authorization from the schemaAuthorization stays with your origin
Mutual TLS to the origin, or a per-service source addressAn IP allowlist admits the whole edge network, not only your service
A staging-to-production promotion flowA staging service is a second service you deploy to first, which needs a plan that includes more than one service (see pricing)
Rate limiting and per-caller quotasNo request cap and no per-second limit at the edge; see quotas for what plan limits do
Query cost analysisDepth, document size and selection count are limited; per-field cost is not
Soft purging from the automatic pathAutomatic invalidation is always a hard purge
Single sign-on (SSO/SAML) and an audit logNot available yet