View Source Schema Introspection

You can introspect your schema using __schema, __type, and __typename, as described in the specification.

Examples

Seeing the names of the types in the schema:

"""
{
  __schema {
    types {
      name
    }
  }
}
""" |> Absinthe.run(MyAppWeb.Schema)
{:ok,
  %{data: %{
    "__schema" => %{
      "types" => [
        %{"name" => "Boolean"},
        %{"name" => "Float"},
        %{"name" => "ID"},
        %{"name" => "Int"},
        %{"name" => "String"},
        ...
      ]
    }
  }}
}

Getting the name of the queried type:

"""
{
  profile {
    name
    __typename
  }
}
""" |> Absinthe.run(MyAppWeb.Schema)
{:ok,
  %{data: %{
    "profile" => %{
      "name" => "Joe",
      "__typename" => "Person"
    }
  }}
}

Getting the name of the fields for a named type:

"""
{
  __type(name: "Person") {
    fields {
      name
      type {
        kind
        name
      }
    }
  }
}
""" |> Absinthe.run(MyAppWeb.Schema)
{:ok,
  %{data: %{
    "__type" => %{
      "fields" => [
        %{
          "name" => "name",
          "type" => %{"kind" => "SCALAR", "name" => "String"}
        },
        %{
          "name" => "age",
          "type" => %{"kind" => "SCALAR", "name" => "Int"}
        },
      ]
    }
  }}
}

Note that you may have to nest several depths of type/ofType, as type information includes any wrapping layers of List and/or NonNull.

Configuration

The introspection system can be configured through your application config:

config :absinthe,
  include_deprecated: false  # Defaults to false, set to true for backward compatibility

This configuration affects the default behavior of the includeDeprecated argument in introspection queries. When set to false (the default), deprecated fields and values will not be included in introspection results unless explicitly requested via the includeDeprecated argument. When set to true, deprecated fields and values will be included by default, matching the behavior of previous versions of Absinthe.

Note: Setting include_deprecated to true will break compatibility with the GraphQL specification, which recommends not including deprecated fields by default. Only use this option if you need to maintain compatibility with existing code that expects deprecated fields to be included.

For example, with the default configuration (include_deprecated: false), this query will not include deprecated fields:

{
  __type(name: "User") {
    fields {
      name
    }
  }
}

To include deprecated fields, you must explicitly set the includeDeprecated argument:

{
  __type(name: "User") {
    fields(includeDeprecated: true) {
      name
    }
  }
}

If you set include_deprecated: true in your configuration, the first query would include deprecated fields by default, matching the behavior of previous versions of Absinthe.

Using GraphiQL

The GraphiQL project is "an in-browser IDE for exploring GraphQL."

Absinthe provides GraphiQL via a plug in absinthe_plug. See the Plug and Phoenix Guide for how to install that library. Once installed, usage is simple as:

plug Absinthe.Plug.GraphiQL, schema: MyAppWeb.Schema

If you want to use it at a particular path (in this case graphiql in your Phoenix router) simply do:

# filename: router.ex
forward "/graphiql", Absinthe.Plug.GraphiQL, schema: MyAppWeb.Schema

This can be trivially reserved to just the :dev elixir environment by doing:

# filename: router.ex
if Mix.env == :dev do
  forward "/graphiql", Absinthe.Plug.GraphiQL, schema: MyAppWeb.Schema
end

If you'd prefer to use a desktop application, we recommend using the pre-built Electron-based wrapper application, GraphiQL.app.