REST API v1
Exposes five endpoints under /api/v1 for batches, properties and quota, each authenticated with a bearer API key.
For developers
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.
Definition
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
Three ways to get URLs from your publish step into Google and Bing.
POST /api/v1/submissions sends up to 10,000 URLs to all three channels.Idempotency-Key header returns the original batch on a retry instead of creating a duplicate.GET /api/v1/submissions/{batchId} returns per-URL, per-channel state.https://searchanalysis.io/mcp for properties, submissions, index status and quota.Developer surface
Six parts make up the developer surface, all shipped today.
Exposes five endpoints under /api/v1 for batches, properties and quota, each authenticated with a bearer API key.
Returns the original batch when a retried POST carries the same Idempotency-Key header, instead of creating a duplicate.
Describes every REST endpoint, field and header in a public OpenAPI 3.1 file.
OpenAPI 3.1 DocumentGives an AI client six tools for properties, submissions, index status and quota at https://searchanalysis.io/mcp.
Lists the public pages and machine endpoints of SearchAnalysis.io in one plain text file for AI agents.
Llms.txt for AI AgentsIssues bearer API keys from the Settings page, for both REST calls and the MCP server.
API Keys in SettingsProcess
Five steps from invite to a confirmed Indexed status in your own code.
Get an Invite
SearchAnalysis.io is invite-only today. Join the waitlist with your email, and invites go out from the waitlist.
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.
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.
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.
Read the Batch Status
Call GET /api/v1/submissions/{batchId} or check_submission. A URL shows Indexed only after URL Inspection confirms it.
Why it matters
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.
Each URL gets three status rows: Google Indexing API submission, Search Console and IndexNow submission.
Google Indexing API submissionAn 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.
The Search Console row turns Indexed only when the Google index checker reads a PASS verdict or an indexed coverageState.
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 agentsSites that publish through a sitemap need no code: sitemap monitoring scans every 6 hours and submits new URLs on its own.
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
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.”
API reference
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)
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.
| Field | Required | What it holds |
|---|---|---|
propertyId | Yes | The site's id from GET /api/v1/properties |
urls | Yes | Up to 10,000 URLs on that site |
name | No | A label shown on the batch page |
priority | No | HIGH, 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"
}'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.
The response describes the batch you created, including its batchId. Pass that id to GET /api/v1/submissions/{batchId} to read progress.
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.
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"| Source | Where the batch came from |
|---|---|
| web | Single URL, bulk paste, CSV upload or sitemap import in the app |
| API | A POST /api/v1/submissions call |
| MCP | A submit_urls tool call from an AI client |
| scheduled scan | Auto-submit after a sitemap scan |
scheduled scan source.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.
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"URL_UPDATED notification. Google's HTTP 2xx shows as Processing, never Indexed.| State | Label | Meaning |
|---|---|---|
| PENDING | Queued | Received, waiting for a worker |
| QUEUED | Sending | A worker is sending it |
| SUBMITTED | Processing | The engine accepted it |
| INDEXED | Indexed | Verified by URL Inspection |
| FAILED | Failed | An error that needs a person; the error text is shown |
| DROPPED | Dropped | Filtered out before sending |
| CANCELLED | Cancelled | Cancelled |
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.
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"sc-domain:) or a URL-prefix property. Inspections run against this property.https://yourdomain/{key}.txt. The product fetches it and checks the contents match before it sends IndexNow notifications.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.
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"| Engine | Limit | Scope |
|---|---|---|
| Google Indexing API | 200 publish requests a day, up to 100 URLs per batch request | Whole Google Cloud project |
| URL Inspection API | 2,000 a day and 600 a minute | Per property |
| IndexNow | 10,000 URLs a day (SearchAnalysis.io budget) | Per property |
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
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)
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.
claude mcp add --transport http searchanalysis https://searchanalysis.io/mcpThe 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.
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.
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.
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.
| Input | Required | Notes |
|---|---|---|
| Property id | Yes | From list_properties |
| URLs | Yes | Up to 10,000 per batch, on that property's domain |
| Priority | No | High, Normal or Low: order within your own queue |
| Batch name | No | Shown on the 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.
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.
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.
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.
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}.
The batchId returned by submit_urls, or one found with list_submissions.
| Channel row | What the state means |
|---|---|
| Google Indexing API | Processing means Google accepted the ping; it never shows Indexed |
| Search Console | Indexed means URL Inspection confirmed it; Processing means not yet |
| Bing | Processing 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.
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.
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.
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.
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.
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.
| Engine | Daily limit | Counted per |
|---|---|---|
| Google Indexing API | 200 publish requests | Google Cloud project |
| URL Inspection API | 2,000 inspections | Property |
| IndexNow | 10,000 URLs | Property |
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
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.
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.
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.
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.
You add the SearchAnalysis.io MCP server to Claude Code with claude mcp add --transport http searchanalysis https://searchanalysis.io/mcp. The server authenticates with a bearer API key you create in Settings.
An AI agent submits URLs for indexing through the submit_urls tool on the SearchAnalysis.io MCP server. The tool takes a property id from list_properties, the URLs, and an optional priority and batch name, and returns a batchId for check_submission.
SearchAnalysis.io has an llms.txt file at /llms.txt. It lists the public pages and machine endpoints for AI agents.
Invite-only access
SearchAnalysis.io is invite-only today. Join the waitlist with your email, and invites go out from the waitlist.
Picture your publish step ending with one POST, and your agent telling you an hour later which of those URLs Google confirmed.
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.
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.