obsidian/raw/_processed/graphql__overview.md
2026-05-15 15:48:02 +01:00

7.7 KiB

title label order desc keywords source
GraphQL Overview Overview 10 Payload ships with a fully featured and extensible GraphQL API, which can be used in addition to the REST and Local APIs to give you more flexibility. graphql, resolvers, mutations, config, configuration, documentation, Content Management System, cms, headless, javascript, node, react, nextjs https://payloadcms.com/docs/graphql/overview

In addition to its REST and Local APIs, Payload ships with a fully featured and extensible GraphQL API.

By default, the GraphQL API is exposed via /api/graphql, but you can customize this URL via specifying your routes within the main Payload Config.

The labels you provide for your Collections and Globals are used to name the GraphQL types that are created to correspond to your config. Special characters and spaces are removed.

GraphQL Options

At the top of your Payload Config you can define all the options to manage GraphQL.

Option Description
mutations Any custom Mutations to be added in addition to what Payload provides. More
queries Any custom Queries to be added in addition to what Payload provides. More
maxComplexity A number used to set the maximum allowed complexity allowed by requests More
disablePlaygroundInProduction A boolean that if false will enable the GraphQL playground in production environments, defaults to true. More
disableIntrospectionInProduction A boolean that if false will enable the GraphQL introspection in production environments, defaults to true.
disable A boolean that if true will disable the GraphQL entirely, defaults to false.
validationRules A function that takes the ExecutionArgs and returns an array of ValidationRules.

Collections

Everything that can be done to a Collection via the REST or Local API can be done with GraphQL (outside of uploading files, which is REST-only). If you have a collection as follows:

import type { CollectionConfig } from 'payload'

export const PublicUser: CollectionConfig = {
  slug: 'public-users',
  auth: true, // Auth is enabled
  fields: [
    ...
  ],
}

Payload will automatically open up the following queries:

Query Name Operation
PublicUser findByID
PublicUsers find
countPublicUsers count
mePublicUser me auth operation

And the following mutations:

Query Name Operation
createPublicUser create
updatePublicUser update
deletePublicUser delete
forgotPasswordPublicUser forgotPassword auth operation
resetPasswordPublicUser resetPassword auth operation
unlockPublicUser unlock auth operation
verifyPublicUser verify auth operation
loginPublicUser login auth operation
logoutPublicUser logout auth operation
refreshTokenPublicUser refresh auth operation

Globals

Globals are also fully supported. For example:

import type { GlobalConfig } from 'payload';

const Header: GlobalConfig = {
  slug: 'header',
  fields: [
    ...
  ],
}

Payload will open the following query:

Query Name Operation
Header findOne

And the following mutation:

Query Name Operation
updateHeader update

Preferences

User preferences for the Admin Panel are also available to GraphQL the same way as other collection schemas are generated. To query preferences you must supply an authorization token in the header and only the preferences of that user will be accessible.

Payload will open the following query:

Query Name Operation
Preference findOne

And the following mutations:

Query Name Operation
updatePreference update
deletePreference delete

GraphQL Playground

GraphQL Playground is enabled by default for development purposes, but disabled in production. You can enable it in production by passing graphQL.disablePlaygroundInProduction a false setting in the main Payload Config.

You can even log in using the login[collection-singular-label-here] mutation to use the Playground as an authenticated user.

**Tip:**

To see more regarding how the above queries and mutations are used, visit your GraphQL playground (by default at ${SERVER_URL}/api/graphql-playground) while your server is running. There, you can use the "Schema" and "Docs" buttons on the right to see a ton of detail about how GraphQL operates within Payload.

Custom Validation Rules

You can add custom validation rules to your GraphQL API by defining a validationRules function in your Payload Config. This function should return an array of Validation Rules that will be applied to all incoming queries and mutations.

import { GraphQL } from '@payloadcms/graphql/types'
import { buildConfig } from 'payload'

export default buildConfig({
  // ...
  graphQL: {
    validationRules: (args) => [NoProductionIntrospection],
  },
  // ...
})

const NoProductionIntrospection: GraphQL.ValidationRule = (context) => ({
  Field(node) {
    if (process.env.NODE_ENV === 'production') {
      if (node.name.value === '__schema' || node.name.value === '__type') {
        context.reportError(
          new GraphQL.GraphQLError(
            'GraphQL introspection is not allowed, but the query contained __schema or __type',
            { nodes: [node] },
          ),
        )
      }
    }
  },
})

Query complexity limits

Payload comes with a built-in query complexity limiter to prevent bad people from trying to slow down your server by running massive queries. To learn more, click here.

Field complexity

You can define custom complexity for relationship, upload and join type fields. This is useful if you want to assign a higher complexity to a field that is more expensive to resolve. This can help prevent users from running queries that are too complex.

const fieldWithComplexity = {
  name: 'authors',
  type: 'relationship',
  relationship: 'authors',
  graphQL: {
    complexity: 100, // highlight-line
  },
}