Pothos v4 is now available! 🎉Check out the full migration guide here


Using plugins

Using plugins with Pothos is fairly easy, but works a little differently than other plugin systems you may be familiar with. One of the most important things to note is that importing plugins may have some side effects on the Schema builder, and it is recommended to only import the plugins you are actually using.

The reason for this is that Pothos's plugin system was designed to allow plugins to contribute features in a way that feels like they are built into the core API, and allow the plugins to take full advantage of the type system. This means that plugins can extend the core types in Pothos with their own properties, which happens as soon as the plugin is imported.


Each plugin should have setup instructions, but should work in a similar way.

First install the plugin:

npm install --save @pothos/plugin-scope-auth

Next import the plugin's default export (which should just be the name of the plugin), and pass it when you create your schema builder.

import SchemaBuilder from '@pothos/core';
import ScopeAuthPlugin from '@pothos/plugin-scope-auth';
const builder = new SchemaBuilder({
  plugins: [ScopeAuthPlugin],

Some plugins may allow you to use your own types for one of their features. This is done by passing types in through the Generic SchemaTypes used by the Schema builder:

import SchemaBuilder from '@pothos/core';
import ScopeAuthPlugin from '@pothos/plugin-scope-auth';
const builder = new SchemaBuilder<{
  AuthScopes: {
    example: string;
  plugins: [ScopeAuthPlugin],

This types can then be used in other parts of the API (eg. defining the scopes on a field), but the details of how these types are used will be specific to each plugin, and should be covered in the documentation for the plugin.


In some cases, it may be important to understand the order in which plugins are applied. All plugin lifecycle hooks are applied in REVERSE order. This is done to ensure that the most important (first) plugins are applied after all other effects have been applied. For plugins that wrap resolvers, because the first plugins are applied last, they will be the outermost layer of wrapping an applied executed first. This means it is important to have plugins like scope-auth listed before other less critical plugins in your SchemaBuilder.

On this page