Integrating Ghost CMS with IndexNow: Fast-Track Your Content to Search Engines
Discover how to integrate Ghost CMS with IndexNow - a protocol that lets you instantly notify search engines about your new content. A 5-minute setup that can significantly speed up your content's path to search visibility.
Ever since I started diving deeper into Bing's ecosystem (which led me to the wonderful world of Microsoft Clarity - but that's another story), I've been increasingly impressed with Microsoft's webmaster tools. Recently, while reviewing my Bing Webmaster dashboard, I noticed an intriguing recommendation: "Learn how IndexNow protocol can increase your site's visibility in search engines with a simple 5-minute setup."
As someone who's always looking for ways to optimize my blog's visibility (especially for those tricky technical posts that help fellow admins), this caught my attention. Today, I'll show you how to integrate Ghost CMS with IndexNow - a protocol that lets you instantly notify search engines about your new content, and yes, it really does take just about 5 minutes to set up.

What is IndexNow and Why Should You Care?
Here's a familiar scenario: you've just published an awesome guide about fixing that obscure iDRAC error that's been haunting sysadmins since the dawn of time. You're excited to share this knowledge with the world, but then... you wait. And wait. Until search engines eventually discover your content.
IndexNow changes this by giving you a direct line to search engines. Instead of waiting for them to crawl your site, you actively tell them "Hey, I've got something new here!"
Initial Setup: Getting Your IndexNow API Key
Before we can integrate Ghost with IndexNow, we need to set up a few things:
- Go to Bing Webmaster Tools IndexNow page
- Generate an API key or use the provided one
- Create a text file with your key:
- Filename:
your-key.txt
(e.g.,52e43db7b7bf4f8e893b66493fe5ab9c.txt
) - Content: Just your key (e.g.,
52e43db7b7bf4f8e893b66493fe5ab9c
)
- Filename:
- Upload this file to your Ghost blog's root directory
Submitting Existing Content
Before setting up automation, you might want to submit your existing posts. Here's how to do it using curl:
curl -X POST "https://api.indexnow.org/IndexNow" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{
"host": "your-blog.com",
"key": "your-key",
"keyLocation": "https://your-blog.com/your-key.txt",
"urlList": [
"https://your-blog.com/post-1/",
"https://your-blog.com/post-2/"
]
}'

Integrating with Ghost
Now for the fun part - automating this process in Ghost. We'll create a local proxy server that will receive webhooks from Ghost and forward them to IndexNow:
1. First, create a simple Python script (e.g., `indexnow.py`):
from flask import Flask, request, jsonify
import requests
import logging
logging.basicConfig(
filename="indexnow.log",
level=logging.INFO,
format="%(asctime)s - %(message)s"
)
app = Flask(__name__)
INDEXNOW_API = "https://api.indexnow.org/IndexNow"
API_KEY = "your-api-key" # Replace with your key
HOSTNAME = "your-blog.com" # Replace with your domain
@app.route("/indexnow", methods=["POST"])
def indexnow():
try:
data = request.get_json()
post_url = data.get("post", {}).get("current", {}).get("url")
if not post_url:
logging.error(f"URL not found in webhook data")
return jsonify({"error": "URL not found"}), 400
payload = {
"host": HOSTNAME,
"key": API_KEY,
"keyLocation": f"https://{HOSTNAME}/{API_KEY}.txt",
"urlList": [post_url]
}
response = requests.post(
INDEXNOW_API,
json=payload,
headers={"Content-Type": "application/json; charset=utf-8"}
)
logging.info(f"IndexNow response: {response.status_code}")
return jsonify({"status": response.status_code})
except Exception as e:
logging.error(f"Error: {str(e)}")
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
2. Install the required Python packages:
pip install flask requests
3. Run the script:
python indexnow.py
- Set up the Ghost integration:
- Go to Ghost Admin → Settings → Integrations
- Create a new Custom Integration:
- Name: "IndexNow Integration"
- Description: "Automatic IndexNow submission for new posts"
- Add a webhook:
- Name: "IndexNow Notifier"
- Event: Select "Post published" (add another for "Post updated" if desired)
- Target URL: http://your-server:5000/indexnow (in my case it was on same machine I run Ghost so I just used local IP)
That's it! Now every time you publish a new post, Ghost will send a webhook to your local proxy server, which will forward the URL to IndexNow.
2025-02-15 11:28:18,445 - IndexNow response: 200 -
2025-02-15 11:28:18,446 - 10.2.78.44 - - [15/Feb/2025 11:28:18] "POST /indexnow HTTP/1.1" 200 -



Best Practices
- Keep Both Systems: Don't remove your sitemap - IndexNow complements it rather than replaces it
- Monitor Submissions: Check Bing Webmaster Tools to verify your URLs are being received
- Don't Overdo It: Submit only significant changes, not every minor update
- Check the Response Codes:
- 200: Success
- 400: Bad request
- 403: Invalid key
- 422: URLs don't match host
- 429: Too many requests
- Monitor Your Proxy Server:
- Keep an eye on the indexnow.log file for any errors
- Ensure your proxy server is running (consider setting up a systemd service)
- Make sure port 5000 is accessible from Ghost
Results and Verification
You can verify everything is working by:
- Publishing a new post
- Checking Bing Webmaster Tools → IndexNow section
- Looking for your URL in the "URLs submitted in last 24 hours" section

Final Thoughts
While Google is still testing IndexNow support, platforms like Bing and Yandex are already using it. It's one of those "set it and forget it" improvements that makes your site more search engine friendly with minimal effort.
Is it going to revolutionize your SEO overnight? Probably not. But it's like having SSD caching - it makes everything a bit faster and smoother, and once you set it up, you don't have to think about it again.
Got questions about integrating IndexNow with Ghost? Drop them in the comments! And yes, this post was automatically submitted through IndexNow - how meta is that?
Support This Blog — Because Heroes Deserve Recognition!
Whether it’s a one-time tip or a subscription, your support keeps this blog alive and kicking. Thank you for being awesome!
Tip Once