Update Page

ghost.update_page
ActionBusiness appsconnection required

Calls the Ghost API with the connection's credentials.

Update an existing page. Only the fields you fill in are sent, so a body-only change leaves the title and metadata alone.

Connection

Required
Yes — the node will not save without one
Auth type
API key
Providers
Ghost
Secret shape
{"admin_api_key": "<id>:<secret>", "content_api_key": "…"}
Config it needs
admin_url, api_version
Resolved by
config.connection_id, else node.connection_id

Configuration

21 fields, 1 required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.

FieldTypeRequiredDefaultConstraintsExample
page_id
Ghost id of the page — the 24-character ObjectID from a previous step.
stringYes———
updated_at
The updated_at you read from the post, sent back so Ghost can refuse an edit that would overwrite a newer change. Leave it empty and the node re-reads the post first, which drops that protection.
stringNo—iso8601 format—
title
New title for the post. Left empty, the current title is kept.
stringNo———
html
Body of the post as HTML. Ghost converts it to Lexical, which is lossy, so keep the markup well formed. Use this or 'lexical', never both.
stringNo———
lexical
Body of the post as a Lexical JSON document, serialised to a string. This is Ghost's native format and round-trips losslessly.
stringNo———
status
Publication status. Leave it unset on a create and Ghost saves a draft that is not visible on the site; leave it unset on an update and the current status is kept. 'scheduled' also needs a future published_at.
stringNo—one of "draft", "published", "scheduled"—
visibility
Who may read the post: everyone, signed-in members, paying members, or the specific tiers named in extra_fields. Left unset, a new post is public and an existing one keeps the visibility it has.
stringNo—one of "public", "members", "paid", "tiers"—
published_at
Publication timestamp in ISO 8601 UTC (2026-09-09T10:00:00.000Z). A future value combined with status 'scheduled' is how Ghost schedules a post.
stringNo—iso8601 format—
featured
Whether to flag the post as featured on the site.
booleanNo———
slug
URL slug for the post. Ghost derives one from the title when this is empty.
stringNo———
custom_excerpt
Short summary shown in listings and social cards, replacing the excerpt Ghost generates from the body.
stringNo———
feature_image
URL of the image shown at the top of the post. Ghost does not fetch it; the URL must already be reachable.
stringNo—url format—
feature_image_alt
Alternative text describing the feature image, for screen readers.
stringNo———
feature_image_caption
Caption rendered under the feature image; accepts inline HTML.
stringNo———
canonical_url
Canonical URL to credit when the post is republished from somewhere else.
stringNo—url format—
meta_title
Title used in the page's meta tags, when it should differ from the post title.
stringNo———
meta_description
Description used in the page's meta tags and search results.
stringNo———
tags
Tags for the post, as a JSON array or a comma-separated list of names. Ghost creates a tag it cannot match, and this replaces the post's current tags.
arrayNo—array of string—
authors
Authors for the post, as a JSON array or a comma-separated list of staff email addresses. Ghost falls back to the site owner when none match.
arrayNo—array of string—
extra_fields
Any other writable Ghost field, as a JSON object merged into the request body — codeinjection_head, custom_template, og_title, tiers and the rest.
objectNo———
save_revision
Whether Ghost should store a new revision of the post alongside this edit.
booleanNo———

Output

One shape.

result

FieldTypeExample
id
Ghost id of the record, a 24-character ObjectID.
string—
uuid
Stable public uuid of the record.
string—
title
Title Ghost stored.
string—
slug
URL slug Ghost stored.
string—
status
Publication status: draft, published, scheduled or sent.
string—
visibility
Who may read it: public, members, paid or tiers.
string—
featured
Whether the record is flagged as featured.
boolean—
url
Public URL on the site; a draft gets its preview URL.
string—
excerpt
Custom excerpt when one is set, else one Ghost derived.
string—
feature_image
URL of the feature image, null when there is none.
string—
published_at
When it was, or will be, published (ISO 8601 UTC).
string—
created_at
When the record was created (ISO 8601 UTC).
string—
updated_at
When it last changed — pass this back on the next edit.
string—
html
Rendered HTML; present only when formats asked for it.
string—
lexical
Lexical source of the body, as a JSON string.
string—
tags
Tags on the record; present only with include=tags.
array—
authors
Authors of the record; present only with include=authors.
array—
{
  "authors": [],
  "created_at": "",
  "excerpt": "",
  "feature_image": "",
  "featured": false,
  "html": "",
  "id": "",
  "lexical": "",
  "published_at": "",
  "slug": "",
  "status": "",
  "tags": [],
  "title": "",
  "updated_at": "",
  "url": "",
  "uuid": "",
  "visibility": ""
}

Notes

  • PUT /ghost/api/admin/pages/{id}/.
  • Ghost requires updated_at on an edit: send the value you read from the post, or the node re-reads it first and the collision guard no longer applies.

See Update Page run in a workflow.

In a technical demo we add the Ghost connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.