Platform

Platform overview How it works Authorization testing Evidence & reports Private scanning Integrations

Solutions

Security agencies Product teams Regulated industries Partner programme

Learn

Blog Knowledge hub Compare

Resources

Pricing Documentation Help centre FAQ Security & data What we haven’t proved

Company

About Contact Careers Sign in to the platform Start a $199 pilot →

Home / Knowledge hub / GraphQL introspection

Knowledge hub

GraphQL introspection

A feature that lets anyone ask a GraphQL API to describe its whole schema.

Illustration explaining GraphQL introspection

What it means

GraphQL introspection is a built-in feature that lets a client ask a GraphQL server to describe itself. A single query returns the types, fields, arguments and operations the API supports, along with a short description of each. Developer tools use it to offer auto-complete, to generate documentation and to check queries before they are sent.

In effect the server hands over a complete map of what can be asked. That is helpful while you build. On a live product it also shows a stranger every query and mutation, including ones the interface never calls and ones you meant to keep internal.

Why it matters

A full schema saves an outsider hours of guessing. They can spot admin mutations, internal fields and old operations, then test each one. Introspection does not break anything on its own, but it makes the next step cheaper, and it can expose names that hint at features you have not announced.

The wrong lesson is to treat the schema as secret. Disabling introspection may slow someone down, yet it does not fix a missing permission check. If a mutation lacks one, it is still open to anyone who finds its name, and names can be guessed or taken from your own app.

How it shows up

Many GraphQL servers have introspection on by default. You can check by sending a query for the __schema field to your production endpoint. OWASP advises turning it off in production for APIs that are not meant to be public, and some servers still hint at field names in error messages even then.

The sensible order is: first make every field and mutation check who is asking, then switch introspection off where it is not needed, then test again. Keep it on for a public API whose documentation you want others to use. See also GraphQL and excessive data exposure.

Questions people ask

GraphQL introspection, answered

Should GraphQL introspection be disabled in production?

For a private API, usually yes. It removes a ready-made map of your API from the open internet.

For a public developer API it may be fine, even useful, as long as authorisation is enforced on every field.

Does disabling introspection secure a GraphQL API?

No. It only hides the map. Anyone who guesses or copies a field name from your front end can still call it.

Security comes from permission checks on the server for each query and mutation.

How do I check if introspection is on?

Send a query that asks for __schema and its types to your GraphQL endpoint. If the server answers with a list of types, it is enabled.

Test both signed-out and signed-in, since some servers allow it only for certain callers.

Can an attacker learn the schema without introspection?

Sometimes. Some servers suggest similar field names when a query has a typo, which leaks names a little at a time. The front end bundle also lists the queries it uses.

This is why checks on the server matter more than hiding names.

Is introspection a vulnerability?

It is a feature, not a flaw by itself. It becomes a finding when it exposes private operations or is paired with missing authorisation.

Report it with the data it actually revealed, not as a general warning.

Cyberlop mark

What does your schema give away?

A schema shows where to look, and the checks behind it decide what is exposed. We test each query and mutation for access it should refuse, and report only what we proved. Book a pilot on one app.

Or start with a $199 pilot on one application: thirty days, success criteria agreed before day one, credited against the annual if you convert.