What is IndexNow?
IndexNow is a protocol created by Microsoft Bing (and adopted by Yandex, Naver, and others) that allows website owners to instantly notify search engines when content is published or updated.
Without IndexNow:
- Bing discovers your new posts by crawling randomly
- This can take days or even weeks
- Your content is invisible to searchers during that time
With IndexNow:
- New posts are submitted to Bing within minutes
- Search engines know to crawl immediately
- Your content appears in search results much faster
The Problem for Blogger Users
Blogger (blogspot) does not allow you to upload files to your domain root. IndexNow requires a verification key file to be hosted at your domain root. This dashboard solves that problem by hosting the key file locally on your computer and exposing it via a free tunnel service.
What This Dashboard Does
This dashboard is a complete automation system that runs on your local computer. Here is what it does automatically:
A. Monitors Your Blogger RSS Feed
- Checks your Blogger RSS feed every 15 minutes
- Detects when you publish a new blog post
- Extracts the URL of the new post
B. Submits to IndexNow Automatically
- Sends the new post URL to Bing via the IndexNow API
- Bing receives the notification and crawls your page
- Your post appears in search results within hours instead of days
C. Monitors Crawl Status
- Every 6 hours, checks which URLs have been successfully crawled by Bing
- Separates crawled URLs from uncrawled URLs
- Shows you the status in a beautiful web dashboard
D. Auto-Resubmits Uncrawled URLs
- If a URL has not been crawled after 24 hours, it is automatically resubmitted to IndexNow
- This ensures no post gets missed
- Tracks how many times each URL has been resubmitted
E. Web Dashboard
- Dark-themed, responsive web interface
- Shows statistics: total submitted, crawled, not crawled, resubmissions
- Lists all URLs with their status
- Shows real-time activity logs
- Manual controls: check RSS now, check crawl status, resubmit specific URLs
Requirements
Before you start, make sure you have:
- A Blogger website (custom domain or blogspot subdomain)
- A Windows computer that stays on (or runs when you publish)
- Python 3.8 or higher installed
- Internet connection
- A free ngrok account (or Cloudflare account for tunnel)
Optional but recommended:
- A custom domain for your Blogger site (blogspot works too)
- Your computer connected to the internet most of the time
Step 1: Get Your IndexNow API Key
The IndexNow API key is a random string that proves you own the website. You can generate it yourself. It must be exactly 32 characters.
How to Generate Key
- Go to https://www.bing.com/indexnow/getstarted
- Copy the generated string (example: a1b2c3d4e5f6789012345678abcdef90)
Important
The key file name must be exactly your key with .txt extension. Example: If your key is a1b2c3d4e5f6789012345678abcdef90, then the file name must be: a1b2c3d4e5f6789012345678abcdef90.txt
Save this key somewhere safe. You will need it in the next steps.
Step 2: Install Python
If you already have Python 3.8+, skip to Step 3.
- Go to python.org/downloads
- Download the latest Python 3.x for Windows
- Run the installer
- VERY IMPORTANT: Check the box "Add Python to PATH" at the bottom
- Click "Install Now"
- Wait for installation to complete
- Open Command Prompt and verify: python --version
You should see something like:
Python 3.12.0
If You Get an Error
Python is not in your PATH. Reinstall and check "Add Python to PATH".
Step 3: Download and Extract the Dashboard
- Download the Bing IndexNow Dashboard ZIP file
- Extract it to a folder on your computer.
Example path used in this guide:
C:\Users\yourname\Downloads\Bing
After extraction, your folder structure should look like this:
Bing/
|-- app.py (Main application)
|-- key_server.py (Key file server)
|-- a1b2c3d4e5f6789012345678abcdef90.txt (Your key file)
|-- requirements.txt (Python packages)
|-- setup.bat (First-time setup)
|-- start.bat (Launch script)
|-- README.md (Instructions)
|-- data/ (Auto-created)
|-- templates/
|-- dashboard.html (Web interface)
Replace the Key File with YOUR Key
- Delete the existing .txt file (it contains a dummy key)
- Create a new text file named exactly: YOUR_KEY.txt
- Open it in Notepad and paste ONLY your 32-character key
- Save and close
Example
File name: a1b2c3d4e5f6789012345678abcdef90.txt
File contents (only this, nothing else):
a1b2c3d4e5f6789012345678abcdef90
Step 4: Configure Your Settings
Open app.py in Notepad (right-click -> Edit with Notepad).
Find the CONFIG section near the top (around line 20-35):
CONFIG = {
"RSS_FEED": "https://www.yourblog.com/feeds/posts/default?alt=rss",
"DOMAIN": "www.yourblog.com",
"API_KEY": "a1b2c3d4e5f6789012345678abcdef90",
"KEY_LOCATION": "https://your-tunnel-url.ngrok.io/a1b2c3d4e5f6789012345678abcdef90.txt",
"INDEXNOW_URL": "https://api.indexnow.org/indexnow",
"CHECK_INTERVAL": 15,
"MAX_POST_AGE_HOURS": 24,
"RETRY_AFTER_HOURS": 24,
"CRAWL_CHECK_INTERVAL": 6,
"DATA_DIR": os.path.join(os.path.dirname(os.path.abspath(__file__)), "data"),
}
A. RSS_FEED
Replace with your actual Blogger RSS feed URL.
If you have a custom domain:
https://www.yourblog.com/feeds/posts/default?alt=rss
If you use blogspot subdomain:
https://yourblog.blogspot.com/feeds/posts/default?alt=rss
Example:
"RSS_FEED": "https://www.demoblog.com/feeds/posts/default?alt=rss",
B. DOMAIN
Replace with your domain (without https://).
If custom domain:
www.yourblog.com
If blogspot:
yourblog.blogspot.com
Example:
"DOMAIN": "www.demoblog.com",
C. API_KEY
Replace with your 32-character key.
Example:
"API_KEY": "a1b2c3d4e5f6789012345678abcdef90",
D. KEY_LOCATION
Leave for now, we will set this in Step 5. This will be your ngrok or Cloudflare tunnel URL + your key file name.
Example (we will update this in the next step):
"KEY_LOCATION": "https://abc123def.ngrok.io/a1b2c3d4e5f6789012345678abcdef90.txt",
Save and close app.py.
Step 5: Expose Your Key File to the Internet
This is the Most Important Step
Bing needs to verify your key file by accessing it from the internet. Since Blogger does not allow file uploads, we will use a free tunnel service.
Option A: ngrok (Easiest, Free)
- Go to ngrok.com and sign up for a free account
- Download ngrok for Windows
- Extract ngrok.exe to a folder (example: C:\ngrok)
- Open Command Prompt and authenticate:
cd C:\ngrok ngrok config add-authtoken YOUR_AUTH_TOKEN_HERE
(Your auth token is shown on your ngrok dashboard after login)
Start the tunnel to your local key server (port 8765):
ngrok http 8765
You will see output like this:
Session Status online
Account YourName (Plan: Free)
Version 3.x.x
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding https://abc123def.ngrok.io -> http://localhost:8765
Copy the HTTPS URL (in this example: https://abc123def.ngrok.io)
Open app.py again and update KEY_LOCATION:
"KEY_LOCATION": "https://abc123def.ngrok.io/a1b2c3d4e5f6789012345678abcdef90.txt",
Important
Replace abc123def with YOUR actual ngrok URL, and replace a1b2c3d4... with YOUR actual key.
Save and close app.py.
Keep the ngrok window open! If you close it, the URL changes and Bing cannot verify your key.
Option B: Cloudflare Tunnel (More Stable, Free)
If you want a permanent URL that does not change, use Cloudflare Tunnel.
Install cloudflared:
Download from: Cloudflare Downloads
Or use winget: winget install --id Cloudflare.cloudflared
Open Command Prompt and login:
cloudflared tunnel login
This opens a browser. Select your domain and authorize.
Create a tunnel:
cloudflared tunnel create bing-indexer
This outputs a tunnel ID. Save it.
Create a configuration file at:
C:\Users\YourName\.cloudflared\config.yml
With this content:
tunnel: YOUR_TUNNEL_ID
credentials-file: C:\Users\YourName\.cloudflared\YOUR_TUNNEL_ID.json
ingress:
- hostname: bing-key.yourdomain.com
service: http://localhost:8765
- service: http_status:404
Add a DNS record in Cloudflare:
- Type: CNAME
- Name: bing-key
- Target: YOUR_TUNNEL_ID.cfargotunnel.com
- Proxy status: Enabled (orange cloud)
Run the tunnel:
cloudflared tunnel run bing-indexer
Your key file is now accessible at:
https://bing-key.yourdomain.com/a1b2c3d4e5f6789012345678abcdef90.txt
Update KEY_LOCATION in app.py:
"KEY_LOCATION": "https://bing-key.yourdomain.com/a1b2c3d4e5f6789012345678abcdef90.txt",
Step 6: Run the Dashboard
You Need to Run TWO Things Simultaneously
Terminal 1: Key Server
This serves your key file so Bing can verify it.
- Open Command Prompt
- Navigate to your Bing folder:
cd C:\Users\demo\OneDrive\Documents\Bing
Run the key server:
python key_server.py
You should see:
Key server running on http://localhost:8765
Keep this window open! Press Ctrl+C to stop.
Leave This Window Open
Do not close it.
Terminal 2: ngrok Tunnel (if using ngrok)
- Open a SECOND Command Prompt
- Navigate to your ngrok folder:
cd C:\ngrok
Run:
ngrok http 8765
Copy the HTTPS URL and update app.py KEY_LOCATION (if not done already)
Leave this window open too.
Terminal 3: Dashboard
- Open a THIRD Command Prompt
- Navigate to your Bing folder:
cd C:\Users\demo\OneDrive\Documents\Bing
Install requirements (first time only):
pip install -r requirements.txt
Run the dashboard:
python app.py
You should see:
[2026-07-13 10:00:00] [INFO] Data loaded successfully [2026-07-13 10:00:00] [INFO] Starting scheduled check... [2026-07-13 10:00:01] [INFO] Found 5 posts in feed [2026-07-13 10:00:01] [INFO] New post found: My Latest Blog Post [2026-07-13 10:00:02] [INFO] Submitting 1 URL(s) to IndexNow... [2026-07-13 10:00:03] [INFO] Submitted 1 URL(s) - Status 202 (pending) [2026-07-13 10:00:03] [INFO] Scheduled check complete [2026-07-13 10:00:03] [INFO] Dashboard available at http://localhost:5000
Open your web browser and go to: http://localhost:5000
You Should See the Dashboard!
Understanding the Dashboard Interface
When you open http://localhost:5000, you see:
Stats Cards (Top Row)
- Total Submitted: How many URLs have been submitted to IndexNow
- Crawled: How many have been successfully crawled by Bing
- Not Crawled: How many are still pending or failed
- Resubmissions: How many times uncrawled URLs were auto-resubmitted
Tabs
All URLs
Complete list of every submitted URL with:
- URL (clickable link)
- Post title
- Submission date/time
- Status badge (Crawled / Pending / Error)
- Number of times resubmitted
Crawled
Only URLs that Bing has successfully crawled.
Not Crawled
URLs that are pending or failed, with:
- Last checked time
- Status reason
- A "Resubmit" button to manually resubmit
Logs
Real-time activity log showing:
- Timestamp
- Log level (INFO, SUCCESS, WARNING, ERROR)
- Message describing what happened
Action Buttons
- Check RSS Now: Manually trigger an RSS feed check
- Check Crawl Status: Manually check which URLs are crawled
- Resubmit Uncrawled: Manually resubmit all uncrawled URLs
- Refresh Data: Refresh the dashboard data from the server
How Auto-Resubmission Works
The dashboard has three automatic background tasks:
Task 1: Check RSS Feed (Every 15 Minutes)
- Fetches your Blogger RSS feed
- Compares with already submitted URLs
- Finds new posts published in the last 24 hours
- Submits them to IndexNow
- Saves the URL to the tracking file
Task 2: Check Crawl Status (Every 6 Hours)
- Goes through all submitted URLs
- Checks if each URL is accessible (HTTP 200)
- Updates crawl status in the tracking file
- Separates crawled from uncrawled URLs
Task 3: Auto-Resubmit Uncrawled URLs (Every 24 Hours)
- Finds URLs that have not been crawled
- Checks if 24 hours have passed since last submission
- Resubmits them to IndexNow
- Increments the resubmit counter
- Updates the last resubmitted timestamp
This Ensures No Post Gets Missed
Even if Bing misses a URL the first time, it gets another chance automatically.
Troubleshooting Common Issues
Issue: "Status: 403 - Key verification failed"
Cause: Bing cannot access your key file from the internet.
Solutions:
- Make sure key_server.py is running (Terminal 1)
- Make sure ngrok/cloudflared is running (Terminal 2)
- Open your KEY_LOCATION URL in a browser. It should show ONLY your key.
- Example: https://abc123def.ngrok.io/a1b2c3d4e5f6789012345678abcdef90.txt
- If ngrok URL changed, update KEY_LOCATION in app.py and restart
- Check that your key file name matches your API_KEY exactly
Issue: "No new posts found"
Cause: RSS feed is empty or incorrect.
Solutions:
- Open your RSS feed URL in a browser. You should see XML with posts.
- Check that RSS_FEED in app.py matches your actual feed URL
- Make sure your Blogger feed is public (Settings -> Site feed -> Allow)
- Try the full feed URL: https://yourblog.blogspot.com/feeds/posts/default?alt=rss
Issue: "Python is not recognized"
Cause: Python is not in your system PATH.
Solutions:
- Reinstall Python and check "Add Python to PATH"
- Or use the full path: C:\Users\YourName\AppData\Local\Programs\Python\Python312\python.exe
Issue: "Port 5000 is already in use"
Cause: Another program is using port 5000.
Solutions:
- Change the port in app.py: app.run(host="0.0.0.0", port=5001, debug=False)
- Then access: http://localhost:5001
Issue: "ngrok URL changes every time"
Cause: Free ngrok URLs are temporary.
Solutions:
- Use Cloudflare Tunnel for a permanent URL (see Option B in Step 5)
- Or upgrade to ngrok paid plan for a reserved domain
- Or update KEY_LOCATION each time you restart ngrok
Issue: Dashboard shows "Never" for all dates
Cause: Timezone issue or no data yet.
Solutions:
- This is normal on first run. Publish a new post and wait 15 minutes.
- Check that your computer time is correct.
Complete Code Reference
Below are all the code files included in the dashboard package.
File: app.py (Main Application)
This is the heart of the dashboard. It contains:
- Flask web server
- RSS feed parser
- IndexNow API client
- Crawl status checker
- Auto-resubmission scheduler
- REST API endpoints for the dashboard
Key functions:
- get_latest_posts(): Fetches and parses your Blogger RSS feed
- submit_to_indexnow(urls): Sends URLs to Bing IndexNow API
- check_crawl_status(url): Checks if Bing has crawled a URL
- auto_resubmit_uncrawled(): Resubmits uncrawled URLs after 24h
- check_and_submit(): Main scheduled task that runs every 15 minutes
The scheduler uses the "schedule" library to run tasks at intervals:
- Every 15 minutes: check_and_submit()
- Every 6 hours: check_all_crawl_statuses()
- Every 24 hours: auto_resubmit_uncrawled()
API Endpoints:
| Endpoint | Method | Description |
|---|---|---|
| / | GET | Dashboard HTML page |
| /api/stats | GET | Statistics for the dashboard cards |
| /api/submitted | GET | All submitted URLs with metadata |
| /api/crawled | GET | Only crawled URLs |
| /api/uncrawled | GET | Only uncrawled URLs |
| /api/logs | GET | Recent activity logs |
| /api/submit | POST | Manual URL submission |
| /api/resubmit | POST | Resubmit uncrawled URLs |
| /api/check-crawl | POST | Trigger crawl status check |
| /api/settings | GET/POST | View or update configuration |
File: key_server.py (Key File Server)
A minimal HTTP server that serves your IndexNow key file.
- Runs on port 8765
- Serves the key file at: /YOUR_KEY.txt
- Required for Bing to verify your domain ownership
- Must stay running continuously
How it works:
- Bing receives your IndexNow submission
- Bing tries to fetch: https://yourdomain.com/YOUR_KEY.txt
- Since you cannot host on Blogger, ngrok forwards this to localhost:8765
- key_server.py receives the request and returns your key
- Bing verifies the key matches and accepts the submission
File: templates/dashboard.html (Web Interface)
A complete single-page web application with:
- Dark theme design
- Responsive layout (works on mobile and desktop)
- Real-time stats cards
- Tabbed interface (All URLs, Crawled, Not Crawled, Logs)
- Action buttons with loading states
- Toast notifications
- Auto-refresh every 30 seconds
- No external dependencies (pure HTML/CSS/JS)
JavaScript functions:
- loadData(): Fetches stats and updates the current tab
- loadAllUrls(): Renders the All URLs table
- loadCrawledUrls(): Renders the Crawled table
- loadUncrawledUrls(): Renders the Not Crawled table with resubmit buttons
- loadLogs(): Renders the activity log
- checkNow(): Triggers manual RSS check
- checkCrawlStatus(): Triggers manual crawl check
- resubmitUncrawled(): Triggers manual resubmission of all uncrawled
- resubmitSingle(url): Resubmits one specific URL
- refreshData(): Refreshes dashboard data
File: YOUR_KEY.txt (IndexNow Key File)
A plain text file containing ONLY your 32-character IndexNow API key.
- File name must be exactly: YOUR_KEY.txt
- Contents must be exactly: YOUR_KEY (no extra spaces, no newlines)
- This file is served by key_server.py for Bing verification
File: requirements.txt (Python Dependencies)
Lists the Python packages needed:
- flask: Web framework for the dashboard
- requests: HTTP client for API calls
- feedparser: RSS feed parser
- schedule: Task scheduling
Install with: pip install -r requirements.txt
File: setup.bat (First-Time Setup Script)
Automates the first-time setup:
- Checks if Python is installed
- Creates a Python virtual environment (venv)
- Activates the virtual environment
- Installs all required packages
Run once: double-click setup.bat
File: start.bat (Launch Script)
Automates launching the dashboard:
- Activates the virtual environment
- Starts key_server.py in a new window
- Waits 3 seconds
- Starts app.py (dashboard) in a new window
- Opens http://localhost:5000
Run every time: double-click start.bat
FAQ
Q: Do I need to keep my computer on all the time?
A: The dashboard only works while your computer is on and connected to the internet. If you turn off your computer, auto-submission stops. When you turn it back on, it will catch up by checking recent posts.
Q: Can I run this on a server or VPS instead?
A: Yes! The dashboard works on any computer with Python. A VPS (like DigitalOcean, Vultr, or AWS) is actually better because it stays online 24/7. Just upload the files and run app.py.
Q: Does this work with blogspot.com domains?
A: Yes, but with a limitation. IndexNow requires the key file to be hosted at your domain root. With blogspot, you cannot do this. However, the dashboard still works because we host the key file locally and expose it via ngrok/Cloudflare. Bing will verify the key through the tunnel.
Q: Is this free?
A: Yes, completely free. ngrok has a free tier. Cloudflare Tunnel is free. Python and all libraries are free. The only cost is keeping your computer on (electricity).
Q: How many URLs can I submit per day?
A: IndexNow allows up to 10,000 URLs per day. For a typical Blogger site, you will never hit this limit.
Q: Will this also submit to Google?
A: No. Google does not participate in IndexNow (as of 2026). For Google, submit your sitemap in Google Search Console. Google will discover your posts through the sitemap and RSS feed.
Q: Can I submit old posts too?
A: Yes. The dashboard only auto-submits posts from the last 24 hours, but you can manually submit any URL using the API endpoint or by modifying the submitted_urls.json file.
Q: What happens if my ngrok URL changes?
A: If your ngrok URL changes, Bing will get a 403 error on the next submission. Update KEY_LOCATION in app.py with the new URL and restart the dashboard. For a permanent solution, use Cloudflare Tunnel.
Q: Is my API key safe?
A: Your API key is stored locally on your computer. The key file is only served to Bing for verification. Do not share your key with anyone. If you suspect it is compromised, generate a new one and update all files.
Q: Can I use this for multiple Blogger sites?
A: Yes, but you need a separate instance for each site. Copy the Bing folder, update the RSS_FEED, DOMAIN, and API_KEY for each site, and run on different ports (5000, 5001, 5002, etc.).
Q: The dashboard says "Pending" for all URLs. Is that normal?
A: "Pending" means the URL was submitted but crawl status has not been checked yet. Wait up to 6 hours for the crawl check to run, or click "Check Crawl Status" manually.
Q: Can I change the check intervals?
A: Yes. Edit app.py and change these values:
"CHECK_INTERVAL": 15, # Minutes between RSS checks "CRAWL_CHECK_INTERVAL": 6, # Hours between crawl checks "RETRY_AFTER_HOURS": 24, # Hours before auto-resubmit
Q: Where is my data stored?
A: All data is stored locally in the data/ folder:
- submitted_urls.json: List of submitted URLs
- crawled_urls.json: Crawl status tracking
- dashboard_log.txt: Activity logs
- settings.json: Your configuration
Q: How do I uninstall?
A: Simply delete the Bing folder. No registry entries, no background services.
This dashboard gives Blogger users the same indexing power that WordPress and other self-hosted platforms enjoy. By automating IndexNow submissions, your new blog posts will appear in Bing search results within hours instead of days or weeks.
The setup requires some initial configuration, but once running, it operates completely automatically. Just publish your posts on Blogger as usual, and the dashboard handles the rest.
For questions or issues, check the Troubleshooting section above or review the logs in the dashboard for specific error messages.
Bing IndexNow Dashboard for Blogger - Complete Guide
Built with Python, Flask, and a lot of coffee
