Documentation Index
Fetch the complete documentation index at: https://docs.siftly.ai/llms.txt
Use this file to discover all available pages before exploring further.
Overview
This guide is for Ghost users who want to publish Siftly-generated GEO content and apply Siftly’s SEO/GEO field recommendations. After following it, you’ll be able to push optimized content to Ghost and understand where each meta field lives in the platform. Difficulty: ✅ Non-tech friendly — Ghost has built-in SEO fields, no plugins needed. Ghost is an open-source publishing platform built for professional blogs and newsletters. The Siftly–Ghost integration connects to your Ghost site via the Ghost Admin API and publishes content directly — either as a live post or a draft — using the unified 3-tier field mapping system. This integration is ideal for teams running Ghost-powered blogs who want to close the loop between SEO/GEO analysis and content execution inside a single workflow.Prerequisites
Before connecting, you’ll need:- A Ghost site (Ghost Pro or self-hosted Ghost 5.x+)
- Admin access to your Ghost dashboard
- A Custom Integration created in Ghost (see Step 1)
The Ghost Admin API is available on all Ghost plans, including Ghost Pro and self-hosted installations. There is no plan restriction.
Step 1: Create a Custom Integration in Ghost
Ghost uses Custom Integrations to generate API credentials for third-party tools like Siftly.- Log in to your Ghost Admin dashboard (e.g.,
https://yoursite.ghost.io/ghost) - Go to Settings (bottom-left gear icon)
- Click Integrations
- Scroll to the bottom and click Add custom integration
- Give it a name — e.g., Siftly
- Click Create
| Field | Where to find it | Example |
|---|---|---|
| Admin API key | Shown under the integration name | 69d9c7eeb369ab00013a5f2b:dde97d... |
| API URL | Shown below the Admin API key | https://yoursite.ghost.io |
id:hex_secret separated by a colon. Copy the entire string including both parts.
Step 2: Connect Ghost in Siftly
- In Siftly, go to Settings → Integrations
- Under CMS Integrations, click Ghost
- Enter your:
- API URL — the base URL of your Ghost site (e.g.,
https://yoursite.ghost.io) - Admin API key — the full
id:hex_secretstring copied from Ghost - Blog Base URL (optional) — the public-facing URL of your blog (e.g.,
https://mycompany.com/blog)
- API URL — the base URL of your Ghost site (e.g.,
- Click Connect Ghost
Blog Base URL (optional)
The Blog Base URL field lets you set the public-facing domain for your blog, separate from the Ghost Admin API URL. This is useful when:- Your Ghost instance is hosted at
yoursite.ghost.iobut your public blog lives atmycompany.com/blog - You want Siftly to track and display the correct canonical post URL after publishing
https://mycompany.com/blog and your post slug is intro-to-geo, the tracked URL will be https://mycompany.com/blog/intro-to-geo/.
If left blank, Siftly uses the post URL returned directly by the Ghost API.
How Ghost authentication works
Ghost’s Admin API does not accept plain API keys in HTTP headers. Instead, it requires a short-lived JWT token signed from your Admin API key on every request. Siftly handles this automatically:- When you publish, Siftly splits your Admin API key into its
idandhex_secretparts - It generates a JWT token signed with HS256 using
bytes.fromhex(hex_secret)as the signing key - The JWT carries a 5-minute expiry (
exp = iat + 300) and the audience claim"/admin/" - Each request uses a freshly generated token — no token caching or refresh needed
Field Mapping
Ghost uses the unified 3-tier field mapping system. Ghost’s built-in fields have fixed API names, so the required fields are pre-configured.Required Fields
| Siftly Field | Ghost Post Field | Notes |
|---|---|---|
| Title | title | Pre-configured — Ghost’s built-in title field |
| Slug | slug | Pre-configured — Ghost’s built-in slug field |
| Body | html | Pre-configured — sent via ?source=html |
Optional Fields
When mapped, these are auto-populated from your content data.| Siftly Field | Ghost Post Field | Notes |
|---|---|---|
| Meta Title | meta_title | SEO page title |
| Meta Description | custom_excerpt | Truncated to 300 characters |
| Keywords | tags | Up to 10 tags, created if they don’t exist |
| Categories | — | Not natively supported by Ghost |
| JSON-LD | — | Not natively supported by Ghost |
| Word Count | — | Not natively supported by Ghost |
Ghost has a fixed post schema — you map optional fields to the available Ghost post fields. Fields marked with ”—” are not supported by Ghost’s API and will be skipped.
HTML content handling
Siftly wraps the post body in Ghost’s HTML card comments before sending:Custom Fields
Add extra fields your Ghost posts require that aren’t part of Siftly’s standard content schema. Custom fields are sent as additional properties in the Ghost API payload.Field Types
| Type | Description | Example |
|---|---|---|
| String | Plain text | Author name, subtitle |
| Number | Numeric value | Priority, reading time |
| Boolean | True/false | Featured post, comments enabled |
| JSON | Structured object | SEO config, social media metadata |
| Select | Pick from predefined options | Category, status, content type |
Default Values
Set a default value when adding a custom field. This value pre-fills at publish time — you can override it for each post.Use Existing Field
Instead of setting a manual default, you can link a custom field to an existing content field. For example, map Ghost’sog_description field to use the same value as Meta Description.
This is useful when your Ghost setup has multiple fields that should contain the same data (e.g., custom_excerpt and og_description both using your meta description).
Publishing
Draft vs Published
When publishing, choose between:- Draft — content is pushed to Ghost as a draft post for review in Ghost Admin
- Published — the post is created and immediately published to your live site
Custom Fields at Publish Time
If you’ve defined custom fields, they appear in the publish dialog pre-filled with their default values (or auto-filled from linked fields). You can edit them before publishing. Standard fields (title, slug, body, meta data, keywords) are auto-populated from your content — no manual input needed.After publishing
Once published, the post appears on your Ghost site (immediately if you chose Published, or in Ghost Admin drafts if you chose Draft). From Siftly you can:- View the post — click the published URL link in the content editor
- Track performance — the post URL is saved to Siftly for citation and visibility analysis
Siftly does not support updating an existing Ghost post. Each publish creates a new post. To revise published content, edit it directly in Ghost Admin.
Where to apply Siftly’s recommendations on Ghost
Ghost has built-in SEO fields on every post — no plugins required. Here’s where each field lives and how Siftly’s recommendations map to them.Meta Title
Location: Post editor → click the gear icon (⚙️) → Meta data → Meta title Ghost renders this as the<title> tag and OG title. If left empty, Ghost uses the post title.
Siftly auto-pushes the meta title to Ghost’s meta_title field when you map it in your integration settings.
Meta Description
Location: Post editor → gear icon (⚙️) → Meta data → Meta description Ghost renders this as<meta name="description"> and og:description. If left empty, Ghost auto-generates an excerpt from the first 500 characters of your post.
Siftly maps this to custom_excerpt by default, which Ghost uses as both the visible excerpt and the meta description.
Open Graph Image / Social Share Image
Location: Post editor → gear icon (⚙️) → Twitter card and Facebook card sections Ghost supports separate OG images for Twitter and Facebook. Upload or paste an image URL in each section.Canonical URL
Location: Post editor → gear icon (⚙️) → Meta data → Canonical URL Ghost auto-generates a canonical URL pointing to the post’s own URL. Override this field only for syndicated or cross-posted content.Siftly does not push canonical URL overrides. Ghost’s default canonical (the post permalink) is correct for original content.
Tags & Categories
Location: Post editor → gear icon (⚙️) → Tags Ghost uses Tags for both categories and tags (there is no separate category system). The first tag is treated as the “primary tag” and often used by themes for navigation. Siftly pushes keywords as Ghost tags automatically. Tags that don’t exist are created. Up to 10 tags per post.JSON-LD Structured Data
Ghost auto-generates Article JSON-LD for every post. This includes:@type: Articleheadline,datePublished,dateModifiedauthorwith name and URLpublisherwith logoimagefrom the feature image
<script type="application/ld+json"> tag and pushes it directly to Ghost’s codeinjection_head field on publish. This renders in the <head> of the post page automatically.
No manual Code Injection editing is needed when the JSON-LD field mapping is configured.
If you prefer to add JSON-LD manually (or need to edit what Siftly pushed), go to: Post editor → gear icon (⚙️) → Code injection → Post Header. The
<script> tag will already be there from Siftly’s push.Keywords
Ghost does not render a<meta name="keywords"> tag. Keywords are handled through the Tags system, which Ghost exposes in its structured data and RSS feed.
Siftly maps content keywords to Ghost tags automatically.
Pushing Siftly recommendations automatically
Siftly pushes all SEO fields to Ghost in a single publish action when mapped:Generate content in Siftly
Use Siftly’s content editor to generate or optimize your article. Siftly produces meta title, meta description, keywords, and JSON-LD recommendations.
Click Publish → Ghost
In the content editor, click Publish and select Ghost. Choose Draft or Published status.
Platform-specific quirks & limitations
No categories system. Ghost uses Tags only. The first tag assigned to a post becomes the “primary tag,” which many Ghost themes use for navigation sections. Order your Siftly keywords with the most important one first.
- Code Injection scope: Siftly pushes JSON-LD to per-post
codeinjection_head. Ghost also offers site-wide Code Injection (Settings → Code Injection) — use that for Organization schema that applies to all pages. - No native Open Graph override via API: Ghost’s Admin API does not accept
og_imagedirectly on post creation. Feature images serve as OG images. Set your feature image after publishing from Siftly. - Excerpt length: Ghost truncates
custom_excerptat 300 characters. Siftly’s meta description is auto-trimmed to fit. - Members-only content: If you use Ghost’s membership features, posts published via Siftly default to “Public” visibility. Change visibility to “Members” or “Paid” in Ghost Admin after publishing if needed.
Validating the setup
After publishing your first post with Siftly’s recommendations:View the live page source
Open your published Ghost post in a browser. Right-click → View Page Source. Search for:
<title>— should contain your Siftly meta title (or post title if no meta title was set)<meta name="description"— should contain your meta description<script type="application/ld+json">— should show Ghost’s auto-generated Article schema plus any supplemental schema you added
Run Google Rich Results Test
Go to Google Rich Results Test and paste your post URL. Confirm Article schema is valid and any FAQ/HowTo schema is detected.
Run Schema.org Validator
Go to Schema.org Validator and paste your post URL. Check for errors or warnings.
Check social sharing
Use Facebook Sharing Debugger to confirm OG image, title, and description. Ghost generates these from your post’s feature image and meta data.
Difficulty & setup recap
Ghost Setup Summary
| Aspect | Rating |
|---|---|
| Initial setup | ✅ Easy — Admin API key, no OAuth flow |
| Applying SEO fields | ✅ Easy — Ghost has built-in meta title/description fields |
| JSON-LD | ✅ Auto-generated Article schema; ✅ Siftly pushes supplemental schema to codeinjection_head |
| Ongoing editing | ✅ Easy — publish from Siftly, edit in Ghost Admin |
| Developer needed? | No |
Related
CMS Integrations Overview
Compare all supported platforms and the unified field mapping system.
Quickstart Guide
Set up your brand and run your first GEO analysis.
Content Generation
How Siftly generates GEO-optimized content and recommendations.
Choosing a CMS for AI Visibility
Our guide to picking the right CMS for GEO optimization.
Disconnect Ghost
To remove the Ghost integration:- Go to Settings → Integrations → Ghost
- Click Disconnect
Troubleshooting
Connection fails with 401 Unauthorized
Connection fails with 401 Unauthorized
API URL is rejected
API URL is rejected
The API URL must use HTTPS and must be publicly reachable. Common mistakes:
- Using
http://instead ofhttps:// - Including a trailing slash (Siftly strips it, but double-check)
- Using an internal or localhost address (blocked for security)
Admin API key format error
Admin API key format error
The Admin API key must contain exactly one colon separating the key ID and the hex secret. Example format:
69d9c7eeb369ab00013a5f2b:dde97da248911d15686a4d10...Do not use the Content API key — that key is read-only and cannot create posts. Use the Admin API key only.Post publishes but slug conflicts
Post publishes but slug conflicts
If a post with the same slug already exists in Ghost, the publish will fail with a 422 error. Either delete the existing post in Ghost or adjust the slug in your Siftly content draft before republishing.
Post content looks different in Ghost
Post content looks different in Ghost
Siftly wraps content in Ghost HTML card comments (
<!--kg-card-begin: html-->) to preserve formatting. If you see raw HTML comments in the editor, Ghost may not have processed the source correctly — ensure your Ghost version is 5.x or later, which has full HTML card support.Tags are not appearing on the post
Tags are not appearing on the post
Security
Siftly takes the following measures to protect your Ghost credentials:- Encryption at rest — the Admin API key is encrypted using Fernet symmetric encryption before being stored in the database. The plaintext key is never persisted.
- SSRF protection — the Ghost API URL is validated on both connect and publish. Private IP ranges, localhost, and non-HTTPS URLs are blocked.
- Short-lived tokens — JWT tokens are generated fresh on every API call with a 5-minute expiry. No tokens are stored.
- Never returned to the client — the Admin API key is never included in any response sent to the browser.