This workflow corresponds to n8n.io template #14471 — we link there as the canonical source.
This workflow follows the HTTP Request → Stopanderror recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Manage Strapi CMS Content Type Template",
"tags": [],
"nodes": [
{
"id": "77c01667-c619-46ba-b6d4-f9ac93eecd25",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
464,
496
],
"parameters": {
"path": "strapi-v5-content",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "de76dd1c-bf21-472e-9df1-c1e7207ea504",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2384,
496
],
"parameters": {
"options": {},
"respondWith": "allIncomingItems"
},
"typeVersion": 1.5
},
{
"id": "68a092d9-fe03-4f4a-ac6e-b0e209194ed7",
"name": "Create a new Insight",
"type": "n8n-nodes-base.httpRequest",
"position": [
1632,
288
],
"parameters": {
"url": "={{ $json.body.strapi_base_url }}/api/{{ $json.body.content_type_plural }}?status={{ $json.body.status }}",
"method": "POST",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"jsonBody": "={{ { data: $('Webhook').item.json.body.data } }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "strapiTokenApi"
},
"credentials": {
"strapiTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "59bbd187-cb1d-447d-8aa7-3beddd058bc9",
"name": "Update an insight",
"type": "n8n-nodes-base.httpRequest",
"position": [
1632,
496
],
"parameters": {
"url": "={{ $json.body.strapi_base_url }}/api/{{ $json.body.content_type_plural }}/{{ $json.body.documentId }}?status={{ $json.body.status }}",
"method": "PUT",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"jsonBody": "={{ { data: $('Webhook').item.json.body.data } }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "strapiTokenApi"
},
"credentials": {
"strapiTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "46ddf2d4-af73-4e3a-a5e8-c5139aba8d08",
"name": "Check if Error Occurred",
"type": "n8n-nodes-base.if",
"position": [
2800,
496
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": false,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "id-1",
"operator": {
"type": "object",
"operation": "notEmpty"
},
"leftValue": "={{ $json.error }}"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "02b865a1-a88e-4e7d-820f-09cbc56d4048",
"name": "Mark Execution as Failed",
"type": "n8n-nodes-base.stopAndError",
"position": [
3024,
496
],
"parameters": {
"errorMessage": "={{ $json.error.message || 'Strapi operation failed' }}"
},
"typeVersion": 1
},
{
"id": "90ff1540-92ce-44a1-a44b-d59c72ee882a",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-768,
-272
],
"parameters": {
"color": 6,
"width": 960,
"height": 3568,
"content": "# Create, update, and retrieve content entries in Strapi CMS v5\n\nManage your Strapi CMS v5 content entries directly from n8n via webhook or MCP \u2014 without touching the Strapi UI. Supports creating, updating, and retrieving entries for any content type.\n\n> **Note:** The official n8n Strapi node only supports Strapi v3 and v4. This workflow uses the Strapi REST API directly via HTTP Request nodes, making it fully compatible with **Strapi v5**.\n\n## Who's it for\n\n## Sharing (n8n.io templates and GitHub)\n\nUse the **same JSON file** for both channels. **n8n.io:** Submit through the template flow; importers get a copy and map the **Strapi API** credential after import. **GitHub:** Commit this `.json` (or link to **Raw**); users use **Import from File** or **Import from URL** in n8n. After any edit, re-import once in a clean n8n project to confirm the workflow loads and the webhook path is free on that instance.\n\nTeams and developers running Strapi CMS v5 who want to automate content operations \u2014 publishing blog posts, syncing CMS entries from other tools, or letting AI agents manage content via MCP \u2014 without waiting for the official Strapi node to catch up.\n\n## How it works\n\nA single webhook endpoint accepts a JSON payload with an `action_type` parameter that routes the request to one of three branches:\n\n- **`get_all`** \u2014 fetches entries for the specified content type, with optional status filtering and pagination\n- **`create`** \u2014 creates a new entry with the fields you provide\n- **`update`** \u2014 updates an existing entry by its Strapi `documentId`\n\nThe content type is passed dynamically via `content_type_plural`, so the same workflow works across all your Strapi content types without modification. The workflow also supports being called directly by an AI agent via n8n's MCP server.\n\n## How to set up\n\n1. Import the workflow into your n8n instance.\n2. Create a **Strapi API Token** in your Strapi admin panel (Settings \u2192 API Tokens).\n3. Add the token as a **Strapi Token API** credential in n8n and assign it to every **HTTP Request** node (Create, Update, Get all).\n4. **Secure the webhook (strongly recommended):** This template\u2019s **Webhook** node has **no authentication** by default so you can test immediately. Before production, open the Webhook node \u2192 **Authentication** \u2192 add **Header Auth** (or another method your team prefers). Create a credential with header name `X-API-Key` and a long random secret, attach it to the Webhook node, and send that header on every `POST`.\n5. **Activate** the workflow, then copy the **Production URL** from the Webhook node \u2014 that is the URL your clients must call.\n\nNo Strapi base URL is stored in the workflow. Pass `strapi_base_url` in each request body as documented below.\n\n## Requirements\n\n- n8n (self-hosted or cloud)\n- Strapi CMS v5 instance (cloud or self-hosted)\n- A Strapi API Token with appropriate read/write permissions (connected to the HTTP Request nodes)\n- **Recommended for production:** authentication on the Webhook node (e.g. **Header Auth** with `X-API-Key`) so only trusted callers can trigger Strapi operations\n\n## Calling the webhook\n\nSend a `POST` to the **Production webhook URL** from the Webhook node after activation. It usually looks like `https://<your-n8n-host>/webhook/<path>`. This template\u2019s default path is `strapi-v5-content` (so the URL ends with `/webhook/strapi-v5-content`). Change it in the Webhook node if that path is already used by another **active** workflow on the same n8n instance (for example, if you imported this template twice). The workflow JSON intentionally **omits** `webhookId` so n8n can register a new webhook for each import instead of reusing the author\u2019s instance id.\n\nIf you configured **Header Auth** on the Webhook node, include your secret on every request:\n\n```\nX-API-Key: your-long-random-secret\n```\n\n> **Security:** Without webhook authentication, anyone who can reach the URL can drive create/update/read operations using your Strapi credential inside n8n. Use authentication and HTTPS before exposing this to the internet. Because `strapi_base_url` comes from the request body, only allow trusted callers or consider fixing the base URL inside the workflow if you need stricter control.\n\n### Get all entries\n\n```json\n{\n \"action_type\": \"get_all\",\n \"strapi_base_url\": \"https://your-strapi-app.strapiapp.com\",\n \"content_type_plural\": \"articles\"\n}\n```\n\n**`action_type`** _(string, required)_ \u2014 must be `\"get_all\"`\n\n**`strapi_base_url`** _(string, required)_ \u2014 the base URL of your Strapi instance, without a trailing slash (e.g. `https://your-strapi-app.strapiapp.com`).\n\n**`content_type_plural`** _(string, required)_ \u2014 the plural API ID of your Strapi content type (e.g. `articles`, `products`). Found in Strapi under Content-Type Builder \u2192 your type \u2192 API ID.\n\n**`status`** _(string, optional)_ \u2014 filter entries by publish state. Pass `\"published\"` to return only live entries, or `\"draft\"` to return only unpublished entries. Omit to return all entries regardless of status.\n\n**`page_size`** _(number, optional)_ \u2014 number of entries to return per page. Uses Strapi's default pagination limit when omitted.\n\n**`page_number`** _(number, optional)_ \u2014 page to retrieve. Defaults to `1`. Use together with `page_size` to paginate through large result sets.\n\n**Examples:**\n\nFetch only draft entries:\n```json\n{\n \"action_type\": \"get_all\",\n \"strapi_base_url\": \"https://your-strapi-app.strapiapp.com\",\n \"content_type_plural\": \"articles\",\n \"status\": \"draft\"\n}\n```\n\nFetch published entries, paginated:\n```json\n{\n \"action_type\": \"get_all\",\n \"strapi_base_url\": \"https://your-strapi-app.strapiapp.com\",\n \"content_type_plural\": \"articles\",\n \"status\": \"published\",\n \"page_size\": 10,\n \"page_number\": 2\n}\n```\n\n### Create a new entry\n\n```json\n{\n \"action_type\": \"create\",\n \"strapi_base_url\": \"https://your-strapi-app.strapiapp.com\",\n \"content_type_plural\": \"articles\",\n \"data\": {\n \"title\": \"My new article\",\n \"body\": \"Content goes here\"\n }\n}\n```\n\n**`action_type`** _(string, required)_ \u2014 must be `\"create\"`\n\n**`strapi_base_url`** _(string, required)_ \u2014 the base URL of your Strapi instance, without a trailing slash.\n\n**`content_type_plural`** _(string, required)_ \u2014 the plural API ID of your Strapi content type.\n\n**`data`** _(object, required)_ \u2014 entry fields to write. Field names must match your Strapi content type schema.\n\n### Update an existing entry\n\n```json\n{\n \"action_type\": \"update\",\n \"strapi_base_url\": \"https://your-strapi-app.strapiapp.com\",\n \"content_type_plural\": \"articles\",\n \"documentId\": \"<strapi-document-id>\",\n \"data\": {\n \"title\": \"Updated title\"\n }\n}\n```\n\n**`action_type`** _(string, required)_ \u2014 must be `\"update\"`\n\n**`strapi_base_url`** _(string, required)_ \u2014 the base URL of your Strapi instance, without a trailing slash.\n\n**`content_type_plural`** _(string, required)_ \u2014 the plural API ID of your Strapi content type.\n\n**`documentId`** _(string, required)_ \u2014 the Strapi `documentId` of the entry to update. Returned by `get_all`.\n\n**`data`** _(object, required)_ \u2014 fields to update. Only include the fields you want to change.\n\n## Using with MCP (AI agents)\n\nTo call this workflow from an AI agent via n8n\u2019s MCP integration, turn on **Available in MCP** (or equivalent) in the workflow settings so the workflow is exposed to your MCP server. Agents then use the same `action_type`, `strapi_base_url`, and payload fields as the webhook examples \u2014 no separate webhook URL on the agent side. If you *also* use the public HTTP webhook, still apply **Header Auth** (or another gate) on the Webhook node as described above.\n\n## How to customize\n\n- **Point to a different Strapi instance:** Pass a different `strapi_base_url` per request \u2014 no workflow edits needed.\n- **Change the content type:** Pass a different `content_type_plural` value per request \u2014 no workflow edits needed.\n- **Filter by status:** Use `status: \"draft\"` or `status: \"published\"` in `get_all` to scope results \u2014 useful when AI agents need to find unpublished entries to review or update.\n- **Paginate large result sets:** Use `page_size` and `page_number` together to walk through content types with many entries.\n- **Add more actions:** Duplicate a branch in the Switch node and add a `delete` or `get_one` action following the same pattern.\n"
},
"typeVersion": 1
},
{
"id": "b2067421-1fbb-493c-a3d7-a636e29cc185",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
704,
368
],
"parameters": {
"color": 6,
"width": 384,
"height": 336,
"content": "## Determines which type of action (get, create or update) to take"
},
"typeVersion": 1
},
{
"id": "940fb6f8-ce35-487d-842b-e5bec0a0861b",
"name": "Action detection",
"type": "n8n-nodes-base.switch",
"position": [
848,
480
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7153d2e4-2013-4469-9906-afcc969c3c85",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.body.action_type }}",
"rightValue": "create"
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "104bd158-fc00-4a5e-81fa-fb28acc7fe34",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.body.action_type }}",
"rightValue": "update"
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "378997a0-7acc-47a3-b65d-46e61305eee0",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.body.action_type }}",
"rightValue": "get_all"
}
]
}
}
]
},
"options": {}
},
"typeVersion": 3.4
},
{
"id": "4a2ad70c-78a9-4885-93e9-93c5b70432cd",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1456,
192
],
"parameters": {
"color": 6,
"width": 432,
"height": 704,
"content": "## Creates a request to Strapi CMS API\n"
},
"typeVersion": 1
},
{
"id": "90c0692f-7c99-47f8-a313-ab33af746c4c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2240,
384
],
"parameters": {
"color": 6,
"width": 384,
"height": 336,
"content": "## Responds back to webhook with Strapi CMS API output"
},
"typeVersion": 1
},
{
"id": "b47f0afe-e60a-475e-b316-267dfac82093",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2688,
384
],
"parameters": {
"color": 6,
"width": 528,
"height": 336,
"content": "## Determines if Strapi CMS responded with error to label workflow's execution as failed"
},
"typeVersion": 1
},
{
"id": "bfda25fb-ca91-4767-bb0e-e57807121ca2",
"name": "Get all Insights",
"type": "n8n-nodes-base.httpRequest",
"position": [
1632,
704
],
"parameters": {
"url": "={{ $json.body.strapi_base_url }}/api/{{ $json.body.content_type_plural }}?status={{ $json.body.status }}&populate=*&pagination[pageSize]={{ $json.body.page_size }}&pagination[page]={{ $json.body.page_number }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "strapiTokenApi"
},
"credentials": {
"strapiTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"callerPolicy": "workflowsFromSameOwner",
"timeSavedMode": "fixed",
"availableInMCP": false,
"executionOrder": "v1",
"executionTimeout": -1
},
"connections": {
"Webhook": {
"main": [
[
{
"node": "Action detection",
"type": "main",
"index": 0
}
]
]
},
"Action detection": {
"main": [
[
{
"node": "Create a new Insight",
"type": "main",
"index": 0
}
],
[
{
"node": "Update an insight",
"type": "main",
"index": 0
}
],
[
{
"node": "Get all Insights",
"type": "main",
"index": 0
}
]
]
},
"Get all Insights": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Update an insight": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Respond to Webhook": {
"main": [
[
{
"node": "Check if Error Occurred",
"type": "main",
"index": 0
}
]
]
},
"Create a new Insight": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Check if Error Occurred": {
"main": [
[
{
"node": "Mark Execution as Failed",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
strapiTokenApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
An importable n8n workflow that creates, updates, and lists entries on Strapi v5 through a single webhook. It talks to Strapi’s REST API with HTTP Request nodes and a Strapi Token API credential, so it stays compatible with v5 even though n8n’s built-in Strapi node targets older…
Source: https://n8n.io/workflows/14471/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Automated Email Verification & Digital Health Card Generator
A robust n8n workflow template that automates the university admission process for colleges, universities, and educational programs. This workflow validates student emails, generates professional PDF
This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .
This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c