Playbook · SEO & SERP Research

Check whether a list of URLs is indexed by Google

Send your URLs as site: queries, up to 100 per request, and see which ones Google returns. A URL with no result is not in Google's index.

In short

Send each URL as a site: query to /search-light-bulk with limit=1, up to 100 URLs per request. A URL that returns a result is indexed; an empty result means Google does not return it.

The use case

A page Google has not indexed gets no search traffic. Search Console shows index status only for sites you have verified. Link builders, agencies and publishers also need it for pages they don't own, like backlinks and guest posts, and for thousands of URLs at once. A site: search for each exact URL answers it.

Who does this: Link builders and backlink indexing services checking that placed links are indexed, SEO agencies auditing client sites, and content teams checking that new pages made it into Google.

How to do it

Uses the Real-Time Web Search API, tested live on October 27, 2026. Send each URL as a site: query to /search-light-bulk with limit=1. Here, three pages on our own blog:

import requests

urls = [
    "https://www.openwebninja.com/blog/zillow-api",
    "https://www.openwebninja.com/blog/glassdoor-api",
    "https://www.openwebninja.com/blog/this-page-does-not-exist",
]
r = requests.post(
    "https://api.openwebninja.com/realtime-web-search/v2/search-light-bulk",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={"queries": [f"site:{u}" for u in urls], "limit": 1},
)
for item in r.json()["data"]:
    print("indexed    " if item["results"] else "not indexed", item["query"][5:])
Result
indexed     https://www.openwebninja.com/blog/zillow-api
not indexed https://www.openwebninja.com/blog/glassdoor-api
not indexed https://www.openwebninja.com/blog/this-page-does-not-exist
Full response of the cURL call above · JSON
{
  "status": "OK",
  "request_id": "09b64395-48e3-4211-9897-64f1763b7ff0",
  "data": [
    {
      "query": "site:https://www.openwebninja.com/blog/zillow-api",
      "results": [
        {
          "title": "Zillow API Alternatives in 2026: 5 Tested and Compared",
          "snippet": "Its docs describe a Zillow API with lookups by address, ZPID or URL, search, and Zestimate, tax and price history.",
          "url": "https://www.openwebninja.com/blog/zillow-api",
          "domain": "www.openwebninja.com",
          "position": 1
        }
      ]
    },
    {
      "query": "site:https://www.openwebninja.com/blog/glassdoor-api",
      "results": []
    },
    {
      "query": "site:https://www.openwebninja.com/blog/this-page-does-not-exist",
      "results": []
    }
  ]
}

For a whole list

Put one URL per line in urls.txt. The script sends them 100 at a time and writes indexed true or false for each URL:

import csv
import requests

API_KEY = "YOUR_API_KEY"
URL = "https://api.openwebninja.com/realtime-web-search/v2/search-light-bulk"

urls = [line.strip() for line in open("urls.txt") if line.strip()]

with open("index_status.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["url", "indexed", "google_title"])
    for i in range(0, len(urls), 100):  # up to 100 queries per request
        batch = urls[i:i + 100]
        r = requests.post(URL, headers={"x-api-key": API_KEY},
                          json={"queries": [f"site:{u}" for u in batch], "limit": 1}, timeout=120)
        found = {item["query"][5:]: item["results"] for item in r.json()["data"]}
        for u in batch:
            hits = found.get(u) or []
            w.writerow([u, bool(hits), hits[0]["title"] if hits else ""])
index_status.csv
url,indexed,google_title
https://www.openwebninja.com/blog/zillow-api,True,Zillow API Alternatives in 2026: 5 Tested and Compared
https://www.openwebninja.com/blog/glassdoor-api,False,
https://www.openwebninja.com/blog/scrape-google-maps-reviews,True,How to Scrape Google Maps Reviews (Every Review)
https://www.openwebninja.com/blog/get-all-waze-alerts-in-an-area,True,How to Get All Waze Alerts in an Area
https://www.openwebninja.com/blog/this-page-does-not-exist,False,

Five URLs took 2 seconds in one request.

Good to know

  • The check is real. Our own Glassdoor post came back not indexed, and a broader site:openwebninja.com glassdoor search confirmed Google showed other pages of ours, but not that one.
  • Each URL is billed as one request, and up to 100 fit in one call.
  • Use limit=1. You only need to know whether a result exists.
  • Set gl and hl to check Google in another country, for example gl=de.

Frequently asked questions

Is a Google site: search a reliable way to check whether a page is indexed?

It shows whether Google returns that exact URL right now. If a page you expect is missing, confirm in Search Console when it is your own site.

How do I check if thousands of URLs are indexed in Google without Search Console?

Send them 100 at a time to /search-light-bulk as site: queries, as in the script above. Each URL is billed as one request.

Can I check whether my backlinks on other websites are indexed?

Yes. A site: search works for any public URL, which is why link builders use it for backlinks.

Start building with real-time web data

Every API includes a free tier. No credit card required, and the first request is a minute away.