Reference · Tools
Ghost integration
Manage posts on a Ghost CMS instance via the Content API (read-only) or Admin API (full CRUD).
The Ghost node connects to a Ghost CMS instance and lets you create, update, delete, and list posts through the Admin API, or pull published content through the read-only Content API. Use it to build workflows that auto-publish posts from an external source, sync content across systems, or schedule drafts based on external triggers.
- Works as
- Action
- Tool name
ghost- Operations
- 7 — Content API (`contentApi`): Get , Content API (`contentApi`): Get Many , Admin API (`adminApi`): Create , Admin API (`adminApi`): Delete , Admin API (`adminApi`): Get and 2 more
- Parameters
- 23
- Outputs
- Output, Error
- Credentials
- Ghost Admin API , Ghost Content API
- Official docs
- Ghost docs docs.ghost.org
What you can build with Ghost
- Get all published posts from Ghost blog.
- Create a new draft post on Ghost.
- Update an existing Ghost post with new content.
- Delete a Ghost post by ID.
- Fetch a post by slug from Ghost Content API.
Overview
The Ghost tool interacts with a Ghost CMS instance. It supports two API sources: the Content API (read-only, for fetching published posts) and the Admin API (full CRUD for creating, reading, updating, and deleting posts). The Content API uses a simple API key as a query parameter, while the Admin API uses JWT-based authentication generated from an admin API key in id:secret format. Supports pagination for listing posts, multiple content formats (HTML, MobileDoc, Lexical), and post metadata including SEO, Open Graph, and Twitter card fields.
Node Type
Action — processes input items and produces output
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Output, Error |
Credentials
This tool uses Ghost Admin API and Ghost Content API credentials. Configure the one that matches the Source you select — the Content API key for read-only operations, the Admin API key for everything else. See the Credentials Guide for setup instructions.
Resources
| Resource | Value |
|---|---|
| Post | post |
Operations
Which operations are available depends on Source, not on the resource — the Content API is read-only, the Admin API can also write. Pick the source first, then the operation.
| Source | Operation | Value | Description |
|---|---|---|---|
Content API (contentApi) | Get | get | Get a post |
Content API (contentApi) | Get Many | getAll | Get many posts |
Admin API (adminApi) | Create | create | Create a post |
Admin API (adminApi) | Delete | delete | Delete a post |
Admin API (adminApi) | Get | get | Get a post |
Admin API (adminApi) | Get Many | getAll | Get many posts |
Admin API (adminApi) | Update | update | Update a post |
Parameters
Post: Get
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| By | options | Yes | id | Get the post either by slug or ID. (shown when Source is contentApi, adminApi) |
Options: id, slug | ||||
| Identifier | string | Yes | — | The ID or slug of the post to get. (shown when Source is contentApi, adminApi) |
Options (options) | collection | No | {} | (shown when Source is adminApi) |
Options: html, authors | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["mobiledoc"] | |
Options: html, mobiledoc, lexical | ||||
Options (options) | collection | No | {} | (shown when Source is contentApi) |
Options: html, authors | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["html"] | |
Options: html, plaintext |
Post: Get Many
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Return All | boolean | No | false | Whether to return all results or only up to a given limit. (shown when Source is contentApi, adminApi) |
| Limit | number | No | 50 | Max number of results to return. (shown when Source is contentApi, adminApi and Return All is false) |
Options (options) | collection | No | {} | (shown when Source is contentApi) |
Options: html, authors | ||||
| — Include | multiOptions | No | [] | Tells the API to return additional data related to the resource. |
Options: authors, tags | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["html"] | Content format(s) to return. By default only html is returned. |
Options: html, plaintext, lexical | ||||
Options (options) | collection | No | {} | (shown when Source is adminApi) |
Options: html, authors | ||||
| — Include | multiOptions | No | [] | Tells the API to return additional data related to the resource. |
Options: authors, tags | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["mobiledoc"] | |
Options: html, mobiledoc, lexical |
Post: Create
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Title | string | Yes | — | Post’s title. (shown when Source is adminApi) |
| Content Format | options | No | html | The format of the post content. (shown when Source is adminApi) |
Options: html, mobileDoc, lexical | ||||
| Content | string | No | — | The HTML content of the post to create. (shown when Source is adminApi and Content Format is html) |
Content (JSON) (content) | json | No | — | Mobiledoc is the raw JSON format that Ghost uses to store post contents. (shown when Source is adminApi and Content Format is mobileDoc) |
Content (JSON) (content) | json | No | — | Lexical is the JSON format returned by the Ghost Default editor. (shown when Source is adminApi and Content Format is lexical) |
| Additional Fields | collection | No | {} | (shown when Source is adminApi) |
Options: draft | ||||
| — Authors | string | No | — | Comma-separated list of author IDs. Find author IDs via the Ghost Admin API /users endpoint. |
| — Canonical URL | string | No | — | |
| — Code Injection Foot | string | No | — | Code injection snippet for the footer. |
| — Code Injection Head | string | No | — | Code injection snippet for the header. |
| — Featured | boolean | No | false | |
| — Meta Description | string | No | — | |
| — Meta Title | string | No | — | |
| — Open Graph Description | string | No | — | |
| — Open Graph Image | string | No | — | URL of the image. |
| — Open Graph Title | string | No | — | |
| — Published At | dateTime | No | — | Required when status is “scheduled”. |
| — Slug | string | No | — | |
| — Status | options | No | draft | |
Options: draft, published, scheduled | ||||
| — Tags | string | No | — | Comma-separated list of tag names. Ghost will create tags if they do not exist. |
| — Twitter Description | string | No | — | |
| — Twitter Image | string | No | — | URL of the image. |
| — Twitter Title | string | No | — |
Post: Delete
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Post ID | string | Yes | — | The ID of the post to delete. (shown when Source is adminApi) |
Post: Get
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| By | options | Yes | id | Get the post either by slug or ID. (shown when Source is contentApi, adminApi) |
Options: id, slug | ||||
| Identifier | string | Yes | — | The ID or slug of the post to get. (shown when Source is contentApi, adminApi) |
Options (options) | collection | No | {} | (shown when Source is adminApi) |
Options: html, authors | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["mobiledoc"] | |
Options: html, mobiledoc, lexical | ||||
Options (options) | collection | No | {} | (shown when Source is contentApi) |
Options: html, authors | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["html"] | |
Options: html, plaintext |
Post: Get Many
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Return All | boolean | No | false | Whether to return all results or only up to a given limit. (shown when Source is contentApi, adminApi) |
| Limit | number | No | 50 | Max number of results to return. (shown when Source is contentApi, adminApi and Return All is false) |
Options (options) | collection | No | {} | (shown when Source is contentApi) |
Options: html, authors | ||||
| — Include | multiOptions | No | [] | Tells the API to return additional data related to the resource. |
Options: authors, tags | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["html"] | Content format(s) to return. By default only html is returned. |
Options: html, plaintext, lexical | ||||
Options (options) | collection | No | {} | (shown when Source is adminApi) |
Options: html, authors | ||||
| — Include | multiOptions | No | [] | Tells the API to return additional data related to the resource. |
Options: authors, tags | ||||
| — Fields | string | No | — | Limit the fields returned in the response object. E.g. fields=title,url. |
| — Formats | multiOptions | No | ["mobiledoc"] | |
Options: html, mobiledoc, lexical |
Post: Update
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Post ID | string | Yes | — | The ID of the post to update. (shown when Source is adminApi) |
| Content Format | options | No | html | The format of the post content. (shown when Source is adminApi) |
Options: html, mobileDoc, lexical | ||||
| Update Fields | collection | No | {} | (shown when Source is adminApi) |
Options: draft | ||||
| — Authors | string | No | — | Comma-separated list of author IDs. Find author IDs via the Ghost Admin API /users endpoint. |
| — Canonical URL | string | No | — | |
| — Code Injection Foot | string | No | — | |
| — Code Injection Head | string | No | — | |
| — Content | string | No | — | HTML content of the post. (shown when /contentFormat is html) |
— Content (JSON) (contentJson) | json | No | — | Mobiledoc JSON content of the post. (shown when /contentFormat is mobileDoc) |
— Content (JSON) (contentJson) | json | No | — | Lexical JSON content of the post. (shown when /contentFormat is lexical) |
| — Featured | boolean | No | false | |
| — Meta Description | string | No | — | |
| — Meta Title | string | No | — | |
| — Open Graph Description | string | No | — | |
| — Open Graph Image | string | No | — | URL of the image. |
| — Open Graph Title | string | No | — | |
| — Published At | dateTime | No | — | Required when status is “scheduled”. |
| — Slug | string | No | — | |
| — Status | options | No | draft | |
Options: draft, published, scheduled | ||||
| — Tags | string | No | — | Comma-separated list of tag names. Ghost will create tags if they do not exist. |
| — Title | string | No | — | Post’s title. |
| — Twitter Description | string | No | — | |
| — Twitter Image | string | No | — | URL of the image. |
| — Twitter Title | string | No | — |
All Operations
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Source | options | No | contentApi | Pick where your data comes from: Content API (read-only) or Admin API (full CRUD). |
Options: adminApi, contentApi | ||||
| Max Concurrency | number | No | 10 | Maximum number of items to process concurrently. |
Output Data
The post returned by Ghost is merged onto the input item’s JSON at the top level — the fields the item already carried survive, and a post field with the same name overwrites the item’s value. Downstream nodes address the post directly ({{ $json.id }}, {{ $json.title }}). Binary data on the input item is forwarded unchanged.
| Operation | Output |
|---|---|
| Get Many (either source) | One output item per post returned. Return All keeps paging until Ghost runs out of posts, so this can be a large fan-out from a single input item. |
| Get, Create, Update (either source) | One output item carrying the post. |
| Delete | One output item carrying id and deleted: true — Ghost returns no body for a delete. |
When a request comes back with no posts, the input item is still passed through unchanged, so an empty result is an item with no post fields on it rather than a missing item. Check for id before treating the branch as a hit.
Example Configuration
Create an HTML post as a draft:
{
"type": "ghost",
"parameters": {
"source": "adminApi",
"resource": "post",
"operation": "create",
"title": "{{ $json.title }}",
"contentFormat": "html",
"content": "<h1>{{ $json.title }}</h1><p>{{ $json.body }}</p>",
"additionalFields": {
"slug": "my-new-blog-post",
"status": "draft",
"meta_description": "A great blog post about something interesting",
"featured": false,
"tags": "technology,blog"
}
}
}
Create a post from Mobiledoc JSON, scheduled for a fixed time:
{
"type": "ghost",
"parameters": {
"source": "adminApi",
"resource": "post",
"operation": "create",
"title": "Mobile Doc Post",
"contentFormat": "mobileDoc",
"content": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"This is a mobile doc post.\"]]]]}",
"additionalFields": {
"slug": "mobile-doc-post",
"status": "scheduled",
"published_at": "2026-01-01T12:00:00Z"
}
}
}
Read one published post by ID through the Content API:
{
"type": "ghost",
"parameters": {
"source": "contentApi",
"resource": "post",
"operation": "get",
"by": "id",
"identifier": "{{ $json.postId }}",
"options": {
"fields": "id,title,slug,html,published_at",
"formats": ["html"]
}
}
}
Read a post by slug:
{
"type": "ghost",
"parameters": {
"source": "contentApi",
"resource": "post",
"operation": "get",
"by": "slug",
"identifier": "my-new-blog-post",
"options": {
"formats": ["html", "plaintext"]
}
}
}
List the ten most recent posts with their tags and authors:
{
"type": "ghost",
"parameters": {
"source": "adminApi",
"resource": "post",
"operation": "getAll",
"returnAll": false,
"limit": 10,
"options": {
"include": ["tags", "authors"],
"fields": "id,title,slug,status,published_at",
"formats": ["html", "mobiledoc"]
}
}
}
Publish an existing draft:
{
"type": "ghost",
"parameters": {
"source": "adminApi",
"resource": "post",
"operation": "update",
"postId": "{{ $json.id }}",
"contentFormat": "html",
"updateFields": {
"title": "Updated Post Title",
"content": "<h1>Updated Content</h1><p>This post has been updated.</p>",
"status": "published",
"meta_title": "Updated Meta Title",
"featured": true
}
}
}
Delete a post:
{
"type": "ghost",
"parameters": {
"source": "adminApi",
"resource": "post",
"operation": "delete",
"postId": "{{ $json.id }}"
}
}
Error Handling
| Mode | Behavior |
|---|---|
| stop | Halts workflow on first error |
| continue | Skips failed items, passes successful ones through |
| errorPort | Routes failed items to Error output port |
Tips
This tool manages posts on a Ghost CMS instance. It is ideal for fetching published posts or for creating, updating, and deleting posts when full control is needed. The tool produces post data, confirmation of post creation or updates, or success messages for deletions.
- Source picks the credential too. Content API operations authenticate with the Content API key, Admin API operations with the Admin API key, so the credential you have configured has to match the source you selected.
- Update replaces the content field it is told to. Content Format decides which of the content fields inside Update Fields is sent, and on HTML the field is always sent — leaving it empty on an HTML update blanks the post body. Set Content Format to match the editor format the post already uses.
- Updates are collision-safe. Before writing, the node reads the post’s current timestamp and sends it back with the change, so a post edited elsewhere in the meantime is rejected rather than silently overwritten.
- Scheduling needs a date. Setting Status to
scheduledwithout Published At fails the item. - Tags are created on demand. Tag names that do not exist yet are created by Ghost; author values must be existing author IDs.
Frequently asked questions
Do I need one credential or two — and which one should I set up?
It depends on what you need to do. The Content API credential (a simple API key) only supports reading published posts. The Admin API credential (an id:secret key pair used to generate a JWT) supports full create, read, update, and delete operations. Set up only the credential that matches the operations you intend to run — the node will reject the operation if the credential type doesn't match the selected source.
I'm updating a post's body but the content keeps getting wiped — what's happening?
The Content Format setting controls which content field is written during an update. If you choose HTML, the HTML field is always sent — even if you leave it blank — which will blank the post body. Make sure Content Format matches the format the post was originally written in (HTML, MobileDoc, or Lexical), and always provide the content value explicitly rather than leaving it empty.
Can two workflows update the same post at the same time without corrupting it?
The node is collision-safe. Before writing an update, it reads the post's current timestamp and sends it back with the change. If another process has edited the post in the meantime and changed that timestamp, Ghost will reject the update rather than silently overwrite the newer version. You'll receive an error on the Error output that you can handle in your workflow.
How do I schedule a post to publish at a future time?
Set Status to 'scheduled' and provide a value for the Published At field. Omitting Published At when using the scheduled status will cause the operation to fail. Make sure the datetime you supply is in the future relative to your Ghost instance's timezone.
Can I assign new tags to a post, or do they have to exist in Ghost already?
Tags are created on demand — if you supply a tag name that doesn't exist yet in Ghost, Ghost will create it automatically when the post is saved. Authors work differently: you must supply an existing author ID. Passing an unrecognized author value will not create a new author and will result in an error.
Build with Ghost
Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Ghost Admin API credentials first.
Open BusyBotLast reviewed . Spotted something wrong? Tell us.