3. Search Indexing Radar
The Search Indexing Radar provides dual-engine verification of real-world indexing statuses by directly communicating with the official APIs of Google Search Console (GSC) and Bing Webmaster Tools (BWT).
Google Search Console (GSC) Integration
Google enforces a strict limit of 2,000 URL Inspection requests per day per Google Cloud project. IndexFlow employs a dual-strategy approach to maximize quota efficiency.
┌──────────────────────────────────────┐
│ Discovered Sitemap URLs │
└──────────────────┬───────────────────┘
│
┌──────────────────────────────┴──────────────────────────────┐
│ │
▼ ▼
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ Strategy A: Search Analytics │ │ Strategy B: Inspection API │
│ - Past 30 Days Impressions │ │ - Remaining Unconfirmed Pages │
│ - Up to 25,000 URLs / request │ │ - Parses Coverage State │
│ - 0 Inspection Quota Used │ │ - 3 Concurrency / 250ms delay │
└──────────────┬────────────────┘ └───────────────┬───────────────┘
│ │
└──────────────────────────────┬───────────────────────────────┘
│
▼
┌───────────────────────────────────┐
│ `gsc_index_status` in Database │
│ INDEXED / CRAWLED / DISCOVERED │
└───────────────────────────────────┘
Strategy A: 0-Quota Bulk Sync via Search Analytics
Before expending inspection quotas, IndexFlow queries the Google Search Console Search Analytics API (/webmasters/v3/sites/{siteUrl}/searchAnalytics/query):
- Pulls all URLs that received search impressions over the past 30 days (
dimensions: ["page"],rowLimit: 25000). - Performs exact SHA-256 hash matching and trailing-slash resilient matching against sitemap URLs.
- Automatically marks matching records as
gsc_index_status = 'INDEXED'withgsc_coverage_state = 'Indexed (Search Analytics Confirmed)'. - Saves inspection API quotas for newly published or unranked pages.
Strategy B: Granular URL Inspection API
For URLs not observed in Search Analytics, the GscInspectWorker queries https://searchconsole.googleapis.com/v1/urlInspection/index:inspect:
GSC Raw coverageState |
Mapped gsc_index_status |
Description |
|---|---|---|
Submitted and indexed / Indexed |
INDEXED |
Page is confirmed in Google's index. |
Crawled - currently not indexed |
CRAWLED_NOT_INDEXED |
Google crawled the page but chose not to index it. |
Discovered - currently not indexed |
DISCOVERED_NOT_INDEXED |
Google knows the URL but has not crawled it yet. |
URL is unknown to Google / other |
NOT_INDEXED |
URL has no crawl or index footprint in Google. |
| (Uninspected) | UNKNOWN |
Page has not been evaluated yet. |
GSC Inspection Worker Architecture
- Concurrency: 3 concurrent tasks (
tokio::sync::Semaphore::new(3)). - Pacing: 250ms sleep delay between requests.
- Quota Circuit Breaker: If Google returns HTTP 429, the worker immediately trips the circuit breaker, halts execution, and notifies the pipeline manager to prevent project-level API suspensions.
Bing Webmaster Tools Integration
IndexFlow communicates with the official Bing Webmaster Tools JSON API (https://ssl.bing.com/webmaster/api.svc/json):
1. Dynamic Site URL Resolution (GetUserSites)
Bing requires API calls to specify the exact registered site URL format (e.g. https://example.com/ vs http://example.com/).
BingProvider::resolve_site_urlqueriesGetUserSitesusing the configured API key.- Matches the clean domain and caches the resolved property URL in memory (
Arc<RwLock<HashMap<String, String>>>) to eliminate redundant lookups.
2. Live URL Inspection (GetUrlInfo)
IndexFlow calls GetUrlInfo with parameters siteUrl, url, and apikey:
- Extracts
HttpStatus: Crawler response status code. - Extracts
LastCrawledDate: Microsoft serialized date format (e.g.Date(1711785600000)), converted to UTCDateTime<Utc>. - Extracts
IsPage: Boolean confirmation of webpage indexing. - Decision Rule: If
LastCrawledDatecontains a valid timestamp, the URL is marked asbing_index_status = 'INDEXED'. If Bing returns HTTP 404 or an emptydobject, the URL is marked asNOT_INDEXED.
Rate Limit Throttling (1.5 QPS Safe Zone)
Bing enforces a maximum rate of 1.5 queries per second per API key:
- Worker Concurrency: 2 concurrent workers with a 500ms request delay.
- Backoff Handling: If Bing returns
ThrottleHost,ErrorCode: 5, or HTTP 429, the worker pauses for 2 seconds and retainsbing_index_status = 'UNKNOWN', allowing safe retries on subsequent ticks.
URL Monitoring & Watchlist Timeline
IndexFlow allows site operators to place critical URLs on a high-priority Watchlist to track indexing state transitions over time.
Watchlist Mechanics
- URLs marked as
is_watched = 1record historical events in theindex_status_historytable:CREATE TABLE index_status_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, url_id INTEGER NOT NULL REFERENCES urls(id) ON DELETE CASCADE, provider TEXT NOT NULL, -- 'google' | 'bing' index_status TEXT NOT NULL, -- 'INDEXED' | 'NOT_INDEXED' | etc. coverage_state TEXT, last_crawled_at TEXT, checked_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ); - Only state changes (where status differs from the last recorded check) are inserted, preventing duplicate database entries.
Visual Timeline
The timeline view (/monitoring/:id) combines all lifecycle events for a single URL:
- Sitemap Synced: Time discovered and declared
lastmod. - SEO Audit: HTTP response code, canonical verdict, and noindex checks.
- Submissions: Provider responses and HTTP response codes.
- Index Status History: Provider coverage changes and crawl date updates.
Executing Inspection Operations
Trigger Search Analytics Pool Sync (0 Quota)
curl -X POST "https://www.indexflowing.com/docs/api/v1/pipeline/gsc-inspect/sync?site_id=1" \
-H "Cookie: if_token=<YOUR_JWT_TOKEN>"
Inspect Single URL on Google or Bing
# Query Google Search Console
curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/101/inspect?engine=google" \
-H "Cookie: if_token=<YOUR_JWT_TOKEN>"
# Query Bing Webmaster Tools
curl -X POST "https://www.indexflowing.com/docs/api/v1/urls/101/inspect?engine=bing" \
-H "Cookie: if_token=<YOUR_JWT_TOKEN>"
Toggle Watchlist Status
curl -X POST "https://www.indexflowing.com/docs/api/v1/monitoring/101/watch" \
-H "Content-Type: application/json" \
-H "Cookie: if_token=<YOUR_JWT_TOKEN>" \
-d '{"watched": true}'