Ghost CMS Instagram Embed Not Working: Causes and Fixes (2026)
Quick answer: Ghost CMS Instagram embeds stopped working automatically after Meta restricted its oEmbed API in 2024–2025. The fix is to grab the official embed code from the Instagram post (three dots → Embed), then paste it into a Ghost HTML card. This renders the post correctly on published pages.

You paste an Instagram URL into the Ghost editor. Nothing. No embed card. Just a plain link sitting there looking useless. Or maybe you see the card appear in the editor — but it breaks on the published post, showing a blank box or an error.
This started happening for Ghost users in late 2024 and has gotten worse through 2025 and into 2026. It's not a bug in your setup. Meta changed how its oEmbed API works, and Ghost's automatic link-to-card conversion can no longer fetch Instagram content the same way it used to. The forum thread from March 2026 on this exact issue has no solution — because most people don't know the workaround yet.
Here's what's actually happening and how to fix it — plus cleaner long-term options if you embed Instagram regularly.
Why Did Ghost Instagram Embeds Stop Working Automatically?
Ghost uses the oEmbed protocol to convert pasted URLs into rich embed cards. You paste a YouTube link, Ghost fetches the oEmbed data, and out comes a video player. Same idea for Twitter, Vimeo, and others.
Instagram's oEmbed endpoint used to be publicly accessible. Meta started locking it behind app review and access tokens in 2020, but it remained functional for many Ghost users. Then in 2024–2025, Meta tightened restrictions further — requiring approved apps with valid tokens for every oEmbed request. Ghost's built-in oEmbed integration doesn't have per-site authentication with Meta, which means automatic Instagram card generation fails silently for most users.
This is the same reason Medium auto-embeds also broke around the same time. The pattern is identical: paste a URL, get nothing. If you're seeing this, your Ghost installation isn't broken — you're hitting an upstream platform restriction.
One workaround that still surfaces in the forum is using the /embed card type (the "Other" embed option in the editor). Some users report this works intermittently, but it's unreliable because it still depends on oEmbed data from Meta's API.
How Do I Embed an Instagram Post in Ghost Right Now?
The most reliable method is using Instagram's native embed code directly in a Ghost HTML card. This bypasses oEmbed entirely and loads the post straight from Instagram's servers.
- Open the Instagram post in a browser (desktop works best)
- Click the three-dot menu (⋯) in the top-right corner of the post
- Select Embed
- Copy the embed code (it starts with
<blockquote class="instagram-media") - In Ghost editor, type
/htmlor click the + button and choose HTML - Paste the embed code into the HTML card
The embed code looks like this:
<blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/p/YOUR_POST_ID/" data-instgrm-version="14" style="...">
<!-- Instagram post content -->
</blockquote>
<script async src="//www.instagram.com/embed.js"></script>One caveat: Ghost strips certain scripts from HTML cards by default for security. If the embed renders in the editor but shows blank on the live site, check whether your theme's default.hbs includes {{ghost_foot}} before </body>. Without that tag, external scripts may not load. This is a common cause of embeds that look fine in preview but fail on the published post — worth checking before you assume the embed itself is broken. If you're tweaking your theme, you'll find the Ghost themes overview useful for understanding how templates are structured.
Does the HTML Card Method Work in Ghost Emails?
No — and this is a genuine limitation you need to know about. Instagram embeds (and almost all JavaScript-based embeds) don't work in Ghost email newsletters. Email clients like Gmail, Outlook, and Apple Mail don't execute JavaScript, which is what Instagram's embed script requires to render the post.
When Ghost sends a post as an email, embedded HTML cards that rely on external scripts will either show a broken box or get stripped entirely. The full-width HTML embed guide covers this limitation for embeds generally.
For email, your options are:
- Screenshot the Instagram post and insert it as a regular image with a link to the original post
- Use Ghost's email-only content sections to show a static image in email and the embed on the web version
- Link to the post with a text callout like "See this post on Instagram →"
The screenshot approach is the most readable option for subscribers. Keep the image width under 600px for best email rendering. This also gives you a chance to add proper alt text, which helps with Ghost image SEO.
Why Does My Instagram Embed Show Correctly in the Editor But Break on the Live Site?
Three common causes:
1. Content Security Policy (CSP) blocking Instagram scripts. If you're using Cloudflare or a custom server configuration, your CSP headers may block external scripts from Instagram's domain. Check your browser's console for errors like Refused to load script 'https://www.instagram.com/embed.js'. The fix is to add instagram.com to your CSP's script-src directive. If you're running Ghost behind Cloudflare, the Cloudflare caching guide covers how to manage these header settings.
2. Caching serving stale content. Cloudflare or a server-side cache may be serving an older version of the post that doesn't include the updated HTML card. Purge the cache for that specific URL after editing.
3. Theme missing {{ghost_foot}}. As mentioned above — without this in your theme's base template, scripts from HTML cards won't load on published posts.
What's the Best Long-Term Solution for Instagram Embeds in Ghost?
If you embed Instagram content regularly, relying on the manual HTML card method gets tedious. Three more scalable approaches:
| Method | Reliability | Setup effort | Cost |
|---|---|---|---|
| Manual HTML card (copy embed code) | High | Per post | Free |
| Third-party Instagram feed widget (e.g. Elfsight, EmbedSocial) | High | One-time | Paid ($5–$20/mo) |
| Screenshot + linked image | Always works | Per post | Free |
Third-party widgets like Elfsight or EmbedSocial use their own Instagram API connections and maintain their app permissions independently. You embed a small script snippet from their service, and it handles the Instagram authentication. These work reliably even when Instagram changes its oEmbed rules. The downside is the monthly fee and a small additional script load on your pages — worth factoring in alongside your Ghost PageSpeed score.
For most Ghost bloggers who only occasionally embed Instagram posts, the manual HTML card approach is the right call. It's free, it works, and it takes under a minute per post.
Can I Add an Instagram Feed to My Ghost Site (Not Just Single Posts)?
Yes, but it requires either a third-party service or custom theme code — Ghost doesn't have a native Instagram feed integration out of the box.
The cleanest route for a feed widget is to use a service that provides a JavaScript snippet you can drop into your Ghost theme's default.hbs or into a specific page's HTML card. Common choices: EmbedSocial, Elfsight Instagram Feed, or SnapWidget.
For a code-based approach, you'd use Meta's Instagram Graph API directly — but this requires a Facebook Developer account, an approved app, and a valid long-lived access token. It's more work up front, but gives you full control. Your Ghost theme would then call a small backend or serverless function that proxies the API response and renders the feed. This is more appropriate if you're building something custom rather than just displaying a few recent posts.
Either way, the feed loads as an external embed — it won't be crawled as part of your page's HTML content by search engines, which is worth knowing for Ghost SEO purposes.
Does Ghost Have an Official Instagram Integration?
Ghost lists an Instagram integration on its integrations page, but it's essentially a description of the oEmbed approach — paste an Instagram URL, get an embed card. As of early 2026, this automatic conversion is unreliable for the reasons described above. Ghost hasn't announced a native fix or a replacement approach that works around Meta's API restrictions.
There's no official Zapier or webhook-based Instagram integration built into Ghost for automatically pulling Instagram posts into content. Ghost's integrations page focuses on the oEmbed embed rather than feed or content sync functionality.
Watch the Ghost forum thread on this issue for any updates from the Ghost team. If they ship a fix, it'll likely appear there first.
Related Ghost Guides
Other embedding and content-display topics worth reading:
- How to add a full-width HTML embed in Ghost — covers the HTML card in detail, including sizing and display options
- How to optimize images for SEO on Ghost — if you're using screenshots as embed replacements, this covers alt text and sizing best practices
- Improving Ghost PageSpeed Insights score — third-party embed scripts affect load time; here's how to offset that
Frequently Asked Questions
Why did Ghost stop auto-converting Instagram URLs to embed cards?
Meta restricted its oEmbed API in 2024–2025, requiring app-level authentication for all embed requests. Ghost's automatic URL-to-card conversion relies on the public oEmbed endpoint, which no longer works for Instagram without an approved access token. The fix is to use Instagram's native embed code in an HTML card instead.
How do I get the embed code from an Instagram post?
Open the post in a desktop browser, click the three-dot menu in the top-right corner, and select "Embed." Copy the entire code block that appears. This gives you a <blockquote> element with the Instagram script — paste it directly into a Ghost HTML card.
Do Ghost Instagram embeds show up in emails?
No. Instagram embeds require JavaScript to render, and email clients don't execute JavaScript. For newsletter versions of posts, use a static screenshot of the Instagram post linked back to the original, or use Ghost's email/web content toggle to show a static image in email and the embed on the web.
What is the Ghost oEmbed card and why doesn't it work for Instagram?
The Ghost oEmbed card (accessed via the embed card type or by pasting a URL) automatically fetches rich embed data from supported platforms using the oEmbed protocol. Instagram's oEmbed endpoint now requires authenticated API access, which Ghost doesn't provide per-site — so the automatic conversion fails silently or produces a broken card.
Can I add an Instagram feed widget to my Ghost blog?
Yes, using a third-party service like Elfsight, EmbedSocial, or SnapWidget. These services maintain their own Instagram API authentication and provide a JavaScript snippet you embed in your Ghost theme or page. Ghost doesn't have a native Instagram feed feature.
Why does my Instagram embed show in Ghost editor but not on the live site?
The most common cause is a Content Security Policy blocking the Instagram embed script, or a Cloudflare cache serving an older version of the page. Check your browser's developer console for script-blocked errors, then either update your CSP to allow instagram.com scripts or purge the page cache.
Does the Ghost x Instagram oEmbed integration still work?
Intermittently. Some users report it working, others find it broken on the same Ghost version. The inconsistency comes from Meta's API returning access errors depending on the request origin and rate limits. It's not reliable enough to depend on for production content — use the manual HTML embed code approach instead.
Are there alternatives to embedding Instagram posts directly in Ghost?
Yes: screenshot the post and use it as a regular Ghost image (with a link to the original), use a third-party widget service for a full feed, or link to the Instagram post with a text callout. All three are more reliable than the automatic oEmbed method for Ghost users as of 2026.
If you're on Ghost 5.x, the manual HTML card method gets you back to working Instagram embeds within minutes. Start there, and if you're embedding regularly, budget an afternoon to evaluate a third-party feed service — the time saved compounding across many posts is worth the small monthly cost.