Ghost integration

Approved work lands in Ghost, without copy-paste.

Deliver posts to Ghost through the Admin API with drafts, native scheduling, and verified content writes.

How it works

SearchHandled connects to Ghost with an Admin API key, from which we mint short-lived JWTs to authenticate each request. Posts are created with title, slug, body, feature image, tags, and metadata. Ghost stores post bodies in Lexical format, and we write in the format Ghost actually persists, using the HTML source option only deliberately, then reading the post back to confirm the content stored matches what we sent.

Ghost supports draft, scheduled, and published states through the Admin API, and we map to them directly. Drafts appear in your Ghost admin for review, scheduled posts use Ghost's own scheduler, and published posts go live immediately. Feature images and inline images are uploaded through Ghost's image upload endpoint first, so every image reference in a delivered post points at your Ghost instance, not an external host.

Best forPublishers on Ghost, self-hosted or Ghost(Pro), who want clean editorial content arriving as normal drafts in their admin.

Setup, step by step

  1. In Ghost admin, go to Settings, then Integrations, and create a custom integration named SearchHandled.
  2. Copy the Admin API key and your site URL into the SearchHandled connection form.
  3. Run the connection check, which verifies JWT auth, write access, and image upload against your instance.
  4. Choose your default state (draft, scheduled, or published) and default tags.
  5. Send a test draft and open it in the Ghost editor to confirm formatting.

What lands in Ghost

ElementHow it lands
Title and bodyConverted to the native format, then verified by reading the entry back.
SEO metadataMapped to the platform's own fields, and flagged where it has none.
ImagesUploaded to your media storage with alt text. Never hotlinked.
Internal linksRewritten to your live URLs and checked against redirects.
Publish stateDraft, scheduled, and published.

Field mapping is confirmed against your own content model during setup. Connectors are on every plan; the number of connected sites is what varies.

Best practices

Create a dedicated integration, not a shared key

Ghost lets you create multiple custom integrations. Give SearchHandled its own so you can see its activity separately and revoke it independently of any other tool touching your site.

Keep your server clock accurate

Ghost Admin API tokens are short-lived JWTs, and self-hosted instances with clock drift will reject otherwise valid tokens. If you self-host, make sure NTP is running; it prevents a whole class of intermittent 401s.

Review drafts in the Ghost editor before going live

Because Ghost's Lexical format has its own rendering rules, check the first few deliveries in the actual editor. Once formatting is confirmed for your theme, scheduled or direct publishing is safe to enable.

Let images be re-hosted on Ghost

Ghost does not fetch external feature images for you. We download and re-upload every image through the images endpoint so posts never depend on a third-party host staying up.

Use it in the full SEO workflow

The connector is the last mile, not the strategy. Read the Ghost SEO automation workflow for the evidence gates, draft state, review rules, publish checks, and measurement loop that surround this integration.

Known issues

What practitioners actually report, from official docs, issue trackers, and community forums.

Silent content loss on HTML and mobiledoc writes

Since Ghost's migration to Lexical, some HTML or mobiledoc writes return 200 while the post body is silently left unchanged or empty, a failure mode reported repeatedly on the Ghost forum.

How we handle itWe write Lexical, or use source=html deliberately where appropriate, then read the post back and diff the stored content against what we sent. A delivery is only marked complete when the content actually persisted.

forum.ghost.org

Short-lived, single-use JWTs cause 401s

Admin API tokens expire in five minutes, so cached tokens or clock skew between systems produce intermittent 401 errors that look random.

How we handle itWe mint a fresh JWT per request, use skew-tolerant timestamps, and retry once on a 401 before surfacing an error.

docs.ghost.org

Image upload friction and unfetched external images

External feature image URLs are not fetched by Ghost, and image uploads fail without correctly formed multipart requests, leaving posts with missing images.

How we handle itWe download each image, re-upload it through Ghost's images/upload endpoint with correct multipart encoding, and reference the resulting Ghost URL in the post.

forum.ghost.org

Questions teams ask

Does this work with both Ghost(Pro) and self-hosted Ghost?

Yes, the Admin API is the same in both. Self-hosted instances have a couple of extra failure modes, mainly clock skew and reverse-proxy configuration, and our connection check tests for both.

How do you make sure the post content actually saved?

We read every post back after writing and compare the stored content to what we sent. This exists because Ghost's Lexical migration introduced cases where writes return success while content silently fails to persist, and we would rather catch that than trust a 200.

Can I edit delivered posts in the Ghost editor?

Yes. Posts are stored in Ghost's native Lexical format, so they open and edit like any post written in the editor. Nothing about the delivery locks the content.

Connect Ghost

One tested path from approval to publish.

Bring your content model to setup. We will map the destination and validate a draft before anything goes live.

Build my Growth Map