Connect your JavaScript/TypeScript apps to a flexible and fully customizable Strapi backend with ease.
CMS Repository - Website - SDK Roadmap
- Getting Started
- Creating and Configuring a Strapi Client Instance
- API Reference
- Resource Managers
- Debug
- Demo Projects
- Contributing
Before you begin, ensure you have the following:
- A Strapi backend up and running: quick start guide.
- The API URL of your Strapi instance: for example,
http://localhost:1337/api. - A recent version of Node.js installed.
Install the client as a dependency in your project:
NPM
npm install @strapi/clientYarn
yarn add @strapi/clientpnpm
pnpm add @strapi/clientTo interact with your Strapi backend, initialize the client with your Strapi API base URL:
import{strapi}from'@strapi/client';constclient=strapi({baseURL: 'http://localhost:1337/api'});Alternatively, use a <script> tag in a browser environment:
<scriptsrc="https://cdn.jsdelivr.net/npm/@strapi/client"></script><script>constclient=strapi.strapi({baseURL: 'http://localhost:1337/api'});</script>The client library supports multiple authentication strategies for accessing authenticated content in your Strapi backend.
If your Strapi instance uses API tokens, configure the client like this:
constclient=strapi({// Endpoint configurationbaseURL: 'http://localhost:1337/api',// Auth configurationauth: 'your-api-token-here',});You can configure custom headers to be included with every request made by the client:
constclient=strapi({baseURL: 'http://localhost:1337/api',auth: 'your-api-token-here',headers: {'X-Custom-Header': 'value','Accept-Language': 'en-US',},});Custom headers specified in the client configuration are applied to all requests
Example: Using Custom Headers
// Initialize client with custom headersconstclient=strapi({baseURL: 'http://localhost:1337/api',headers: {'X-Request-ID': '12345','Accept-Language': 'en-US',},});// Headers will be included in all requestsconstarticles=awaitclient.collection('articles').find();The Strapi client library instance provides key properties and utility methods for content and API interaction:
baseURL: base URL of your Strapi backend.fetch(): perform generic requests to the Strapi Content API using fetch-like syntax.collection(): get a manager instance for handling collection-type resources.single(): get a manager instance for handling single-type resources.files: access the files manager instance for handling common files operations.
The .collection() method provides a manager for working with collection-type resources,
which can have multiple entries.
resource:string- plural name of your collection type, as defined in the Strapi model[options]:object- additional options to pass to the collection type manager[path]:string- optional root path override for the manager's queries
find(queryParams?): fetch multiple entries.findOne(documentID, queryParams?): fetch a single entry by its ID.create(data, queryParams?): create a new entry.update(documentID, data, queryParams?): update an existing entry.delete(documentID, queryParams?): remove an entry.
constarticles=client.collection('articles');// Fetch all english articles sorted by titleconstallArticles=awaitarticles.find({locale: 'en',sort: 'title',});// Fetch a single articleconstsingleArticle=awaitarticles.findOne('article-document-id');// Create a new articleconstnewArticle=awaitarticles.create({title: 'New Article',content: '...'});// Update an existing articleconstupdatedArticle=awaitarticles.update('article-document-id',{title: 'Updated Title'});// Delete an articleawaitarticles.delete('article-id');The client automatically detects and handles special Strapi content-types like users from the users-permissions plugin. You can work with them seamlessly:
// Auto-detected as users-permissions - no configuration needed!constusers=client.collection('users');// Create a new userawaitusers.create({username: 'john',email: 'john@example.com',password: 'SecurePass123!',role: 1,});// Find usersconstallUsers=awaitusers.find();// Update a userawaitusers.update('user-id',{username: 'john_updated'});Note: The users-permissions plugin has a different API contract than regular content-types. The client automatically handles this by not wrapping the payload in a
dataobject.
You can also customize the root path for requests by providing a value for the path option:
constarticles=client.collection('articles',{path: '/my-custom-path'});The .single() method provides a manager for working with single-type resources, which have only one entry.
resource:string- singular name of your single type, as defined in the Strapi model[options]:object- additional options to pass to the single type manager[path]:string- optional root path override for the manager's queries
find(queryParams?): fetch the document.update(data, queryParams?): update the document.delete(queryParams?): remove the document.
consthomepage=client.single('homepage');// Fetch the default version of the homepageconstdefaultHomepage=awaithomepage.find();// Fetch the spanish version of the homepageconstspanishHomepage=awaithomepage.find({locale: 'es'});// Update the homepage draft contentconstupdatedHomepage=awaithomepage.update({title: 'Updated Homepage Title'},{status: 'draft'});// Delete the homepage contentawaithomepage.delete();You can also customize the root path for requests by providing a value for the path option:
consthomepage=client.single('homepage',{path: '/my-custom-path'});The files property provides access to the Strapi Media Library through the Upload plugin. It allows you to retrieve files metadata without directly interacting with the REST API manually.
find(params?: FileQueryParams): Promise<FileListResponse>- Retrieves a list of file metadata based on optional query parametersfindOne(fileId: number): Promise<FileResponse>- Retrieves the metadata for a single file by its IDupdate(fileId: number, fileInfo: FileUpdateData): Promise<FileResponse>- Updates metadata for an existing filedelete(fileId: number): Promise<void>- Deletes a file by its ID
Finding all files
// Initialize the clientconstclient=strapi({baseURL: 'http://localhost:1337/api',auth: 'your-api-token',});// Find all file metadataconstallFiles=awaitclient.files.find();console.log(allFiles);// Find file metadata with filtering and sortingconstimageFiles=awaitclient.files.find({filters: {mime: {$contains: 'image'},// Only get image filesname: {$contains: 'avatar'},// Only get files with 'avatar' in the name},sort: ['name:asc'],// Sort by name in ascending order});Finding a Single File
// Initialize the clientconstclient=strapi({baseURL: 'http://localhost:1337/api',auth: 'your-api-token',});// Find file metadata by IDconstfile=awaitclient.files.findOne(1);console.log(file.name);// The file nameconsole.log(file.url);// The file URLconsole.log(file.mime);// The file MIME typeUpdating File Metadata
// Initialize the clientconstclient=strapi({baseURL: 'http://localhost:1337/api',auth: 'your-api-token',});// Update file metadataconstupdatedFile=awaitclient.files.update(1,{name: 'New file name',alternativeText: 'Descriptive alt text for accessibility',caption: 'A caption for the file',});console.log(updatedFile.name);// Updated file nameconsole.log(updatedFile.alternativeText);// Updated alt textDeleting a File
// Initialize the clientconstclient=strapi({baseURL: 'http://localhost:1337/api',auth: 'your-api-token',});// Delete a file by IDconstdeletedFile=awaitclient.files.delete(1);console.log('File deleted successfully');console.log('Deleted file ID:',deletedFile.id);console.log('Deleted file name:',deletedFile.name);This section provides guidance on enabling and managing debug logs for the SDK, powered by debug.
In Node.js bundles (cjs, esm), debugging capabilities are always available to use.
You can turn on or off debug logs using the DEBUG environment variable:
# Enable logs for all namespaces
DEBUG=*# Enable logs for a specific namespace
DEBUG=strapi:http
# Turn off logsunset DEBUGFor browser environments, debug capabilities are intentionally turned off to optimize the bundle size.
The debug tool allows you to control logs using wildcard patterns (*):
*: enable all logs.strapi:module: enable logs for a specific module.strapi:module1,sdk:module2: enable logs for multiple modules.strapi:*: match all namespaces understrapi.strapi:*,-strapi:module2: enable all logs except those fromstrapi:module2.
Below is a list of available namespaces to use:
| Namespace | Description |
|---|---|
strapi:core | Logs SDK initialization, configuration validation, and HTTP client setup. |
strapi:validators:config | Logs details related to SDK configuration validation. |
strapi:validators:url | Logs URL validation processes. |
strapi:http | Logs HTTP client setup, request processing, and response/error handling. |
strapi:auth:factory | Logs the registration and creation of authentication providers. |
strapi:auth:manager | Logs authentication lifecycle management. |
strapi:auth:provider:api-token | Logs operations related to API token authentication. |
strapi:ct:collection | Logs interactions with collection-type content managers. |
strapi:ct:single | Logs interactions with single-type content managers. |
strapi:utils:url-helper | Logs URL helper utility operations (e.g., appending query parameters or formatting URLs). |
strapi:files | Logs interactions with the files manager. |
This repository includes demo projects located in the /demo directory to help you get started with using the client. The actual Strapi app is located in the .strapi-app directory.
.strapi-app: the main Strapi app used for the demo projects.demo/node-typescript: a Node.js project using TypeScript.demo/node-javascript: a Node.js project using JavaScript.demo/next-server-components: a Next.js project using TypeScript and server components.demo/react-vite: a React project using Vite and TypeScript
The repository supports running demo-related commands directly using the format pnpm demo <command>.
To display the entire list of available commands, use pnpm demo help
pnpm demo setup
A complete setup command that installs dependencies, sets up the environment, builds the projects, and seeds the database with initial data for the demo app.It is a one-stop command for preparing everything.
pnpm demo setup
pnpm demo app:start
Starts the Strapi demo app in development mode. This is useful for testing and making changes to the Strapi backend.pnpm demo app:start
pnpm demo app:seed
Seeds the Strapi app with sample data. Use this when you want to populate your Strapi app with default content.pnpm demo app:seed
pnpm demo app:seed:clean
Cleans the existing database and re-seeds the Strapi demo app. This is helpful if you want to reset the demo data to its initial state.pnpm demo app:seed:clean
pnpm demo build
Builds the main Strapi app and all demo projects.Use this to prepare the projects for use, ensuring all components are compiled and ready.
pnpm demo build
pnpm demo install
Installs dependencies for the main Strapi app and all demo applications.This command ensures that all required packages are downloaded and ready to go.
pnpm demo install
pnpm demo app:env:setup
Sets up the.envfile for the main Strapi app by copying the example.env.examplefile if no.envfile exists.This ensures the environment is configured appropriately.
pnpm demo app:env:setup
New projects added to the /demo directory are automatically picked up by the demo scripts.
Thus, no explicit configuration updates are required for these commands to work with new demo directories.
Note: if a project needs to be built to be used, add a build script
to its package.json so that the demo scripts automatically run it.
We plan to expand the demo projects to include:
- A basic HTML project
- A Vue.js project (with or without server components)
- A Svelte project