October 3, 2026
Breaking changes
- Payload 4.0.0-canary.38, Next.js 16.4+ and Node.js 24.15+ are required. Payload 3 users stay on
0.x. openapi:generateis now a Payload 4 CLI command. The flags are the same.- The access endpoint is now
GET /api/access, notGET /api/<slug>/access. This is the path Payload serves. It still needsincludeAdminAuth. - Top-level
config.endpointsare now documented under the API route (/api/health, not/health). This is the path Payload serves. - Payload 4 turns versions on by default, so version endpoints now appear for every collection and global without
versions: false. - The internal
payload-jobs-statsglobal is hidden unlessincludeSystemis on. - Renamed options:
metadatais nowinfo,specEndpointis nowpath,interactiveAuth.endpointis nowinteractiveAuth.path, and the docs UIspecEndpointis nowspecURL. The plugin throws at boot on an old name. See Upgrade guide. custom.openapi.securityon a collection or global takes'public'or'secured', nottrueorfalse. The plugin throws at boot on a boolean.serversno longer comes from the requestHostheader, because a client can fake it. It comes fromservers,serverURL, or a host listed intrustedHosts.- An extension
transformthat throws now fails the spec request instead of being skipped. - An extension
transformgets one object,({ doc, payload, options, ... }), not(doc, ctx). The plugin throws at boot on atransformwith two parameters. securityWhenis replaced bysecurity. It returns'public','secured', a security requirement array, orundefined, and it gets thedetectedmarking.filters.excludeWhenis removed. Put the function infilters.excludeOperationsinstead. A function drops an operation only when it returnstrue, and it can beasync.excludeOperationsandsecuritynow also apply to custom, jobs and system endpoints.OperationContext.kindcan be'custom','jobs'or'system', andslugis then not set. A rule withoutkind, such as{ method: 'delete' }, now also drops matching custom and system operations.
- New endpoints reference page.
- Payload 4 upload instructions:
POST /api/upload-instructionsandPUT/DELETE /api/upload-instructions/{uploadId}, when you have an upload collection. GET /api/<slug>/file/{filename}for upload collections.POST /api/<slug>/{id}/api-key/revealwhenuseAPIKey: { reveal: true }.POST /api/<slug>/access/{id}(and without{id}) andPOST /api/globals/<global>/accessreturn the current user’s permissions for one document. They appear withincludeAdminAuth, likeGET /api/access. The response listsvalidatenext tocreate,read,updateanddelete.POST /api/<slug>/validate,POST /api/<slug>/{id}/validateandPOST /api/globals/<global>/validatecheck data without saving it and return{ valid, errors }. See Validate. They are marked fromaccess.validate, which followsupdate.custom.openapi.securitytakes avalidatekey, which falls back toupdate.accessonopenapi(),scalar()andswaggerUi()limits who can read the spec and the docs page. See Limiting who can read the spec.interactiveAuth.collectionpicks the auth collection the docs login uses.- The docs page title is
info.title. infotakes the full OpenAPI Info Object (summary,termsOfService,contact,license,x-*), andinfo.descriptioncan be localized. See Info and servers.serverssets the spec base URLs, as a list or a function of the request.- Extension
transformhooks can beasyncand getpayloadand the resolvedoptions. custom.openapion collections, globals and fields is typed.- The docs UI loads pinned Scalar and Swagger UI versions with Subresource Integrity. See Pinned versions and SRI.
openapi(),scalar()andswaggerUi()are built with Payload’sdefinePlugin, so each one carries aslugand itsoptions. See Plugin slugs.- Folders and tags from Payload 4. Folder and tag collections are documented like other collections. Their read operations list the
computeHierarchyPathsquery param, and_h_slugPathand_h_titlePathare read-only and kept out of bodies andwhere. - Anonymous, opt-out usage telemetry: plugin, Payload and Node versions and which features are on. Turn it off with
telemetry: false,OPENAPI_TELEMETRY_DISABLED=1orDO_NOT_TRACK=1.
- With
disableLocalStrategy,me,logout,refresh-tokenandinitstay in the spec. Only login, password, registration, unlock and verify endpoints are removed. POST /api/<slug>/unlockis documented for every auth collection, as Payload mounts it. Before, it neededmaxLoginAttempts.- Login, forgot-password and unlock bodies now follow
loginWithUsernameas Payload does:emailby default,usernamewhen email login is off, andemailorusernamewhenallowEmailLoginis on. Before, forgot-password and unlock always asked foremail, andallowEmailLoginwas ignored. - After you log in on the docs page, requests sent from it include your token: every secured operation now lists the
PayloadLoginscheme too. Withserve: falsethe spec no longer listsPayloadLoginwith a token URL that does not exist. - The docs UI loads the spec from the
openapi()route, including a custompath. Before, it always used/api/openapi.json. - Version reads are marked from
readVersionsand version restore fromupdate. The jobs endpoints followjobs.access.run, and the staged uploadPUTandDELETEare secured. Before, all of them were marked public. expires_infrom the interactive auth endpoint is the token lifetime in seconds, not the expiry timestamp.- OpenAPI 3.0 output is now valid when a schema has an empty
requiredlist (for example uploadvariants) or a field allows several types, such as ajsonfield, and 3.0/3.1 output no longer keeps the 3.2 tag fieldssummary,kindandparent. - Create, update, delete and duplicate operations now list the query params Payload reads for them:
depth,locale,fallback-locale,select,populate,draftandtrash. The global update lists them too. Bulk update and delete keepwhere, and bulk update also listslimitandsort. - Write operations also list
autosave,publishAllLocales,unpublishAllLocales,overrideLockandselectedLocales[]where Payload reads them.autosaveappears when autosave is on, the two locale params when drafts keep their status per locale,overrideLockon collection update and delete unlesslockDocumentsisfalse, andselectedLocales[]on duplicate when localization is on. - A polymorphic relationship (
relationTowith several collections) is written as{ relationTo, value }in create and update bodies. Before, the spec asked for a bare ID, which Payload rejects. - Relationships and uploads inside groups, named tabs, arrays and blocks are written as IDs in create and update bodies, like top-level ones. Before, they showed the populated document. The bodies now follow the input types Payload generates: join and virtual fields and
createdAt/updatedAtare left out, a field with adefaultValueis optional, and an optional relationship acceptsnull. Fields that can never be written over REST, such as Payload’screatedByandupdatedBy, are left out too. - The internal
payload-kv,payload-llm-instructionsandpayload-query-presetscollections are hidden unlessincludeSystemis on. - A join over several collections lists
relationToas required in its items. Before, it listedcollectionSlug, which the items do not have. This affects every folder and tag join. includeSystemno longer coverspayload-folders. Payload 4 does not create that collection.- The global update response is
{ message, result }and a restored global version is{ doc, message }, as Payload sends them. Before, both showed the bare document. Collection create is documented with status201, not200.
July 13, 2026
New features
- Per-operation security marking derived from your access functions: each operation is probed as an anonymous request and marked public or secured accordingly.
- Overrides for the detected marking:
custom.openapi.securityper collection or global, and thesecurityWhenoption across the whole document.
June 14, 2026
Initial release.
- OpenAPI 3.0/3.1/3.2 document built from the sanitized Payload config — collections, globals, auth, versions, and jobs.
- Scalar and Swagger UI renderers.
- Custom endpoint and field metadata via
custom.openapi. - Filters, interactive auth, extensions, and caching.
openapi:generateCLI for writing the spec to a file.- UI translations for 44 locales.