Skip to content

For developers

URL Indexing API and MCP Server

The URL indexing API from SearchAnalysis.io accepts up to 10,000 URLs in one POST and sends each one to Google and Bing. This indexing API for URLs returns per-URL, per-channel state for every batch, so your pipeline reads what Google confirmed. The URL indexing MCP server exposes the same calls as six tools an AI client calls by name.

Join the waitlist Read the OpenAPI document

POST /api/v1/submissions · bearer API key · 6 MCP tools

Terminal / MCPConnected
$ claude mcp add --transport http searchanalysis https://searchanalysis.io/mcp
Added HTTP MCP server searchanalysis
› Submit the three pages I published today and tell me when Google confirms them.
calling list_properties → example.com
calling submit_urls → batch created, 3 URLs
calling check_submission
✓ 2 of 3 indexed by URL Inspection. 1 is Processing; next inspection on the ladder.

Definition

What a URL Indexing API Does

A URL indexing API is an HTTP interface that takes URLs from your code, sends them to search engine indexing channels and reports which ones the search engine confirmed. The SearchAnalysis.io URL indexing API is a REST API v1 with bearer keys: one POST sends up to 10,000 URLs to the Google Indexing API, URL Inspection and IndexNow, and a GET returns per-URL, per-channel state.

The same calls run through a remote MCP server, so an AI agent submits and checks URLs with tool calls. A public OpenAPI 3.1 document describes the REST surface.

A batch is one submission with its own page, an optional name and a source: web, API, MCP or scheduled scan. A channel is one of the three engines a URL goes to.

10,000URLs

Per batchThe URL indexing API accepts up to 10,000 URLs in one POST, so a whole site section goes out as one batch.

10minutes

To the first inspectionThe URL indexing API schedules the first URL Inspection about 10 minutes after submission, so a status call shows Google's first verdict within the hour.

7days

Between rechecksThe URL indexing API rechecks every Indexed URL every 7 days, so a page that later drops out of Google shows up in its status.

Old way, new way

Direct Engine Calls Compared With One Endpoint

Three ways to get URLs from your publish step into Google and Bing.

SearchAnalysis.io REST API

SearchAnalysis.io REST API
  • One POST /api/v1/submissions sends up to 10,000 URLs to all three channels.
  • An Idempotency-Key header returns the original batch on a retry instead of creating a duplicate.
  • URLs over the day's Indexing API quota wait for the next UTC window and keep their place in line.
  • The inspection ladder runs for you, starting about 10 minutes after submission.
  • GET /api/v1/submissions/{batchId} returns per-URL, per-channel state.

Developer surface

Building Blocks for Developers

Six parts make up the developer surface, all shipped today.

REST API v1

Exposes five endpoints under /api/v1 for batches, properties and quota, each authenticated with a bearer API key.

5 endpoints

Indexing API quota184 / 200
REST API v1

Idempotency Keys

Returns the original batch when a retried POST carries the same Idempotency-Key header, instead of creating a duplicate.

Idempotency-Key header

Idempotency Keys

OpenAPI 3.1 Document

Describes every REST endpoint, field and header in a public OpenAPI 3.1 file.

/openapi.json

OpenAPI 3.1 Document

Remote MCP Server

Gives an AI client six tools for properties, submissions, index status and quota at https://searchanalysis.io/mcp.

6 tools

Remote MCP Server

llms.txt for AI Agents

Lists the public pages and machine endpoints of SearchAnalysis.io in one plain text file for AI agents.

/llms.txt

Llms.txt for AI Agents

API Keys in Settings

Issues bearer API keys from the Settings page, for both REST calls and the MCP server.

Bearer auth

API Keys in Settings

Process

How to Send Your First Batch

Five steps from invite to a confirmed Indexed status in your own code.

  1. Get an Invite

    SearchAnalysis.io is invite-only today. Join the waitlist with your email, and invites go out from the waitlist.

  2. Connect a Site

    Add the site, connect Google with OAuth and pick the Search Console property. Host the IndexNow key file at https://yourdomain/{key}.txt.

  3. Create an API Key in Settings

    Send it as a bearer token on every REST call, and use it when you add the MCP server.

  4. Submit a Batch

    POST up to 10,000 URLs to /api/v1/submissions with the propertyId from GET /api/v1/properties, or ask your AI client to call submit_urls.

  5. Read the Batch Status

    Call GET /api/v1/submissions/{batchId} or check_submission. A URL shows Indexed only after URL Inspection confirms it.

searchanalysis.io/mcp6 tools · bearer API key
toollist_properties
toolsubmit_urls
toollist_submissions
toolcheck_submission
toolcheck_url_index_status
toolget_quota
Inspection schedule for one URLSearch Console URL Inspection
0 minSent to Indexing API and IndexNow
+10 minFirst URL Inspection
+15 minSecond inspection
+1 hThird inspection
+6 hFourth inspection
+24 hDaily, up to 6 checks
7 daysRecheck after Indexed
First inspectionAbout 10 minutesAfter a URL is submitted
Confirmation ladderAbout 3 daysUp to 6 checks, then a daily fallback
Transient error retry30 minutesFor 429, 5xx and network errors

Why it matters

Why Your Release Pipeline Benefits

URL indexing API advantages are one call for three channels, retries that never duplicate a batch and a status that only Google's URL Inspection turns green.

Reach Three Channels With One Request

Each URL gets three status rows: Google Indexing API submission, Search Console and IndexNow submission.

Google Indexing API submission

Retry Without Creating Duplicates

An Idempotency-Key header returns the original batch on retry, and the 30-day dedup skips URLs already tracked. The OpenAPI document shows the header on the POST.

OpenAPI document

Read Confirmed Status in Your Code

The Search Console row turns Indexed only when the Google index checker reads a PASS verdict or an indexed coverageState.

Google index checker

Hand the Routine to an AI Agent

An agent lists properties, submits URLs and checks status through MCP, and llms.txt for AI agents points it at the machine endpoints.

Llms.txt for AI agents

Sites that publish through a sitemap need no code: sitemap monitoring scans every 6 hours and submits new URLs on its own.

URL Inspection / sc-domain:example.comLive
https://example.com/pricingIndexed
verdict
PASS
coverageState
Submitted and indexed
robotsTxtState
ALLOWED
indexingState
INDEXING_ALLOWED
pageFetchState
SUCCESSFUL
googleCanonical
https://example.com/pricing
crawledAs
MOBILE
lastCrawlTime
2026-10-06T14:12:09Z
Check historynewest first
Oct 06 14:20IndexedSubmitted and indexed
Sep 29 14:18IndexedSubmitted and indexed
Sep 15 20:02IndexedSubmitted and indexed
Sep 15 14:02ProcessingDiscovered, currently not indexed
Sep 15 13:17ProcessingURL is unknown to Google

Picture your next deploy: the CI job posts the changed URLs with an Idempotency-Key, a network retry returns the same batch, and before the release notes go out the first inspections have run and your status call lists which URLs Google confirmed.

What we publish about limits

Where Google's Rules Set the Edges

The URL indexing API works inside quotas and scopes that Google and Bing set.

Google Decides What It Indexes

Nobody can guarantee indexing. The Google Indexing API row shows Processing when Google accepts the ping and never shows Indexed, because the notification does not confirm indexing.

The Indexing API Has a Documented Scope

Google documents the Indexing API for JobPosting and BroadcastEvent pages. Most content sites see a Best-effort badge, and submission proceeds best-effort.

Quotas Apply to Every Channel

Google allows 200 Indexing API publish requests a day per Cloud project and 2,000 URL Inspection calls a day per property. SearchAnalysis.io budgets 10,000 IndexNow URLs a day per property. GET /api/v1/quota shows what remains.

Access Is Invite-Only Today

API keys come with an invite from the waitlist. Pricing is announced at launch, and drip-feed submission paced over a number of days is PLANNED.

“The Indexing API can only be used to crawl pages with either JobPosting or BroadcastEvent embedded in a VideoObject.”
Google Indexing API documentation, quota and pricing

API reference

REST API Endpoints

The URL indexing API has five endpoints under /api/v1. Every request carries your API key as a bearer token, and the OpenAPI 3.1 document at /openapi.json holds the full schema.

(Select an endpoint to read more)

POST /api/v1/submissions: Create a Batch

SHIPPEDWRITE

The URL indexing API creates a batch with POST /api/v1/submissions. One request carries up to 10,000 URLs for one property, with an optional batch name and an optional priority. Every URL in the batch then goes to three channels: the Google Indexing API, the Search Console URL Inspection API and IndexNow for Bing.

FieldRequiredWhat it holds
propertyIdYesThe site's id from GET /api/v1/properties
urlsYesUp to 10,000 URLs on that site
nameNoA label shown on the batch page
priorityNoHIGH, NORMAL or LOW: order within your own queue
curl -X POST https://searchanalysis.io/api/v1/submissions \
  -H "Authorization: Bearer $SEARCHANALYSIS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: deploy-2026-10-06-001" \
  -d '{
    "propertyId": "YOUR_PROPERTY_ID",
    "urls": [
      "https://example.com/blog/new-post",
      "https://example.com/blog/updated-guide"
    ],
    "name": "Deploy 2026-10-06",
    "priority": "HIGH"
  }'

Retry Safely With Idempotency-Key

Send an Idempotency-Key header with a value unique to this publish, like your build number. When a timeout makes your job retry, the same key returns the original batch instead of creating a duplicate. Your CI step stays safe to rerun, and a CMS webhook that fires twice for one save creates one batch when both calls carry the same key.

What the Response Contains

The response describes the batch you created, including its batchId. Pass that id to GET /api/v1/submissions/{batchId} to read progress.

What Gets Filtered

URLs outside the site's domain, duplicates and invalid formats show Dropped and are never sent. A URL already actively tracked on your account inside 30 days is skipped and reported. URLs over the day's Google Indexing API submission quota wait for the next UTC window and keep their place in line. Priority decides who goes first inside your own queue, so a HIGH product launch leaves ahead of a LOW archive refresh.

GET /api/v1/submissions: List Batches

SHIPPEDREAD

The URL indexing API lists your batches with GET /api/v1/submissions. Every submission on SearchAnalysis.io becomes a batch with its own page, an optional name and a source, so this endpoint is the index of everything your account has sent, from any of the six ways to submit.

curl https://searchanalysis.io/api/v1/submissions \
  -H "Authorization: Bearer $SEARCHANALYSIS_API_KEY"

Batch Sources

SourceWhere the batch came from
webSingle URL, bulk paste, CSV upload or sitemap import in the app
APIA POST /api/v1/submissions call
MCPA submit_urls tool call from an AI client
scheduled scanAuto-submit after a sitemap scan

Uses in a Pipeline

  • Find the batch your last deploy created by its name, then read its detail.
  • Audit what sitemap monitoring auto-submitted, using the scheduled scan source.
  • Review batches an AI agent created through the MCP server.
  • Feed a dashboard of your own with batch names and sources.

Naming batches pays off here. A name like the release tag or the CMS post slug turns this list into a readable log of your publishing. The name is optional on the POST, and a batch without one still appears with its source.

This endpoint returns batches, not URL rows. For the state of each URL inside a batch, call the batch detail endpoint with its batchId. In the app, a batch page lists its URLs 100 per page, and the Monitor shows every URL across batches with filters for All, Indexed, Pending and Failed.

GET /api/v1/submissions/{batchId}: Read One Batch

SHIPPEDREAD

The URL indexing API returns one batch, with per-URL and per-channel state, from GET /api/v1/submissions/{batchId}. This is the endpoint your pipeline polls to learn what Google confirmed.

curl https://searchanalysis.io/api/v1/submissions/BATCH_ID \
  -H "Authorization: Bearer $SEARCHANALYSIS_API_KEY"

Three Channels per URL

  • GOOGLE_INDEXING: a URL_UPDATED notification. Google's HTTP 2xx shows as Processing, never Indexed.
  • GOOGLE_SEARCH_CONSOLE: the URL Inspection API. This row carries the confirmation and is the only one that turns Indexed.
  • BING: an IndexNow notification. Accepted shows as Processing.

States and Their Labels in the App

StateLabelMeaning
PENDINGQueuedReceived, waiting for a worker
QUEUEDSendingA worker is sending it
SUBMITTEDProcessingThe engine accepted it
INDEXEDIndexedVerified by URL Inspection
FAILEDFailedAn error that needs a person; the error text is shown
DROPPEDDroppedFiltered out before sending
CANCELLEDCancelledCancelled

Polling on the Ladder

Inspections follow a fixed ladder: about 10 minutes after submission, then +15 minutes, +1 hour, +6 hours and every 24 hours, up to 6 checks across about 3 days. Polling the Search Console row faster than the ladder returns the same state. After the ladder, a daily fallback keeps checking unconfirmed URLs. A Failed row carries its error text, and transactional email covers the two outcomes a person cares about: "Indexed: <url>" when a URL is confirmed and "Submission failed: <url>" with the error. The Google index checker page covers the verdict fields behind the Indexed state.

GET /api/v1/properties: List Sites

SHIPPEDREAD

The URL indexing API lists the sites on your account with GET /api/v1/properties. A property is a site you added and connected, and its id is the propertyId every POST needs. Without a valid id, a submission has no site to belong to.

curl https://searchanalysis.io/api/v1/properties \
  -H "Authorization: Bearer $SEARCHANALYSIS_API_KEY"

How a Property Gets Set Up

  1. Add the site in SearchAnalysis.io.
  2. Connect Google with OAuth. Tokens are encrypted at rest with AES-256-GCM and decrypted only in memory at call time.
  3. Pick the matching Search Console property: a domain property (sc-domain:) or a URL-prefix property. Inspections run against this property.
  4. Host the 32-character hex IndexNow key SearchAnalysis.io generates at https://yourdomain/{key}.txt. The product fetches it and checks the contents match before it sends IndexNow notifications.

Why the Property Matters

The property sets the boundaries of a batch. URLs outside the site's domain are Dropped before sending. URL Inspection quotas count per property: 2,000 inspections a day and 600 a minute. The IndexNow budget of 10,000 URLs a day counts per property too.

Call this endpoint once when you configure a job, store the id, and send it with each POST. An agency running many client sites maps each site to its own id, and each site keeps its own inspection quota, so one large client does not use up another client's inspections. The IndexNow submission page covers the key file step in full.

GET /api/v1/quota: Read Remaining Quota

SHIPPEDREAD

The URL indexing API reports remaining engine quota from GET /api/v1/quota. SearchAnalysis.io respects each engine's quota and never fights it, so this endpoint tells you how much of today's capacity is left before you send a large batch.

curl https://searchanalysis.io/api/v1/quota \
  -H "Authorization: Bearer $SEARCHANALYSIS_API_KEY"
EngineLimitScope
Google Indexing API200 publish requests a day, up to 100 URLs per batch requestWhole Google Cloud project
URL Inspection API2,000 a day and 600 a minutePer property
IndexNow10,000 URLs a day (SearchAnalysis.io budget)Per property
Quota resetNext UTC windowURLs over the day's quota wait and keep their place in line

When to Call It

  • Before a migration or a catalog launch, to see how much of the day is left.
  • In a dashboard, next to your own publish counts.
  • After a large POST, to confirm the queue is working through the batch.
  • Inside an agent, through the matching MCP tool get_quota, which accepts a property scope.

The Google Indexing API quota is the tightest of the three and it is shared across the whole Google Cloud project. Google notes that "The quota may increase or decrease based on the document quality." Google's other Indexing API limits are 180 getMetadata requests a minute and 380 requests a minute across endpoints. The Google Indexing API submission page explains how the queue spends the daily quota, with priority deciding order inside your own queue.

MCP reference

MCP Tools

The remote MCP server at https://searchanalysis.io/mcp gives an AI client six tools. Each panel covers what a tool does, the inputs it takes and a prompt a person would type.

(Select a tool to read more)

list_properties: Find Your Site IDs

SHIPPEDREAD

The URL indexing MCP server starts most conversations with list_properties. The tool returns the sites on your account, each with the property id that submit_urls needs. It covers the same ground as GET /api/v1/properties for an AI client.

Add the Server to Claude Code

claude mcp add --transport http searchanalysis https://searchanalysis.io/mcp

The server is remote, at https://searchanalysis.io/mcp, and it authenticates with a bearer API key you create in Settings. Other MCP clients that support remote HTTP servers point at the same address.

Inputs

None to supply. The tool reads the properties tied to your API key, and each one maps to a Search Console property: a domain property (sc-domain:) or a URL-prefix property.

Example Prompts

  • "List my SearchAnalysis.io properties and show the id for example.com."
  • "Which of my sites are connected to SearchAnalysis.io?"

An agent that manages several client sites calls this tool first, matches the domain in your request to a property, and carries that id into the submission. A person never has to copy an id by hand. If a site is missing from the list, add and connect it in the app: connect Google with OAuth, pick the Search Console property and verify the IndexNow key file. The llms.txt for AI agents file lists the machine endpoints an agent can read before it calls any tool.

submit_urls: Send a Batch From Chat

SHIPPEDWRITE

The URL indexing MCP server submits URLs with submit_urls. The tool creates a batch, sends every URL to the Google Indexing API, the URL Inspection API and IndexNow, and returns a batchId you pass to check_submission. It does the same work as POST /api/v1/submissions, with the AI client filling in the inputs from your request.

InputRequiredNotes
Property idYesFrom list_properties
URLsYesUp to 10,000 per batch, on that property's domain
PriorityNoHigh, Normal or Low: order within your own queue
Batch nameNoShown on the batch page

Example Prompts

  • "Submit these three URLs to SearchAnalysis.io for example.com with high priority and name the batch October launch."
  • "Send every URL in the list I pasted above to SearchAnalysis.io for the docs site."

Rules the Tool Follows

  • URLs outside the site's domain, duplicates and invalid formats are Dropped.
  • A URL already actively tracked on your account inside 30 days is skipped and reported.
  • URLs over the day's Google Indexing API quota wait for the next UTC window.
  • The batch shows the source MCP on its batch page.

An agent that writes and publishes pages, then calls submit_urls with the new addresses, closes the loop between writing and indexing. The IndexNow submission channel carries the same URLs to Bing in the same call, and IndexNow engines share what they receive with the other participating engines, including Yandex, Seznam, Naver and Yep.

list_submissions: Review Past Batches

SHIPPEDREAD

The URL indexing MCP server lists your batches with list_submissions, the tool counterpart of GET /api/v1/submissions. Each batch carries its name and its source: web, API, MCP or scheduled scan.

Inputs

None needed for a basic call. The AI client reads the list and filters or summarizes it for you in the conversation, so a question like the ones below needs no extra syntax from you.

Example Prompts

  • "Show my recent SearchAnalysis.io batches and their names."
  • "Which batches came from the scheduled scan this week?"
  • "Find the batch named October launch and give me its batch id."

Where It Fits in a Conversation

This tool answers the question an agent asks when it lacks a batchId: which batch am I looking for? An agent in a new conversation does not have earlier batch ids, so the list is where it looks them up. A person who submitted URLs from the web app yesterday asks the agent today, and the agent finds the batch here, then passes its id to check_submission.

Batches tagged scheduled scan come from sitemap monitoring auto-submit, which scans every 6 hours and submits newly discovered URLs. Listing them is a quick way to ask an agent what your sitemaps sent this week without opening the app.

Clear batch names make this tool more useful. Give each submission a name your agent can match, like a release tag or a campaign name. A batch without a name still lists with its source.

check_submission: Read a Batch's Progress

SHIPPEDREAD

The URL indexing MCP server reports a batch's progress with check_submission. The tool takes the batchId that submit_urls returned and returns each URL with its per-channel state, the same data as GET /api/v1/submissions/{batchId}.

Input

The batchId returned by submit_urls, or one found with list_submissions.

Example Prompts

  • "Check the batch you just submitted and tell me which URLs are indexed."
  • "Which URLs in batch October launch failed, and what was the error?"
  • "Summarize the batch from this morning's deploy by channel."

Reading the Answer

Channel rowWhat the state means
Google Indexing APIProcessing means Google accepted the ping; it never shows Indexed
Search ConsoleIndexed means URL Inspection confirmed it; Processing means not yet
BingProcessing means IndexNow accepted it

Ask an agent too early and most rows show Processing, because Google has not answered the first inspection yet. The first inspection runs about 10 minutes after submission and the ladder continues for about 3 days, so a check an hour later gives a fuller answer. A Failed row carries its error text, and the Monitor in the app offers bulk retry. Transient Google errors (429, 5xx or network) retry after 30 minutes on their own, so a brief outage clears without a prompt from you. The Google index checker page explains the inspection that turns a row Indexed.

check_url_index_status: Check One URL

SHIPPEDREAD

The URL indexing MCP server checks one page with check_url_index_status. The tool takes the exact URL and returns the index status SearchAnalysis.io holds for it from URL Inspection.

Input

The exact URL. Pass it the way you submitted it, with the same protocol, host and path, so the tool matches the tracked URL. A redirect source and its destination are two different URLs, and Google indexes the destination.

Example Prompts

  • "Is https://example.com/pricing indexed in Google according to SearchAnalysis.io?"
  • "Check the index status of the post I published this morning."

What Sits Behind the Status

Every inspection SearchAnalysis.io runs stores Google's health snapshot: verdict, coverageState, robotsTxtState, indexing state, the Google-selected canonical and the last crawl time. A URL counts as Indexed when the verdict is PASS or the coverage state says indexed.

After a URL turns Indexed it is inspected again every 7 days for as long as the site is connected. If a recheck finds it not indexed, the status turns amber Not indexed, a deindex event that deindex monitoring tracks across the site.

For a URL that was never submitted, start with the free indexability checker, which tests status, redirects, robots.txt, directives, canonical and content without sign-up. It states plainly that it cannot tell whether a page is in Google, which is the job of URL Inspection on a verified property.

get_quota: See What Is Left Today

SHIPPEDREAD

The URL indexing MCP server reports remaining engine quota with get_quota, the tool counterpart of GET /api/v1/quota. The call accepts an optional property scope, so one call answers for one site or for the whole account.

Inputs

An optional property id from list_properties. Leave it out for the account view, or pass it to see one site. The Google Indexing API figure is shared across the whole Google Cloud project, while URL Inspection and IndexNow figures count per property.

Example Prompts

  • "How much SearchAnalysis.io quota is left today?"
  • "Before you submit, check the quota for example.com."

Limits the Tool Reports Against

EngineDaily limitCounted per
Google Indexing API200 publish requestsGoogle Cloud project
URL Inspection API2,000 inspectionsProperty
IndexNow10,000 URLsProperty

A careful agent calls get_quota before a large submit_urls. URLs over the day's quota still enter the batch: they wait for the next UTC window and keep their place in line, so the check is for planning. The Google Indexing API submission page explains why that quota is the tightest of the three.

Quota windows reset in UTC, so a submission late in your local evening may land in the next window. Drip-feed submission, paced over a number of days, is PLANNED and will give agents a way to spread a large list on purpose.

FAQ

Questions Before You Integrate

URL Indexing API Questions

Is there an API to submit URLs to Google?

An API to submit URLs to Google exists: the Google Indexing API, documented for JobPosting and BroadcastEvent pages. The SearchAnalysis.io REST API sends each URL to it, to URL Inspection and to IndexNow.

How to check if a URL is indexed with an API?

You check whether a URL is indexed with the Search Console URL Inspection API, which allows 2,000 inspections a day per property. SearchAnalysis.io runs them on a schedule, and a URL shows Indexed when the verdict is PASS or the coverageState says indexed.

How many URLs can I submit per API request?

You submit up to 10,000 URLs per request to POST /api/v1/submissions. Google's Indexing API quota of 200 publish requests a day still applies, so URLs over the day's quota wait for the next UTC window and keep their place.

What happens if an API request is retried?

A retried API request with the same Idempotency-Key header returns the original batch instead of creating a duplicate. A URL already tracked on your account inside 30 days is skipped and reported.

Invite-only access

Join the Waitlist for Your Invite

SearchAnalysis.io is invite-only today. Join the waitlist with your email, and invites go out from the waitlist.

Invite-only. One email when your invite is ready.

Picture your publish step ending with one POST, and your agent telling you an hour later which of those URLs Google confirmed.

Waitlist members getwritten commitments

An Invite Before Public Launch

Waitlist members get access before SearchAnalysis.io opens to everyone.

Launch Pricing Locked

Your launch price stays locked for as long as you stay subscribed. The price is announced at launch.

An Extended Free Trial

Waitlist members get a longer free trial. Its length is announced at launch.

Included in SearchAnalysis.ioshipped

REST API v1 and OpenAPI 3.1

Five endpoints, described at /openapi.json.

Remote MCP Server With Six Tools

Submit, list, check and read quota from an MCP client.

Confirmation by URL Inspection

Indexed appears only after URL Inspection confirms the URL.