Reference · Tools

Strapi

CRUD operations for content entries in a self-hosted Strapi headless CMS instance

Action Data & Storage v1

The Strapi node performs CRUD on content entries in a self-hosted Strapi instance, working with both v3 and v4. A typical build is creating a content entry from an external source and updating it whenever that source changes.

Node type
Action
Parameters
17
Outputs
Output, Error
Credentials
Strapi (Username & Password) , Strapi API Token

Strapi

CRUD operations for Strapi headless CMS content entries

Overview

Strapi is a self-hosted, open-source headless content management system. This tool creates, reads, updates and deletes content entries in any content type you have defined. It supports both the Strapi v3 and v4 APIs, which differ in URL structure, request body format, query parameter conventions and response shape; the version you are talking to — along with your instance URL — comes from the credential you select, so the same node configuration works against either. Content types are your own, and you name them as a string.

Category: Data & Storage
Tool Name: strapi
Version: 1

Appearance: Icon: si-strapi | Color: #4945FF

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Strapi (Username & Password) or Strapi API Token credentials — configure whichever matches your instance, and use the Authentication parameter to pick the one this node uses. Username & Password exchanges your login for a short-lived token each run; API Token uses a token you generated in Strapi beforehand.

See the Credentials Guide for setup instructions.

Resources

ResourceValue
Entryentry

Operations

OperationValueDescription
CreatecreateCreate an entry
DeletedeleteDelete an entry
GetgetGet an entry
Get ManygetAllGet many entries
UpdateupdateUpdate an entry

Parameters

Entry: Create

ParameterTypeRequiredDefaultDescription
Content TypestringYesName of the content type (e.g. “articles”, “products”). This is the plural API name of your Strapi content type.
ColumnsstringNoComma-separated list of field names from the input item to include in the request body. Only listed fields will be sent to Strapi.

Entry: Delete

ParameterTypeRequiredDefaultDescription
Content TypestringYesName of the content type.
Entry IDstringYesThe ID of the entry to delete. Supports expressions like {{ $json.articleId }}.

Entry: Get

ParameterTypeRequiredDefaultDescription
Content TypestringYesName of the content type.
Entry IDstringYesThe ID of the entry to get. Supports expressions like {{ $json.articleId }}.

Entry: Get Many

ParameterTypeRequiredDefaultDescription
Content TypestringYesName of the content type.
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
OptionscollectionNo{}Extra query options applied to the listing.
— Publication StateoptionsNoOnly select entries matching the publication state provided.
Options: live (published entries only), preview (drafts as well as published entries)
— Sort FieldsstringNoComma-separated sort fields. Each field optionally followed by “:asc” or “:desc”. Example: “name:asc,createdAt:desc”.
— Where (JSON)stringNoJSON filter query. For Strapi v3 uses _where syntax. For Strapi v4 uses filters syntax. Must be valid JSON.

Entry: Update

ParameterTypeRequiredDefaultDescription
Content TypestringYesName of the content type.
Update KeystringYesidName of the property in the input data that contains the entry ID. Normally “id”.
ColumnsstringNoComma-separated list of field names from the input item to include in the update request body.

All Operations

ParameterTypeRequiredDefaultDescription
AuthenticationoptionsNopasswordAuthentication method to use. Username & Password obtains a JWT at runtime; API Token uses a pre-generated token.
Options: password, token
Max ConcurrencynumberNo10Maximum number of items to process concurrently.

Output Data

The entry returned by Strapi is the output item’s JSON — the result is not nested under a property, and the incoming item’s own fields are not carried through. Binary data on the input item is forwarded unchanged.

Create, Delete, Get and Update each produce exactly one output item per input item. Get Many fans out: one output item per entry returned, so a listing that matches 200 entries turns one input item into 200 output items — and a listing that matches nothing produces no output items at all for that input item.

OperationOutput items per input itemItem JSON
create1The created entry, exactly as the API returned it. On v4 that is the { data, meta } envelope, so the entry itself is under data.
delete1The deleted entry, exactly as the API returned it. On v4 that is the { data, meta } envelope.
get1The entry. On v4 the data envelope is unwrapped for you.
getAllone per entry returned (none when nothing matches)One entry per item. On v4 each item is an entry out of data.
update1The updated entry. On v4 the data envelope is unwrapped for you.

Reference fields downstream by expression, e.g. {{ $json.id }} or {{ $json.attributes.title }} on v4.

Usage Examples

  • Create a new blog post entry in Strapi
  • Get all products from Strapi with filtering
  • Update an article entry in Strapi CMS
  • Delete a content entry from Strapi by ID

Example Configuration

Create an article from the incoming item, sending only three of its fields:

{
  "type": "strapi",
  "parameters": {
    "authentication": "token",
    "resource": "entry",
    "operation": "create",
    "contentType": "articles",
    "columns": "title,content,publishedAt"
  }
}

Fetch a single entry by ID:

{
  "type": "strapi",
  "parameters": {
    "authentication": "password",
    "resource": "entry",
    "operation": "get",
    "contentType": "articles",
    "entryId": "123"
  }
}

List published articles, newest first, capped at 25:

{
  "type": "strapi",
  "parameters": {
    "authentication": "token",
    "resource": "entry",
    "operation": "getAll",
    "contentType": "articles",
    "returnAll": false,
    "limit": 25,
    "options": {
      "publicationState": "live",
      "sort": "createdAt:desc"
    }
  }
}

Page through every matching product, filtering with a JSON query:

{
  "type": "strapi",
  "parameters": {
    "authentication": "token",
    "resource": "entry",
    "operation": "getAll",
    "contentType": "products",
    "returnAll": true,
    "options": {
      "publicationState": "live",
      "sort": "price:asc,name:asc",
      "where": "{\"category\":\"electronics\"}"
    }
  }
}

Update the entry whose ID is on the incoming item under id:

{
  "type": "strapi",
  "parameters": {
    "authentication": "token",
    "resource": "entry",
    "operation": "update",
    "contentType": "articles",
    "updateKey": "id",
    "columns": "title,content"
  }
}

Delete an entry whose ID comes from an upstream node:

{
  "type": "strapi",
  "parameters": {
    "authentication": "password",
    "resource": "entry",
    "operation": "delete",
    "contentType": "articles",
    "entryId": "{{ $json.articleId }}"
  }
}

Push a batch of price changes, keeping the request rate modest:

{
  "type": "strapi",
  "parameters": {
    "authentication": "token",
    "resource": "entry",
    "operation": "update",
    "contentType": "products",
    "updateKey": "id",
    "columns": "price,inventory",
    "maxConcurrency": 5
  }
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

Create, read, update, and delete content entries in a self-hosted Strapi headless CMS. Use when you need to manage content in Strapi v3 or v4 instances.

Notes

  • The body comes from the item, not from the node. Create and Update build the request body out of the incoming item’s JSON, and Columns is the whitelist over those fields. Leave it empty and every field on the item is sent, which is rarely what you want when the item carries extra bookkeeping fields. On Strapi v4 the item is sent whole as the entry body regardless, so shape the item upstream — with an Edit Fields node — rather than relying on Columns to trim it.
  • Update needs the ID on the item. The entry ID is read from the item property named by Update Key (id by default), not from a parameter. If that property is missing or empty the item fails with a clear error, so map it upstream.
  • Where (JSON) must parse as JSON. A prose filter such as title contains 'news' is rejected before the request is sent. Write the filter as a JSON object — _where shape on v3, filters shape on v4.
  • Return All pages through everything. With Return All on, the node keeps requesting pages until the API stops returning entries, and Limit is ignored. On a large content type that is a lot of requests and a lot of items; prefer a Limit while you are building the workflow.
  • Content Type is the plural API name as Strapi exposes it in the URL (articles, not Article), and it accepts expressions, so one node can serve several types driven by upstream data.
  • Match the credential to the instance. The API version and base URL live on the credential, so pointing a workflow at a different Strapi instance is a credential swap, not a node edit.

Frequently asked questions

Where does the request body come from?

From the incoming item's JSON, not from node parameters. Create and Update build the body out of the item, and Columns acts as a whitelist over those fields.

What happens if I leave Columns empty?

Every field on the item is sent, which is rarely what you want when the item carries fields Strapi does not have. Set the whitelist deliberately.

Does it work with both Strapi versions?

Yes — v3 and v4 instances are both supported, which matters because their APIs differ.

Which credentials are available?

Username and password, or an API token — pick whichever your Strapi instance is configured for.

Build with the Strapi node

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Strapi (Username & Password) credentials first.

Open BusyBot

Last updated . Spotted something wrong? Tell us.