# Strapi Documentation - [Cloud account billing details](https://docs.strapi.io/cloud/account/account-billing.md): Billing details and invoices are managed on the Profile page, where payment methods are updated and invoice history is available. - [Cloud profile settings](https://docs.strapi.io/cloud/account/account-settings.md): Settings of the Profile page include account details, connected accounts, and account deletion options. - [Cloud database configuration](https://docs.strapi.io/cloud/advanced/database.md): Default PostgreSQL can be swapped for any supported SQL database by aligning configuration and environment variables. - [Cloud email provider](https://docs.strapi.io/cloud/advanced/email.md): Third‑party email services integrate through plugins and environment variables to replace the default sender. - [Middleware Configuration for Strapi Cloud](https://docs.strapi.io/cloud/advanced/middlewares.md): On Strapi Cloud, middleware customizations must go in config/env/production/middlewares. Changes to the global config file are overwritten on deploy. - [Upload Provider Configuration for Strapi Cloud](https://docs.strapi.io/cloud/advanced/upload.md): External storage like S3 or Cloudinary requires plugin setup, security middleware, and Cloud variables. - [Upload size limits for Strapi Cloud](https://docs.strapi.io/cloud/advanced/upload-size-limits.md): Non-image files are capped at 200 MB on all plans. Image files have a memory-based recommended maximum that varies by format, plan, and Media Library settings. To upload larger images, disable Responsive friendly upload and Size optimization. - [Command Line Interface (CLI)](https://docs.strapi.io/cloud/cli/cloud-cli.md): CLI commands handle login, project deploy, linking, listing, and logout without needing a remote repository. - [Strapi Cloud fundamentals](https://docs.strapi.io/cloud/cloud-fundamentals.md): Strapi Cloud is a PaaS hosting platform for deploying Strapi CMS projects, offering four pricing plans with different features and support levels, two user roles (owners and maintainers), and REST/GraphQL APIs that behave identically to self-hosted servers. - [Cloud caching & performance](https://docs.strapi.io/cloud/getting-started/caching.md): Edge caching via Cache-Control headers reduces latency and server load for heavy static content. - [Strapi Cloud - Dashboard deployment](https://docs.strapi.io/cloud/getting-started/deployment.md): Deploy your Strapi project on Strapi Cloud using the dashboard by choosing a plan, connecting a Git repository, configuring your project settings, and setting up billing details. - [Strapi Cloud - CLI deployment](https://docs.strapi.io/cloud/getting-started/deployment-cli.md): Deploy a Strapi project to Strapi Cloud using the strapi login and strapi deploy CLI commands, with optional automatic deployment on git repository commits. - [Cloud project deployment](https://docs.strapi.io/cloud/getting-started/deployment-options.md): Deploy your Strapi application on Strapi Cloud using either the Cloud dashboard or the CLI, with step-by-step guides provided for both methods. - [Cloud billing & usage](https://docs.strapi.io/cloud/getting-started/usage-billing.md): Strapi Cloud offers four plans (Free, Essential, Pro, Scale) with usage-based pricing that varies by API requests, asset storage, and bandwidth, plus overages charged monthly; projects may be suspended for unpaid invoices or plan violations. - [Welcome to the Strapi Cloud Documentation!](https://docs.strapi.io/cloud/intro.md): Strapi Cloud is a fully managed hosting platform for deploying Strapi applications, abstracting infrastructure complexity while enabling content management, collaboration, and compliance features. - [Cloud project collaboration](https://docs.strapi.io/cloud/projects/collaboration.md): Project owners invite maintainers through the Share button, manage pending invitations, and revoke access. - [Cloud deployments management](https://docs.strapi.io/cloud/projects/deploys.md): Deployment triggers can be manual or automatic on git pushes, with the ability to cancel active builds from dashboard or CLI. - [Cloud deployment history & logs](https://docs.strapi.io/cloud/projects/deploys-history.md): Deployments tab lists every build with status and allows deep inspection of build and deployment logs. - [Cloud project logs](https://docs.strapi.io/cloud/projects/logs.md): The Logs tab streams your project's live logs in a searchable, filterable table. Click any entry to inspect its full message and metadata. - [Cloud notifications](https://docs.strapi.io/cloud/projects/notifications.md): Bell icon opens a feed of recent deployment events, automatically purged after 30 days. - [Cloud projects overview](https://docs.strapi.io/cloud/projects/overview.md): Projects page lists all apps with status and quick actions; selecting one opens a dashboard with metrics and controls. - [Cloud project settings](https://docs.strapi.io/cloud/projects/settings.md): Settings area spans project-level controls (general, billing, plans, invoices) and per-environment configuration. - [Admin panel customization](https://docs.strapi.io/cms/admin-panel-customization.md): The admin panel can be tailored to match your branding, by editing src/admin/app and using an extensions folder to swap logos, favicon, locales, translations, themes, bundlers, or editors. - [Admin panel bundlers](https://docs.strapi.io/cms/admin-panel-customization/bundlers.md): Supported JavaScript bundlers influence builds and development flow. - [Admin panel extension](https://docs.strapi.io/cms/admin-panel-customization/extension.md): Strapi's React-based admin panel can be extended locally via /src/admin/app for project-specific needs or through plugins for reusable, distributable extensions across multiple Strapi instances. - [Favicon](https://docs.strapi.io/cms/admin-panel-customization/favicon.md): Replace the Strapi admin panel favicon by replacing the favicon.png file at the project root or configuring the strapi::favicon middleware, then rebuild the app. - [Homepage customization](https://docs.strapi.io/cms/admin-panel-customization/homepage.md): The admin panel homepage displays default content and profile widgets and supports custom additions through the app.widgets.register API. - [Admin panel customization - URL, host, and path configuration](https://docs.strapi.io/cms/admin-panel-customization/host-port-path.md): Configure the Strapi admin panel's host, port, and URL path in the config/admin.[ts|js] file to change where it is accessible from its default location at /admin. - [Locales & translations](https://docs.strapi.io/cms/admin-panel-customization/locales-translations.md): Configure the admin panel languages by updating the config.locales array and override default or plugin strings with config.translations or custom translation files. - [Logos](https://docs.strapi.io/cms/admin-panel-customization/logos.md): Update login and navigation logos by extending the admin app. Prefer SVG for crisp rendering; provide light/dark variants when possible for contrast. - [Theme extension](https://docs.strapi.io/cms/admin-panel-customization/theme-extension.md): Extend the Strapi admin panel theme for light and dark modes by customizing config.theme.light and config.theme.dark keys in /src/admin/app.js to override colors and other design system properties. - [Customizing the rich text editor](https://docs.strapi.io/cms/admin-panel-customization/wysiwyg-editor.md): Strapi's admin panel includes a built-in WYSIWYG markdown editor for richtext fields. You can replace it by installing third-party editor plugins from the Marketplace or creating a custom field for deeper integration. - [Docs MCP server](https://docs.strapi.io/cms/ai/docs-mcp-server.md): A Docs MCP server exposes the Strapi documentation to AI coding tools. Connect it to your IDE to get Strapi-aware code suggestions and answers directly in your development environment. - [AI for content managers](https://docs.strapi.io/cms/ai/for-content-managers.md): Strapi AI helps content managers design content structures, translate content, and generate asset metadata from the admin panel. Strapi also includes a built-in MCP server that lets AI clients manage content through natural language. - [AI for developers](https://docs.strapi.io/cms/ai/for-developers.md): The Strapi documentation site includes free AI-powered tools including an AI toolbar, chatbot powered by Kapa, llms.txt files, and MCP servers to help developers learn and integrate Strapi more effectively. - [Strapi Client](https://docs.strapi.io/cms/api/client.md): The Strapi Client is a JavaScript library that simplifies interactions with your Strapi back end for fetching, creating, updating, and deleting content through collection(), single(), and files() methods. - [Content API](https://docs.strapi.io/cms/api/content-api.md): Strapi's Content API provides access to your content through REST and GraphQL APIs for front-end applications, plus lower-level Document Service and Query Engine APIs for backend and plugin development. - [Documents](https://docs.strapi.io/cms/api/document.md): A document is an API-only concept representing all content variations (locales, draft/published versions) for a single content-type entry. Use the Document Service API to manipulate documents on the back-end. - [Document Service API](https://docs.strapi.io/cms/api/document-service.md): The Document Service API is the recommended backend API for interacting with content, providing findOne, findMany, create, update, and delete methods that work with stable documentId identifiers and support Draft & Publish operations. - [Using fields with the Document Service API](https://docs.strapi.io/cms/api/document-service/fields.md): Use the fields parameter in Document Service API queries to select specific fields to return with your results, reducing data payload across findOne(), findMany(), create(), update(), delete(), publish(), and other document operations. - [Using filters with the Document Service API](https://docs.strapi.io/cms/api/document-service/filters.md): The Document Service API provides attribute operators ($eq, $lt, $contains, etc.) and logical operators ($and, $or, $not) to filter query results with support for case-sensitive and case-insensitive matching. - [Using the locale parameter with the Document Service API](https://docs.strapi.io/cms/api/document-service/locale.md): The locale parameter in the Document Service API lets you query, create, update, delete, publish, and unpublish documents for specific language versions using methods like findOne(), findMany(), update(), and delete(). - [Extending the Document Service behavior](https://docs.strapi.io/cms/api/document-service/middlewares.md): Document Service middlewares allow you to perform actions before and after Document Service methods run by registering middleware functions via strapi.documents.use() with access to content type context and method parameters. - [Using Populate with the Document Service API](https://docs.strapi.io/cms/api/document-service/populate.md): Use the populate parameter with the Document Service API to explicitly load relations, media fields, components, and dynamic zones at one or multiple levels deep, and within create(), update(), publish(), and delete() operations. - [Using Sort & Pagination with the Document Service API](https://docs.strapi.io/cms/api/document-service/sort-pagination.md): Use the Document Service API's sort and pagination parameters to order query results by single or multiple fields and control result limits with limit and start. - [Using Draft & Publish with the Document Service API](https://docs.strapi.io/cms/api/document-service/status.md): Use the status parameter with the Document Service API to retrieve published or draft versions of documents, count documents by status, and directly publish documents during creation or updates. - [Entity Service API](https://docs.strapi.io/cms/api/entity-service.md): The Entity Service API is a backend layer that handles complex content structures like components and dynamic zones, providing CRUD operations, filtering, populating relations, and pagination via strapi.entityService. - [Components and Dynamic Zones](https://docs.strapi.io/cms/api/entity-service/components-dynamic-zones.md): Use the Entity Service API to create and update components and dynamic zones while creating or updating entries. Components are single objects while dynamic zones are lists of components with a __component type identifier. - [CRUD operations](https://docs.strapi.io/cms/api/entity-service/crud.md): The Entity Service API performs CRUD operations on content through findOne(), findMany(), create(), update(), and delete() methods, supporting filtering, pagination, relations, and localization. - [Filtering with the Entity Service API](https://docs.strapi.io/cms/api/entity-service/filter.md): Filter Entity Service API query results using logical operators ($and, $or, $not) and attribute operators ($eq, $contains, $gt, $between, etc.) with the filters parameter in findMany(). - [Ordering & Pagination with the Entity Service API](https://docs.strapi.io/cms/api/entity-service/order-pagination.md): Order and paginate Entity Service API query results using sort, start/limit, or page/pageSize parameters to control result ordering and retrieve specific data subsets. - [Populating with the Entity Service API](https://docs.strapi.io/cms/api/entity-service/populate.md): The Entity Service API's populate parameter retrieves relations, components, and dynamic zones. Use populate: '*' for all root-level relations, arrays for specific fields, objects for advanced queries with filters and nested populating, or fragments for polymorphic content structures. - [GraphQL API](https://docs.strapi.io/cms/api/graphql.md): The GraphQL API allows querying and mutating content-types with filtering, sorting, and pagination. It uses documentId as the unique identifier and provides singular and plural queries with support for relations, media fields, components, dynamic zones, and localization. - [Advanced policies for GraphQL](https://docs.strapi.io/cms/api/graphql/advanced-policies.md): Policies can be attached to GraphQL resolvers to implement complex authorization rules, such as limiting results for unauthenticated users or restricting access based on group membership. - [Advanced queries for GraphQL](https://docs.strapi.io/cms/api/graphql/advanced-queries.md): Advanced queries in Strapi's GraphQL API use nested selection sets to fetch multi-level relations and custom resolver chains to reuse logic across resolvers and apply context-specific behavior. - [Using the locale parameter with the GraphQL API](https://docs.strapi.io/cms/api/graphql/locale.md): Use the locale argument with the GraphQL API to query, create, update, and delete documents for a specific locale. - [OpenAPI specification](https://docs.strapi.io/cms/api/openapi.md): Strapi provides a CLI tool to automatically generate OpenAPI 3.1.0 specifications documenting all API endpoints, parameters, and responses. The generated specification can be integrated with Swagger UI for interactive API documentation. - [Query Engine API](https://docs.strapi.io/cms/api/query-engine.md): The Query Engine API provides low-level, unrestricted backend access to Strapi's database layer through strapi.db.query, supporting single and bulk operations with filtering, populating, ordering, and pagination. - [Bulk Operations](https://docs.strapi.io/cms/api/query-engine/bulk-operations.md): Bulk Operations with the Query Engine API enable you to create, update, delete, and count multiple entries at once using createMany(), updateMany(), deleteMany(), and count() methods. - [Filtering with the Query Engine API](https://docs.strapi.io/cms/api/query-engine/filtering.md): The Query Engine API filters query results using the where parameter with logical operators ($and, $or, $not) and attribute operators (comparison, string matching, range) prefixed with $. - [Ordering & Pagination with the Query Engine API](https://docs.strapi.io/cms/api/query-engine/order-pagination.md): The Query Engine API supports ordering results with the orderBy parameter on single or multiple attributes, including relational ordering, and pagination with offset and limit parameters. - [Populating with the Query Engine API](https://docs.strapi.io/cms/api/query-engine/populating.md): The Query Engine API's populate parameter loads related data in queries, supporting basic population, selective attributes, filtering nested relations, and polymorphic structures via populate fragments. - [Single Operations](https://docs.strapi.io/cms/api/query-engine/single-operations.md): The Query Engine API provides methods to find, create, update, and delete individual entries with filtering, selection, pagination, and relation population options. - [REST API reference](https://docs.strapi.io/cms/api/rest.md): Strapi's REST API automatically generates endpoints for content-types to fetch, create, update, and delete documents using GET, POST, PUT, and DELETE methods, with support for filtering, sorting, field selection, and relation population. - [Filters](https://docs.strapi.io/cms/api/rest/filters.md): The REST API filters feature allows filtering query results using operators like $eq, $contains, and $between, with support for complex filtering using $and, $or, and $not, as well as deep filtering across related content. - [REST API Guides](https://docs.strapi.io/cms/api/rest/guides/intro.md): Explore detailed guides and step-by-step instructions on specific REST API topics, including populate parameters and custom controllers for accessing creator fields. - [How to populate creator fields](https://docs.strapi.io/cms/api/rest/guides/populate-creator-fields.md): Enable the populateCreatorFields option in a content-type schema and create a route middleware to include createdBy and updatedBy fields in REST API responses. - [Understanding populate](https://docs.strapi.io/cms/api/rest/guides/understanding-populate.md): The populate parameter in REST API queries includes additional fields, relations, components, and dynamic zones in responses beyond default attributes. Use populate=* for all 1-level-deep relations, or explicitly specify fields with nested arrays and fragment syntax for deeper or selective population. - [Interactive Query Builder](https://docs.strapi.io/cms/api/rest/interactive-query-builder.md): An interactive query builder tool that automatically generates REST API query URLs from your endpoint and parameters, powered by the qs library to handle complex nested queries. - [Locale](https://docs.strapi.io/cms/api/rest/locale.md): The locale REST API parameter retrieves and manages documents in specific languages, defaulting to the application's default locale. Use it to fetch, create, update, and delete locale-specific versions of documents in both collection and single types. - [Parameters](https://docs.strapi.io/cms/api/rest/parameters.md): REST API parameters filter, sort, paginate, and select fields and relations in Strapi queries. Use filters, locale, populate, sort, and pagination to refine your content requests. - [Populate and Select](https://docs.strapi.io/cms/api/rest/populate-select.md): Use the populate parameter to include relations, media fields, components, and dynamic zones in REST API responses. Use the fields parameter to return only specific fields. - [Relations](https://docs.strapi.io/cms/api/rest/relations.md): Use connect, disconnect, and set parameters in REST and GraphQL API requests to manage relations between content-types. Reorder relations using positional arguments like before, after, start, or end. - [Sort and Pagination](https://docs.strapi.io/cms/api/rest/sort-pagination.md): Sort REST API results on one or multiple fields with :asc or :desc syntax, and paginate using either page-based or offset-based parameters. - [Status](https://docs.strapi.io/cms/api/rest/status.md): The REST API's status parameter filters documents by their publication state, returning either published versions (default) or drafts by passing status=draft. - [Upload files](https://docs.strapi.io/cms/api/rest/upload.md): The /api/upload REST API endpoints enable you to upload files to the Media Library, retrieve paginated file lists, update file metadata, and delete files from your Strapi application. - [Back-end customization](https://docs.strapi.io/cms/backend-customization.md): Strapi’s back end is a Koa-based server where requests pass through global middlewares, routes, controllers, services, and models before the Document Service returns responses. - [Controllers](https://docs.strapi.io/cms/backend-customization/controllers.md): Controllers bundle actions that handle business logic for each route within Strapi's MVC pattern. This documentation demonstrates generating controllers, extending core ones with createCoreController, and delegating heavy logic to services. - [Backend Customization Examples Cookbook](https://docs.strapi.io/cms/backend-customization/examples.md): A cookbook of real-world backend customization examples using the FoodAdvisor demo application, demonstrating how to implement custom routes, controllers, services, policies, and middlewares in Strapi. - [Authentication flow with JWT](https://docs.strapi.io/cms/backend-customization/examples/authentication.md): Authenticate REST API requests using JWT by sending credentials to the /auth/local endpoint and storing the token in localStorage, with optional session management for refresh token support. - [Custom middlewares](https://docs.strapi.io/cms/backend-customization/examples/middlewares.md): Custom global middlewares intercept incoming requests before controller execution, enabling you to add logic like analytics tracking. This example creates a middleware that logs restaurant page visits to a Google Sheet. - [Custom policies](https://docs.strapi.io/cms/backend-customization/examples/policies.md): Custom policies control access to content-type endpoints by allowing or blocking requests, and can throw custom errors using PolicyError for better error handling and front-end integration. - [Custom routes](https://docs.strapi.io/cms/backend-customization/examples/routes.md): Custom routes let you explicitly configure routes for content-types to control authentication and apply policies, such as bypassing default Strapi authentication or restricting access based on custom conditions. - [Custom services and controllers](https://docs.strapi.io/cms/backend-customization/examples/services-and-controllers.md): Services encapsulate reusable business logic that controllers invoke to handle reviews and email notifications. This guide demonstrates creating custom services using the Document Service API and custom controllers that call them. - [Customizing Users & Permissions plugin routes](https://docs.strapi.io/cms/backend-customization/guides/customizing-users-permissions-plugin-routes.md): Users & Permissions feature exposes /users and /auth routes that can be extended or overridden using the plugin extension system. This guide shows how to add custom policies, override controllers, and add new routes to the User collection. - [Middlewares](https://docs.strapi.io/cms/backend-customization/middlewares.md): Middlewares alter the request or response flow at application or API levels. This documentation distinguishes global versus route middlewares and illustrates custom implementations with generation patterns. - [Models](https://docs.strapi.io/cms/backend-customization/models.md): Models define Strapi’s content structure via content-types and reusable components. This documentation walks through creating these models in the Content-type Builder or CLI and managing schema files with optional lifecycle hooks. - [Policies](https://docs.strapi.io/cms/backend-customization/policies.md): Policies execute before controllers to enforce authorization or other checks on routes. Instructions in this documentation cover generating global or scoped policies and wiring them into router configs. - [Requests and Responses](https://docs.strapi.io/cms/backend-customization/requests-responses.md): Koa’s context (ctx) carries request info, state, and response data through every Strapi endpoint. This documentation details ctx.request, ctx.state, and ctx.response, plus a helper for accessing context anywhere. - [Routes](https://docs.strapi.io/cms/backend-customization/routes.md): Routes map incoming URLs to controllers and ship pre-generated for each content type. This documentation shows how to add or customize core and custom routers and attach policies or middlewares for extra control. - [Services](https://docs.strapi.io/cms/backend-customization/services.md): Services store reusable functions to keep controllers concise and follow DRY principles. This documentation explains generating or extending services with createCoreService and organizing them for APIs or plugins. - [Webhooks](https://docs.strapi.io/cms/backend-customization/webhooks.md): Webhooks let Strapi notify external systems when content changes, while omitting the Users type for privacy. Configuration in config/server sets default headers and endpoints to trigger third-party processing. - [Billing portal](https://docs.strapi.io/cms/billing-portal.md): The Strapi billing portal is where you can view all Strapi subscriptions and manage payment methods, billing details, and invoices. Only Growth subscriptions can be managed in the portal; Cloud and Enterprise subscriptions are view-only. - [Command Line Interface](https://docs.strapi.io/cms/cli.md): Strapi comes with a full featured Command Line Interface (CLI) which lets you scaffold and manage your project in seconds. The CLI works with both the yarn and npm package managers. - [Community & Support](https://docs.strapi.io/cms/community.md): Strapi is an open-source, community-oriented project welcoming contributions to the core, documentation, and design system. Get support through GitHub Discussions and Discord for free, or access the Support platform with an active paid plan. - [Configurations](https://docs.strapi.io/cms/configurations.md): Strapi applications are configured through files in the /config folder, including required base configurations for database, server, admin panel, middlewares, and API, plus optional configurations for plugins, TypeScript, API tokens, lifecycle functions, cron jobs, and environment variables. - [Admin panel configuration](https://docs.strapi.io/cms/configurations/admin-panel.md): Options in /config/admin let you tweak admin panel behavior and server settings, including custom URLs, host, and port. - [API calls configuration](https://docs.strapi.io/cms/configurations/api.md): /config/api centralizes response privacy, REST defaults (prefix, pagination limits, max request size), and strict parameter validation for both the REST Content API and the Document Service. - [CRON jobs](https://docs.strapi.io/cms/configurations/cron.md): Cron jobs schedule custom functions at specific times via node-schedule, activated through server config and optional task files. - [Database configuration](https://docs.strapi.io/cms/configurations/database.md): /config/database defines connections, clients, and pooling for supported databases like SQLite, MySQL, and PostgreSQL. - [Creating custom email providers](https://docs.strapi.io/cms/configurations/email-custom-providers.md): Build a custom email provider by exporting a Node.js module with a send() function. Use it locally in your project or publish it to npm to share with the community. - [Advanced Nodemailer configuration](https://docs.strapi.io/cms/configurations/email-nodemailer.md): The Nodemailer provider supports OAuth2 authentication, connection pooling, DKIM signing, and rate limiting. Each scenario adds specific keys to providerOptions on top of a standard SMTP configuration. - [Environment variables configuration](https://docs.strapi.io/cms/configurations/environment.md): Strapi-specific environment variables and .env usage enable per-environment configs, with env() helpers for casting values. - [Features configuration](https://docs.strapi.io/cms/configurations/features.md): Future flags in /config/features toggle experimental Strapi features, allowing early testing at your own risk. - [Lifecycle functions](https://docs.strapi.io/cms/configurations/functions.md): src/index hosts global register, bootstrap, and destroy functions to run logic during application lifecycle. - [Access and cast env variables](https://docs.strapi.io/cms/configurations/guides/access-cast-environment-variables.md): The env() utility accesses environment variables from .env files and casts them to different types including int, float, bool, json, array, date, and oneOf. - [Access configuration values](https://docs.strapi.io/cms/configurations/guides/access-configuration-values.md): Access configuration values loaded on startup using the strapi.config.get() method with dot notation for nested keys across all configuration files. - [SSO configuration](https://docs.strapi.io/cms/configurations/guides/configure-sso.md): Configure SSO providers in the Strapi admin panel by registering OAuth/OIDC applications, adding credentials to auth.providers in /config/admin, and setting up callback URLs to enable additional sign-in methods. - [Create new Role-Based Access Control (RBAC) conditions](https://docs.strapi.io/cms/configurations/guides/rbac.md): Create custom Role-Based Access Control (RBAC) conditions in Strapi using the conditionProvider API to restrict admin panel access based on user properties, entity queries, or external conditions. - [Media Library providers](https://docs.strapi.io/cms/configurations/media-library-providers.md): Media Library providers extend Strapi's upload capabilities to store files in external services like AWS S3 or Cloudinary. You can install official providers, configure them in /config/plugins, create custom providers, or set up private providers with signed URLs for secure asset access. - [Amazon S3 provider](https://docs.strapi.io/cms/configurations/media-library-providers/amazon-s3.md): The @strapi/provider-upload-aws-s3 package lets you store Media Library assets on Amazon S3 or any S3-compatible service (Cloudflare R2, Scaleway, MinIO, etc.). This page covers provider configuration, required AWS setup (IAM, CORS, middleware), and extended options such as encryption, checksums, and signed URLs for private buckets. - [Cloudinary provider](https://docs.strapi.io/cms/configurations/media-library-providers/cloudinary.md): The @strapi/provider-upload-cloudinary package lets you store Media Library assets on . This page covers installation and configuration using your Cloudinary cloud name, API key, and API secret. - [Local upload provider](https://docs.strapi.io/cms/configurations/media-library-providers/local-upload.md): The @strapi/provider-upload-local package lets you store Media Library assets on the local server file system. This page covers installation and configuration, including the optional sizeLimit parameter to control the maximum upload file size. - [Middlewares configuration](https://docs.strapi.io/cms/configurations/middlewares.md): /config/middlewares orders global middleware, enables custom names or resolves, and exposes built-in configuration options. - [Plugins configuration](https://docs.strapi.io/cms/configurations/plugins.md): /config/plugins enables or disables plugins and overrides their settings, with examples for local plugin development. - [Server configuration](https://docs.strapi.io/cms/configurations/server.md): /config/server manages host, port, URL, proxy, cron, and more; changes require rebuilding the admin panel. - [Discord SSO provider](https://docs.strapi.io/cms/configurations/sso-providers/discord.md): Discord SSO provider enables users to sign in and sign up to Strapi through their Discord account. Configure it in config/admin using passport-discord with client credentials and email scope. - [GitHub SSO provider](https://docs.strapi.io/cms/configurations/sso-providers/github.md): Configure GitHub as an SSO provider for Strapi admin sign-in using passport-github2 in the config/admin file with your GitHub OAuth credentials and user email scope. - [Google SSO provider](https://docs.strapi.io/cms/configurations/sso-providers/google.md): Configure Google as an SSO provider in your Strapi admin panel to allow users to sign in and sign up using their Google account credentials. - [Keycloak SSO provider](https://docs.strapi.io/cms/configurations/sso-providers/keycloak.md): Keycloak is an OpenID Connect SSO provider that lets users sign in to Strapi through Keycloak authentication using the passport-keycloak-oauth2-oidc strategy configured in config/admin. - [Microsoft SSO provider](https://docs.strapi.io/cms/configurations/sso-providers/microsoft.md): Configure the Microsoft SSO provider using passport-azure-ad-oauth2 to allow users to sign in and sign up to your Strapi admin panel via their Microsoft accounts. - [Okta SSO provider](https://docs.strapi.io/cms/configurations/sso-providers/okta.md): Okta is an SSO provider that allows users to sign in and sign up to Strapi through their Okta account using OAuth2 credentials configured in the auth.providers array. - [TypeScript configuration](https://docs.strapi.io/cms/configurations/typescript.md): TypeScript configuration explains the project’s tsconfig files, output directories, and an optional config/typescript.js|ts that auto-generates types on server restart. This documentation explains which folders store compiled code and how to toggle this experimental feature. - [Users & Permissions Providers](https://docs.strapi.io/cms/configurations/users-and-permissions-providers.md): Configure OAuth and OAuth2 providers for Strapi's Users & Permissions authentication feature, with setup guides for common providers like GitHub, Google, and Auth0, plus instructions for creating custom providers. - [Auth0 provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/auth-zero.md): Auth0 provider setup enables OAuth 2.0 authentication for the Users & Permissions feature, requiring configuration in both Auth0 tenant and Strapi admin settings using Client ID, Client Secret, and subdomain credentials. - [AWS Cognito provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/aws-cognito.md): AWS Cognito provider lets you set up OAuth 2.0 authentication for Users & Permissions by configuring a user pool in AWS and adding the client credentials and domain to Strapi's provider settings. - [CAS provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/cas.md): CAS is an SSO server that Strapi can use for authentication when deployed with OIDC support. Configure a CAS service definition and provide the client ID, secret, and provider subdomain in Strapi's Users & Permissions settings. - [Discord provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/discord.md): Discord provider setup allows you to authenticate users via Discord OAuth2 by configuring your Discord app credentials in Strapi's Users & Permissions provider settings. - [Facebook provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/facebook.md): Facebook provider setup enables social login authentication in Strapi's Users & Permissions feature. Configure a Facebook app with OAuth credentials and update Strapi settings to enable the provider with your Client ID, Client Secret, and frontend redirect URL. - [GitHub provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/github.md): GitHub provider setup enables OAuth authentication for Strapi's Users & Permissions feature, requiring GitHub OAuth app configuration and Strapi provider settings. - [Google provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/google.md): Configure Google OAuth authentication for Strapi Users & Permissions by creating credentials in Google Developer Console and adding them to the provider settings. - [Instagram provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/instagram.md): The Instagram Basic Display API is deprecated as of December 4, 2024. Strapi's built-in Instagram provider no longer works and requires updating to Meta's Instagram Business Login API instead. - [Keycloak provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/keycloak.md): Set up Keycloak as an identity provider for Strapi's Users & Permissions feature by configuring a client in Keycloak, then enabling and filling in the Keycloak provider details in Strapi's admin settings. - [LinkedIn provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/linkedin.md): Configure LinkedIn as a provider for Strapi's Users & Permissions feature by creating a LinkedIn app, registering the redirect URL, and entering your credentials in the Strapi admin panel. - [Creating and adding a custom Users & Permissions provider](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/new-provider-guide.md): Create custom OAuth providers for Strapi's Users & Permissions feature by registering them in src/index.js and implementing an authCallback that returns user email and username for automatic registration or login. - [Patreon provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/patreon.md): Set up Patreon as an OAuth provider for Users & Permissions by registering an OAuth client on Patreon and configuring it in Strapi with your Client ID and Client Secret. - [Reddit provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/reddit.md): Configure the Reddit provider for Users & Permissions by creating a Reddit app and inputting the Client ID and Secret in Strapi's provider settings. - [Twitch provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/twitch.md): Configure Twitch OAuth authentication for Strapi's Users & Permissions feature by registering your application on the Twitch developer console and adding your credentials to Strapi's provider settings. - [Twitter provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/twitter.md): Configure Twitter (now X) as an OAuth provider for Users & Permissions. Requires a paid X Developer Portal plan since the v1.1 API endpoint is no longer freely available. - [VK provider setup for Users & Permissions](https://docs.strapi.io/cms/configurations/users-and-permissions-providers/vk.md): VK provider setup for Users & Permissions enables authentication via VK. Configure a VK app, then set the client ID, secret, and redirect URL in Strapi's provider settings to enable VK login. - [Customization](https://docs.strapi.io/cms/customization.md): Strapi contains a backend server and admin panel, both of which can be customized to extend functionality like routes, policies, middlewares, themes, and more. - [Data export](https://docs.strapi.io/cms/data-management/export.md): The strapi export command exports data from a Strapi instance as an encrypted and compressed archive containing entities, relations, assets, schemas, and configuration. Customize exports using options like --no-encrypt, --no-compress, --only, and --exclude. - [Data import](https://docs.strapi.io/cms/data-management/import.md): The strapi import command restores project data from an encrypted or compressed archive, including content, configuration, files, and schemas. It supports importing from .tar.gz.enc files or unpacked directories, with options to exclude or include specific data types. - [Data transfer](https://docs.strapi.io/cms/data-management/transfer.md): The strapi transfer command streams data between two Strapi instances with identical schemas, transferring content, files, and configuration using transfer tokens for authorization and authentication. - [Database migrations](https://docs.strapi.io/cms/database-migrations.md): Database migrations run one‑time scripts before schema sync to preserve data during upgrades. The experimental API uses alphabetical up() files and warns about missing down migrations and potential table deletions. - [Database transactions](https://docs.strapi.io/cms/database-transactions.md): Database transactions group several operations so they succeed or roll back as a unit. The experimental strapi.db.transaction helper exposes trx, commit, and rollback utilities for wrapped service calls. - [Deployment](https://docs.strapi.io/cms/deployment.md): Deployment options cover hardware/software prerequisites, environment variable setup, and building the admin panel before launch. In the documentation: links to provider‑specific and advanced guides to help pick the right hosting strategy. - [Error handling](https://docs.strapi.io/cms/error-handling.md): Strapi’s APIs return errors in a consistent structure and let backend code throw custom exceptions for controllers, services, policies, or lifecycles. This documentation lists error classes, context helpers, and examples for crafting meaningful responses. - [FAQ](https://docs.strapi.io/cms/faq.md): Frequently asked questions covering common Strapi topics including content-type management, deployment, authentication, database handling, serverless limitations, plugins, Docker, SSL configuration, TypeScript support, and feature availability. - [Admin panel](https://docs.strapi.io/cms/features/admin-panel.md): The admin panel acts as Strapi’s back office for managing content types, entries, and both administrator and end‑user accounts. This documentation gives an overview of the admin panel before focusing on profile settings that manage interface language and mode, login and personal information, and logo for branding. - [Admin tokens](https://docs.strapi.io/cms/features/admin-tokens.md): Admin tokens authenticate programmatic access to the Strapi Admin API. Each token is scoped to a subset of its owner's permissions and is designed for automation workflows such as MCP agents, CI/CD pipelines, and scripts. - [API Tokens](https://docs.strapi.io/cms/features/api-tokens.md): API tokens authenticate external requests to the Strapi Content API without exposing user credentials. Each token is scoped to a set of permissions and expires after a configurable duration. - [Audit Logs](https://docs.strapi.io/cms/features/audit-logs.md): Audit Logs captures every administrative action in a searchable, filterable history to aid troubleshooting and compliance. In this documentation, examples show viewing payloads and filtering by user or date. - [Content History](https://docs.strapi.io/cms/features/content-history.md): Content History stores previous document versions so editors can compare and restore earlier states from the Content Manager. This documentation explains how to browse and restore workflows for quick rollback of mistakes. - [Content Manager](https://docs.strapi.io/cms/features/content-manager.md): The Content Manager is Strapi’s interface for browsing and editing entries. This documentation gives an overview of the Content Manager and explains the views and how to write content in fields, components, dynamic zones and relational fields. - [Content-type Builder](https://docs.strapi.io/cms/features/content-type-builder.md): The Content-type Builder is a tool for designing content types and components. This documentation gives an overview of the Content-type Builder and covers field options, relations, component usage, and shares data modeling tips. - [Custom Fields](https://docs.strapi.io/cms/features/custom-fields.md): Custom Fields extend Strapi with new field types that behave like native fields in the Content‑type Builder and Content Manager. Instructions in this documentation cover building or installing fields via plugins and registering them programmatically. - [Data Management](https://docs.strapi.io/cms/features/data-management.md): Data Management handles CLI-based import, export, and transfer of content between Strapi instances with partial configuration in the admin panel. Step-by-step commands and prerequisite settings explained in this documentation ensure safe migrations. - [Draft & Publish](https://docs.strapi.io/cms/features/draft-and-publish.md): Draft & Publish separates drafts from live entries, allowing editors to stage content before release. This documentation shows how to enable it per content type and manage publish or unpublish actions. - [Email](https://docs.strapi.io/cms/features/email.md): The Email feature sends transactional messages through local SMTP or external providers like SendGrid. Setup guidance in this documentation covers provider configuration and extending delivery via controllers or hooks. - [Internationalization](https://docs.strapi.io/cms/features/internationalization.md): Internationalization manages content in multiple locales directly from the admin panel. This documentation explains how to add locales, translate entries, and control locale-specific permissions. - [Media Library](https://docs.strapi.io/cms/features/media-library.md): Media Library centralizes all uploaded assets with search, filters, and folder organization. This documentation includes provider options, upload workflows, and explanations on inserting media into content. - [Preview](https://docs.strapi.io/cms/features/preview.md): Preview connects the Content Manager to the front end so editors can see changes before publishing. In this documentation: configuration steps to set preview URLs. - [Role-Based Access Control (RBAC)](https://docs.strapi.io/cms/features/rbac.md): Role-Based Access Control (RBAC) manages administrator roles and granular permissions in the admin panel. This documentation covers creating roles, assigning rights, and securing administrative workflows. - [Releases](https://docs.strapi.io/cms/features/releases.md): Releases group entries into publishable batches to trigger simultaneous publish or unpublish actions across content types and locales. Instructions in this documentation detail creating releases, adding entries, and understanding plan limitations. - [Review Workflows](https://docs.strapi.io/cms/features/review-workflows.md): Review Workflows define custom multi-stage pipelines for content review, facilitating collaboration from draft to publication. This documentation walks through creating workflows and assigning stages. - [Single Sign-On (SSO)](https://docs.strapi.io/cms/features/sso.md): Single Sign-On (SSO) lets administrators authenticate via identity providers such as Azure AD instead of local passwords. Configuration steps in this documentation cover enabling SSO and mapping roles. - [MCP server](https://docs.strapi.io/cms/features/strapi-mcp-server.md): Strapi includes a built-in Model Context Protocol (MCP) server. Once enabled, it lets AI clients create, read, update, delete, publish, and unpublish content directly through Strapi's Content Manager. All operations are gated by Admin token permissions. - [Users & Permissions](https://docs.strapi.io/cms/features/users-permissions.md): Users & Permissions manages end-user accounts, JWT-based authentication, and role-based access to APIs. This documentation explains how to create roles, configure permissions, and secure access to your content API. - [Users & Permissions GraphQL API](https://docs.strapi.io/cms/features/users-permissions/graphql-api.md): The Users & Permissions feature provides GraphQL queries and mutations for authentication, user management, and role-based access. - [Users & Permissions REST API](https://docs.strapi.io/cms/features/users-permissions/rest-api.md): The Users & Permissions feature provides REST API endpoints for authentication, user management, roles, and permissions. - [Setting up the admin panel](https://docs.strapi.io/cms/getting-started/setting-up-admin-panel.md): The admin panel is where you manage content-types, content, and users. Access it via the app URL, optionally using SSO, then configure your administrator profile including name, email, language, and password. - [Installation](https://docs.strapi.io/cms/installation.md): Strapi projects can be installed locally via CLI or run in Docker containers for development and production. - [CLI](https://docs.strapi.io/cms/installation/cli.md): The Strapi CLI is the fastest way to install Strapi locally using npx create-strapi@latest, with options to configure TypeScript, databases (--dbclient, --dbhost, etc.), and other setup preferences via command-line flags. - [Docker](https://docs.strapi.io/cms/installation/docker.md): This page guides you through running Strapi in Docker containers for development and production environments, including Dockerfile examples, Docker Compose configurations, and troubleshooting common issues. - [Welcome to the Strapi CMS Documentation!](https://docs.strapi.io/cms/intro.md): Strapi 5 is an open-source headless CMS where developers can build custom applications and manage content through an extensible admin panel with built-in role-based access control. - [From Entity Service API to Document Service API](https://docs.strapi.io/cms/migration/v4-to-v5/additional-resources/from-entity-service-to-document-service.md): The Document Service API replaces the Entity Service API in Strapi 5. The upgrade tool's codemod automatically converts function calls and publicationState to status, but manual intervention is required for documentId values and publication methods like publish() and unpublish(). - [Helper-plugin migration reference](https://docs.strapi.io/cms/migration/v4-to-v5/additional-resources/helper-plugin.md): Reference guide listing every export from the deprecated helper-plugin package with migration paths to replacement components and utilities in @strapi/strapi/admin, @strapi/design-system, and other packages. - [Additional resources for migrating to Strapi 5](https://docs.strapi.io/cms/migration/v4-to-v5/additional-resources/introduction.md): Additional resources provide dedicated guidance on specific Strapi 5 migration topics, including transitioning from the Entity Service API to Document Service API, upgrading plugins, and handling Design System v2 breaking changes. - [Plugins upgrade summary](https://docs.strapi.io/cms/migration/v4-to-v5/additional-resources/plugins-migration.md): Plugin developers upgrading from Strapi v4 to Strapi 5 must migrate to the Plugin SDK, transition from the Entity Service API to the Document Service API, update front-end code to use Design System v2 and remove helper-plugin dependencies. - [Breaking changes](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes.md): A comprehensive index of breaking changes between Strapi v4 and v5, organized by category (database, dependencies, configuration, APIs) with information on plugin impact and codemod support. - [The admin panel RBAC system has been updated](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/admin-panel-rbac-store-updated.md): Strapi 5 removes the content-manager_rbacManager redux store section and uses the regular permissions system with an updated useRBAC hook instead. - [Reserved attributes and content-types names](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/attributes-and-content-types-names-reserved.md): In Strapi 5, certain attribute names like meta, status, entryId, and anything prefixed with strapi are now reserved and cannot be used. Fields and content types using these names in v4 must be renamed before migrating to Strapi 5. - [Components and dynamic zones do not return an id](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/components-and-dynamic-zones-do-not-return-id.md): In Strapi 5, components and dynamic zones no longer return an id in REST API responses, preventing partial updates and requiring full component objects to be sent instead. - [Core service methods use the Document Service API](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/core-service-methods-use-document-service.md): In Strapi 5, core service methods use the Document Service API instead of the Entity Service API, with methods like findOne, update, and delete receiving a documentId instead of entityId. - [Database columns](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/database-columns.md): In Strapi 5, all content types automatically include documentid, publishedat, and locale database columns for document management, publication, and internationalization. - [Database identifiers shortened in v5](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/database-identifiers-shortened.md): Database identifiers are limited to 55 characters in Strapi v5; longer identifiers are automatically shortened with a hash suffix to prevent conflicts. - [defaultIndex removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/default-index-removed.md): In Strapi 5, the defaultIndex option is removed from the public middleware, and the root / URL automatically redirects to the admin panel login or homepage if connected. - [REST API input is validated by default in controllers](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/default-input-validation.md): In Strapi 5, REST API input is validated by default in controllers instead of being silently sanitized, throwing 400 Bad Request errors for invalid data like unrecognized fields and unpermitted relations. - [Design System Updates in Strapi 5](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/design-system.md): The Strapi Design System has been upgraded to v2 in Strapi 5 with changes to import structure, component APIs, and styling, including root imports, Radix-UI migrations, a new Field API, and a new base font-size of 62.5%. - [defaultIndex removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/do-not-update-repeatable-components-with-document-service-api.md): In Strapi 5, updating repeatable components with the Document Service API is not recommended because draft and published components have different IDs, preventing successful updates using documentId. - [The `EditViewLayout` and `ListViewLayout` have been rewritten](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/edit-view-layout-and-list-view-layout-rewritten.md): In Strapi 5, the content-managereditViewLayoutManager and content-managerlistViewLayoutManager Redux hooks have been removed and replaced with a new useDocumentLayout hook for admin panel customization. - [Entity Service deprecated](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/entity-service-deprecated.md): The Entity Service API is deprecated in Strapi 5 and replaced by the Document Service API, which uses documentId, returns arrays for all queries, and introduces new methods for draft and publish workflows. - [strapi.fetch uses native fetch() API](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/fetch.md): In Strapi 5, strapi.fetch wraps the native fetch() API instead of node-fetch, requiring the timeout parameter to be replaced with signal: AbortSignal.timeout(). - [The getWhere() method for permission provider instances has been removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/get-where-removed.md): The getWhere() method for permission provider instances has been removed in Strapi 5; use provider.values().filter() with a custom predicate instead to query and match provider items. - [The GraphQL API has been updated](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/graphql-api-updated.md): The Strapi 5 GraphQL API supports a new flattened response format and Relay-style connection queries for pagination. Migrate gradually using v4CompatibilityMode, adopt documentId, rename fields to connection, and eventually drop the attributes wrapper. - [helper-plugin removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/helper-plugin-deprecated.md): In Strapi 5, the helper-plugin is removed and replaced with imports from @strapi/strapi/admin and @strapi/design-system. Codemods automatically handle most migration changes for plugin developers. - [Internationalization (i18n) is now part of the strapi core](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/i18n-content-manager-locale.md): Internationalization (i18n) is now part of Strapi core instead of a plugin. The locale parameter sent to Content Manager changes from plugins[i18n][locale] in v4 to locale in v5. - [injectContentManagerComponent() removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/inject-content-manager-component.md): The injectContentManagerComponent() method is removed in Strapi 5 and replaced with getPlugin('content-manager').injectComponent() since the Content Manager is now a plugin. - [The isSupportedImage method is removed in Strapi 5](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/is-supported-image-removed.md): The isSupportedImage method is removed in Strapi 5. Developers must use isImage or isOptimizableImage instead. - [Strapi 5 uses koa-body v6](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/koa-body-v6.md): Strapi 5 upgrades to koa-body v6 with formidable v2, changing uploaded file properties from path, name, type to filepath, originalFilename, mimetype in custom endpoints. - [lockIcon replaced by licenseOnly](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/license-only.md): In Strapi 5, the lockIcon property is replaced by licenseOnly in the Admin Panel API methods addMenuLink(), addSettingsLink(), and addSettingsLinks(), displaying a lightning icon to indicate paid features. - [Database lifecycle hooks are triggered differently with the Document Service API methods](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/lifecycle-hooks-document-service.md): In Strapi 5, database lifecycle hooks are triggered differently when using Document Service API methods, varying by operation type and status changes due to the new Draft & Publish system. - [Some Mailgun provider legacy variables are not supported](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/mailgun-provider-variables.md): In Strapi 5, legacy Mailgun provider variables apiKey and host are no longer supported; use key and url instead. - [Model config path uses uid instead of dot notation](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/model-config-path-uses-uid.md): In Strapi 5, configuration paths use :: notation instead of dot notation to access models, changing plugin.upload.somesetting to plugin::upload.somesetting. - [MySQL v5 unsupported](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/mysql5-unsupported.md): MySQL v5 is no longer supported in Strapi v5; MySQL v8 is now the minimum required version. Upgrade your MySQL database to v8.0 to use Strapi v5. - [Strapi 5 has a new, flattened response format for API calls](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/new-response-format.md): Strapi 5 flattens REST API responses by removing the attributes wrapper and using documentId instead of id. Use the Strapi-Response-Format: v4 header during migration for backward compatibility. - [No findPage() in Document Service API](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/no-find-page-in-document-service.md): Strapi 5 replaces the Entity Service API with the Document Service API, which does not include findPage(). Use the Document Service API's findMany() method instead. - [locale=all can not be used to query all locales](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/no-locale-all.md): In Strapi 5, the locale=all parameter no longer retrieves all localized versions; instead, specific locale values must be requested individually. - [No shared population strategy for components & dynamic zones](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/no-shared-population-strategy-components-dynamic-zones.md): In Strapi 5, components and dynamic zones must be explicitly populated using on fragments instead of the shared population strategy supported in v4. - [Upload a file at entry creation no longer supported](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/no-upload-at-entry-creation.md): In Strapi 5, uploading a file while creating an entry is no longer supported. Users must upload the file first via the Upload API, then create the entry with the file id. - [Only the `better-sqlite3` package is supported for the SQLite client](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/only-better-sqlite3-for-sqlite.md): In Strapi 5, SQLite databases must use the better-sqlite3 package with the database client configuration set to sqlite instead of other options like sqlite3 or sqlite-legacy. - [Only the mysql2 package is supported for the MySQL client](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/only-mysql2-package-for-mysql.md): Strapi 5 only supports the mysql2 package for MySQL databases and requires the client configuration option to be set to mysql. - [publicationState is removed and replaced by status](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/publication-state-removed.md): In Strapi 5, the publicationState parameter is replaced with status, which accepts draft and published values instead of live and preview. - [Content types with Draft & Publish disabled always have the publishedAt value set to a date](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/publishedat-always-set-when-dandp-disabled.md): In Strapi 5, content-types with Draft & Publish disabled always have the publishedAt attribute set to a date, whereas in v4 the attribute did not exist. - [Strapi 5 uses React Router DOM 6](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/react-router-dom-6.md): Strapi 5 upgrades to react-router-dom v6, requiring settings and menu links added via the Admin Panel API to use relative paths instead of absolute paths. - [The ContentManagerAppState redux is modified](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/redux-content-manager-app-state.md): In Strapi 5, the ContentManagerAppState redux store removed RESETINITDATA and GETINITDATA actions, and changed SETINITDATA payload structure to no longer nest attributes within a data object. - [The Users & Permissions plugin's register.allowedFields configuration option defaults to []](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/register-allowed-fields.md): In Strapi 5, the Users & Permissions plugin's register.allowedFields defaults to an empty array, requiring explicit field allowlisting instead of accepting all fields by default. - [The 'webhooks.populateRelations' server configuration is removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/remove-webhook-populate-relations.md): In Strapi 5, the webhooks.populateRelations server configuration is removed. Webhook refactoring eliminates the need for this option, but code relying on populated relations in create, update, and delete responses must be updated to fetch necessary data manually. - [Some env-only configuration options are handled by the server configuration](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/removed-support-for-some-env-options.md): In Strapi 5, three environment variables (STRAPIDISABLEREMOTEDATATRANSFER, STRAPIHIDESTARTUPMESSAGE, STRAPIDISABLEUPDATENOTIFICATION) are now configured via the server configuration file instead of environment variables. - [Server log level is `http`](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/server-default-log-level.md): In Strapi 5, the server log level defaults to http instead of silly, reducing verbose logging by hiding silly and debug level logs. Configure the log level in your server configuration file to adjust output verbosity. - [Server proxy configuration](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/server-proxy.md): In Strapi 5, all proxy configuration options are consolidated under the server.proxy object in /config/server.js|ts, replacing separate server.globalProxy and server.proxy options from v4. - [Sorting by id is no longer possible to sort by chronological order](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/sort-by-id.md): Sorting by id no longer works chronologically in Strapi 5 due to uuid-based documents; use createdAt with the Document Service API instead. - [Strapi is a subclass of Container](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/strapi-container.md): In Strapi 5, Strapi is a subclass of Container, allowing you to access container methods directly on the strapi object using strapi.add() and strapi.get() instead of strapi.container.register() and strapi.container.get(). - [Strapi factories import have been updated](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/strapi-imports.md): In Strapi 5, the import syntax for the application init function and factories has been updated; use createStrapi from @strapi/strapi instead of the v4 patterns, and some legacy import patterns are no longer supported. - [strapi-utils is refactored](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/strapi-utils-refactored.md): In Strapi 5, the strapi-utils package is refactored with utilities reorganized into arrays, dates, strings, objects, and async namespaces, and some utilities moved, replaced with service methods, or removed. - [Strict requirements for configuration filenames](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/strict-requirements-config-files.md): Strapi 5 enforces strict naming requirements for configuration files in the /config/ folder: no case-insensitive duplicates, no duplicate base filenames, and certain reserved names are blocked; custom configurations should use files with names compliant to these rules. - [Templates are now regular, standalone Strapi applications](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/templates.md): Templates are now standalone Strapi 5 applications instead of npm packages with strict requirements, making them easier to create, distribute, and reuse. - [Apollo Server v3 upgraded to Apollo Server v4](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/upgrade-to-apollov4.md): Strapi 5 upgrades Apollo Server from v3 to v4 and GraphQL from v15 to v16, requiring migration updates to error handling, CSRF prevention, and plugin configuration. - [documentId should be used instead of id in API calls](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/use-document-id.md): In Strapi 5, the documentId field replaces id for identifying documents in Content API calls (REST API and GraphQL) as part of the Document Service API transition. - [Vite is the default bundler](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/vite.md): In Strapi 5, Vite replaces webpack as the default bundler. Users with custom webpack configurations can convert to Vite configurations or use --bundler=webpack to maintain v4 behavior. - [Webpack Aliases are removed](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/webpack-aliases-removed.md): Strapi v5 removes most webpack aliases for better compatibility, keeping only essential dependencies like react, react-dom, react-router-dom, and styled-components aliased. - [The CLI default package manager is not yarn anymore](https://docs.strapi.io/cms/migration/v4-to-v5/breaking-changes/yarn-not-default.md): In Strapi 5, the CLI detects your package manager and uses it to install dependencies instead of defaulting to yarn. Use the --use-yarn flag if you need to enforce yarn specifically. - [Upgrading to Strapi 5 - Introduction and FAQ](https://docs.strapi.io/cms/migration/v4-to-v5/introduction-and-faq.md): Upgrading to Strapi 5 from v4 uses an upgrade tool with codemods to handle code changes, while built-in data migration scripts automatically update the database on first startup. - [Step-by-step guide to upgrade to Strapi 5](https://docs.strapi.io/cms/migration/v4-to-v5/step-by-step.md): Follow step-by-step instructions to upgrade your Strapi v4 application to Strapi 5, including database and code backups, running the automated upgrade tool, handling manual code updates, and gradually migrating your REST and GraphQL API calls using compatibility headers. - [Admin fetch client](https://docs.strapi.io/cms/plugins-development/admin-fetch-client.md): Use useFetchClient inside React components and getFetchClient elsewhere to call Strapi APIs with the user's authentication token attached. Both expose get, post, put, and del methods with automatic token refresh on 401 responses. - [Admin hooks](https://docs.strapi.io/cms/plugins-development/admin-hooks.md): The Hooks API lets plugins create extension points (createHook in register) and subscribe to them (registerHook in bootstrap). Hooks run in series, waterfall, or parallel. Strapi includes predefined hooks for the Content Manager's List and Edit views. - [Admin injection zones](https://docs.strapi.io/cms/plugins-development/admin-injection-zones.md): Injection zones are predefined areas in the admin UI where plugins can inject React components. Use getPlugin('content-manager').injectComponent() to extend built-in views, or define your own zones with injectionZones in registerPlugin. - [Admin localization](https://docs.strapi.io/cms/plugins-development/admin-localization.md): Register translation files with registerTrads, prefix keys with your plugin ID to avoid conflicts, and use react-intl's useIntl hook in components. Strapi merges plugin translations with core translations automatically. - [Admin navigation & settings](https://docs.strapi.io/cms/plugins-development/admin-navigation-settings.md): Use addMenuLink in register to add sidebar links, createSettingSection in register to create settings groups, and addSettingsLink/addSettingsLinks in bootstrap to extend existing settings sections. - [Admin Panel API overview](https://docs.strapi.io/cms/plugins-development/admin-panel-api.md): The Admin Panel API exposes register, bootstrap, and registerTrads hooks to inject React components and translations into Strapi's UI. Menu, settings, injection zone, reducer, and hook APIs let plugins add navigation, configuration panels, or custom actions. - [Redux store & reducers](https://docs.strapi.io/cms/plugins-development/admin-redux-store.md): Use addReducers() during register to add custom state to the Redux store. Then read state with useSelector, update it with useDispatch, and subscribe to changes with useStore. The admin_app slice exposes theme, locale, permissions, and authentication data. - [Content Manager APIs](https://docs.strapi.io/cms/plugins-development/content-manager-apis.md): Content Manager APIs add panels, actions, and custom rich text blocks to the Content Manager through addEditViewSidePanel, addDocumentAction, addDocumentHeaderAction, addBulkAction, or addRichTextBlocks. Each API accepts component functions with typed contexts, enabling precise control over document-aware UI injections. - [Plugin creation & setup](https://docs.strapi.io/cms/plugins-development/create-a-plugin.md): The Plugin SDK generates plugins without a Strapi project and links them to an existing app with watch:link and yalc. In this documentation: build and verify commands to bundle the plugin for npm or marketplace publishing, and information for monorepos and local setups. - [Developing plugins](https://docs.strapi.io/cms/plugins-development/developing-plugins.md): Strapi plugins extend core functionality using Admin Panel API, Server API, or MCP server tools. Plugins can be local or published to the Marketplace, and are created using the Plugin SDK. - [Extending the MCP server with plugins](https://docs.strapi.io/cms/plugins-development/extend-mcp-server.md): Strapi plugins can register additional MCP tools through the strapi.ai.mcp service. Registrations must happen while the MCP server is idle (during the plugin's register() lifecycle phase), before the server starts. - [How to create admin permissions from plugins](https://docs.strapi.io/cms/plugins-development/guides/admin-permissions-for-plugins.md): Plugins can register admin permissions server-side using strapi.admin.services.permission.actionProvider.registerMany(), then protect pages with , menu links, and components using the useRBAC hook to enforce role-based access control. - [How to create components for Strapi plugins](https://docs.strapi.io/cms/plugins-development/guides/create-components-for-plugins.md): Create reusable component data structures for Strapi plugins using the Content-Type Builder or manually by defining a schema file with attributes and metadata in your plugin's server directory. - [How to pass data from server to admin panel with a Strapi plugin](https://docs.strapi.io/cms/plugins-development/guides/pass-data-from-server-to-admin.md): Pass data from a Strapi plugin's server to the admin panel by creating a custom admin route and using the getFetchClient API to request data from admin components. - [How to store and access data from a Strapi plugin](https://docs.strapi.io/cms/plugins-development/guides/store-and-access-data.md): Plugin content-types store and persist data like standard content-types. Use the CLI generator to create them, then interact with data via the Document Service API or Query Engine API. - [Plugin SDK reference](https://docs.strapi.io/cms/plugins-development/plugin-sdk.md): The Plugin SDK is a set of commands from @strapi/sdk-plugin for creating, building, linking, and publishing Strapi plugins locally or to NPM and the Marketplace. - [Plugin structure](https://docs.strapi.io/cms/plugins-development/plugin-structure.md): A Strapi plugin is divided into an admin/ folder for admin panel UI components and a server/ folder for backend logic like content-types and controllers, each with its own API. - [Plugins extension](https://docs.strapi.io/cms/plugins-development/plugins-extension.md): Existing plugins can be overriden by placing code in /src/extensions or using global register/bootstrap hooks. Instructions in this documentation cover reshaping plugin content-type schemas or server logic — altough upstream updates may break extensions. - [Server API for plugins](https://docs.strapi.io/cms/plugins-development/server-api.md): The Server API defines what a plugin registers, exposes, and executes on the Strapi server. It covers lifecycle hooks, routes, controllers, services, policies, middlewares, and configuration. Use the entry file to declare what the plugin contributes, then navigate to the dedicated pages below for each capability. - [Server configuration](https://docs.strapi.io/cms/plugins-development/server-configuration.md): The Server API exposes a config object with a default property and a validator function. Strapi deep-merges the defaults with the user's config/plugins file, then runs validation before the plugin loads. Read configuration at runtime with strapi.plugin('my-plugin').config('key'). - [Server content-types](https://docs.strapi.io/cms/plugins-development/server-content-types.md): The Server API exports a contentTypes object from the server entry file to declare plugin content-types. The recommended naming convention is to use the same value for the export key and info.singularName so the runtime UID remains predictable when querying or sanitizing data. - [Server controllers & services](https://docs.strapi.io/cms/plugins-development/server-controllers-services.md): Just like the Strapi core, plugins can have controllers and services. Plugin controllers handle the HTTP layer: they receive ctx, call services, and return responses. Plugin services hold reusable business logic and interact with content-types through the Document Service API. Keep controllers thin and put domain logic in services. - [Server getters & usage](https://docs.strapi.io/cms/plugins-development/server-getters-usage.md): Access plugin resources through top-level getters (strapi.plugin('my-plugin').service('name')) or global getters (strapi.service('plugin::my-plugin.name')). Both return the same object. Use top-level getters inside your own plugin, and global getters from application code or other plugins. Routes have no global getter equivalent. Configuration uses dedicated configuration APIs. - [Server lifecycle](https://docs.strapi.io/cms/plugins-development/server-lifecycle.md): The Server API has 3 lifecycle functions. Use register() to declare capabilities before the app is fully initialized, bootstrap() to run logic once Strapi is initialized, and destroy() to clean up resources on shutdown. Each function receives { strapi } as its argument. - [Server policies & middlewares](https://docs.strapi.io/cms/plugins-development/server-policies-middlewares.md): Just like the Strapi core, plugins can have policies and middlewares. Plugin policies run before a controller action and return true or false to allow or block the request. Plugin middlewares run in sequence around the full request/response cycle and call next() to continue. Declare policies and middlewares as objects of factory functions and reference them by their plugin-namespaced name in routes. - [Server routes](https://docs.strapi.io/cms/plugins-development/server-routes.md): The Server API exports a routes value from the server entry file to expose plugin endpoints. Use the array format only for implicit admin routes, the named router format to separate admin and Content API routes, or the factory callback format for dynamic route configuration. - [Documentation plugin](https://docs.strapi.io/cms/plugins/documentation.md): The Documentation plugin auto-generates OpenAPI/Swagger docs for your API by scanning content types and routes. This documentation walks you through installation, customizing settings, and restricting access to the docs. - [GraphQL plugin](https://docs.strapi.io/cms/plugins/graphql.md): The GraphQL plugin adds a GraphQL endpoint and Apollo-based sandbox for crafting queries and mutations. Options in config/plugins let you tune depth, item limits, and other Apollo Server settings which are explained in this documentation. - [Installing Plugins via the Marketplace](https://docs.strapi.io/cms/plugins/installing-plugins-via-marketplace.md): The in-app Marketplace lists plugins and providers with badges, search, and “More” links to detailed Strapi Market pages. This documentation outlines browsing cards and following provider-specific instructions to install new integrations. - [Sentry plugin](https://docs.strapi.io/cms/plugins/sentry.md): The Sentry plugin connects Strapi to Sentry to report errors and attach debugging metadata. This documentation details installation, environment-based configuration, and ways to disable or skip sending events outside production. - [Project structure](https://docs.strapi.io/cms/project-structure.md): A Strapi project's structure varies depending on whether it was created with TypeScript (the default with --quickstart) or vanilla JavaScript, and is displayed through an interactive project structure component. - [Quick Start Guide - Strapi Developer Docs](https://docs.strapi.io/cms/quick-start.md): Build and deploy a Strapi project from scratch in 10 steps: create a local project with create-strapi@latest, define collection types using the Content-Type Builder, deploy to Strapi Cloud with npm run strapi deploy, and add content via the Content Manager. - [Setup and Deployment](https://docs.strapi.io/cms/setup-deployment.md): Strapi follows a three-step workflow: install on your local machine, configure the server and admin panel, then deploy to a remote environment like Strapi Cloud. - [strapi-utils](https://docs.strapi.io/cms/strapi-utils.md): The @strapi/utils package provides shared helper functions used across Strapi's core and available for use in custom code. It includes error classes, environment variable helpers, hook factories, type parsing, string and file utilities, and async helpers. - [Templates](https://docs.strapi.io/cms/templates.md): Templates are full Strapi apps that bootstrap new projects via CLI flags such as --template, --template-path, and --template-branch. Instructions in this documentation cover referencing templates from GitHub and turning any Strapi project into a reusable template. - [Testing](https://docs.strapi.io/cms/testing.md): Testing relies on Jest and Supertest with an in-memory SQLite database, a patched Strapi test harness that also supports TypeScript configuration files, and helpers that automatically register the /hello route and authenticated role during setup. - [TypeScript](https://docs.strapi.io/cms/typescript.md): TypeScript adds a type system layer to Strapi applications, enabling type-safe code and automatic type generation. Create a new TypeScript project with the --typescript flag or add TypeScript support to an existing project. - [Adding TypeScript support](https://docs.strapi.io/cms/typescript/adding-support-to-existing-project.md): Add TypeScript support to existing Strapi projects by creating root and admin tsconfig.json files with allowJs: true for incremental migration, then rebuild the admin panel. - [TypeScript development](https://docs.strapi.io/cms/typescript/development.md): TypeScript development showcases Strapi typings for autocompletion, schema type generation with ts:generate-types, and programmatic server starts via strapi() or strapi.compile(). This documentation addresses plugin builds and managing generated type definitions. - [TypeScript - Manipulating Documents and Entries](https://docs.strapi.io/cms/typescript/documents-and-entries.md): Safely manipulate documents and entries in Strapi v5 TypeScript projects using the UID and Data namespaces for type safety, enabling both generic and known entity type operations with code completion. - [TypeScript Guides](https://docs.strapi.io/cms/typescript/guides.md): Guides for leveraging TypeScript in Strapi projects, covering patterns for manipulating documents and entries, and adding TypeScript support to existing projects. - [Upgrade tool](https://docs.strapi.io/cms/upgrade-tool.md): The upgrade tool is a CLI command that automatically upgrades Strapi applications to a new version by updating dependencies and applying codemods to the codebase. - [Upgrades](https://docs.strapi.io/cms/upgrades.md): Strapi periodically releases new versions with improvements. Find your current version in the admin panel or terminal, then follow the upgrade guide for Strapi v4 to v5 migration or use the upgrade tool for v5.x updates. - [Usage information](https://docs.strapi.io/cms/usage-information.md): Strapi collects non-sensitive aggregated data like project ID, machine ID, environment state, and OS to improve the platform, with GDPR compliance and opt-out available via telemetry:disable command or strapi.telemetryDisabled flag.