# Google Indexing API > The Google Indexing API (v3) lets a site owner tell Google directly when a page has been added, > updated, or removed, instead of waiting for a crawl. It is a two-operation API. Google restricts its > use to pages carrying JobPosting structured data, or BroadcastEvent embedded in a VideoObject. It is > free of charge, gated on Search Console ownership verification, and capped at 200 publish requests per > day per Google Cloud project by default. Generated by API Evangelist on 2026-08-13. Google does not publish an llms.txt (https://developers.google.com/llms.txt returned HTTP 404 on 2026-08-13), so this file is generated from the provider's own published documentation and the artifacts in this repository. Every link below was probed and returned HTTP 200 unless stated. ## What you can actually do - Submit a URL for crawling: `POST https://indexing.googleapis.com/v3/urlNotifications:publish` with `{"url": "...", "type": "URL_UPDATED"}`. - Tell Google a page is gone: same endpoint with `"type": "URL_DELETED"`. - Check what Google last heard from you about a URL: `GET https://indexing.googleapis.com/v3/urlNotifications/metadata?url=...`. This only works for URLs previously accepted from the same project. There is nothing else. No listing, no search, no status polling, no webhooks, no events. ## Before your first call All four steps are required; skipping any of them produces a 401 or a 403. 1. Create a Google Cloud project and enable the Indexing API. 2. Create a service account and download its JSON private key. 3. Verify the site in Google Search Console. 4. Add the service account email as a delegated site owner on that Search Console property. Auth is OAuth 2.0 with the scope `https://www.googleapis.com/auth/indexing`, presented as `Authorization: Bearer `. The service account mints tokens via a signed JWT assertion at `https://oauth2.googleapis.com/token`. ## Limits you need to plan around - 200 publish requests per day per project (URL_UPDATED and URL_DELETED combined). Resets midnight Pacific. - 180 getMetadata requests per minute per project. - 380 requests per minute per project across all endpoints. - Up to 100 requests can be combined in one batch. - **No rate-limit headers.** The API returns no `RateLimit-*`, `X-RateLimit-*` or `Retry-After` header. Remaining quota is only visible in the Google API Console. Budget locally; you cannot read it back. - Exhaustion shows up as `403 dailyLimitExceeded` / `403 quotaExceeded` or `429 rateLimitExceeded`. ## Errors Errors use the Google `google.rpc.Status` envelope, **not** RFC 9457 problem+json: ```json {"error":{"code":401,"message":"...","status":"UNAUTHENTICATED", "details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","reason":"CREDENTIALS_MISSING", "domain":"googleapis.com"}]}} ``` The one you will hit most: `403 Permission denied. Failed to verify the URL ownership.` That means step 3 or 4 above is incomplete, not that your token is bad. ## APIs - [urlNotifications:publish](https://developers.google.com/search/apis/indexing-api/v3/using-api): submit or remove a URL. Base `https://indexing.googleapis.com/v3`. - [urlNotifications/metadata](https://developers.google.com/search/apis/indexing-api/v3/using-api): read the latest notification state for a URL. ## Specs Google publishes a Google API **Discovery Document**, not an OpenAPI. It is the authoritative contract. - [Discovery Document (v3, revision 20260805)](https://indexing.googleapis.com/$discovery/rest?version=v3) - Captured verbatim: `openapi/_original/google-indexing-discovery-v3.json` - OpenAPI 3.1 translations by API Evangelist: `openapi/google-indexing-urlnotifications-api-openapi.yml`, `openapi/google-indexing-urlnotifications-publish-api-openapi.yml` - JSON Schema: `json-schema/UrlNotification.json` ## Docs - [Indexing API overview](https://developers.google.com/search/apis/indexing-api) - [Prerequisites](https://developers.google.com/search/apis/indexing-api/v3/prereqs) - [Quickstart](https://developers.google.com/search/apis/indexing-api/v3/quickstart) - [Using the API](https://developers.google.com/search/apis/indexing-api/v3/using-api) - [API reference](https://developers.google.com/search/apis/indexing-api/v3/reference/indexing/rest/v3/urlNotifications) - [Quota and pricing](https://developers.google.com/search/apis/indexing-api/v3/quota-pricing) - [Errors](https://developers.google.com/search/apis/indexing-api/v3/core-errors) - [Client libraries](https://developers.google.com/search/apis/indexing-api/v3/libraries) - [APIs Explorer (live console)](https://developers.google.com/apis-explorer/#p/indexing/v3/) - [Search status dashboard](https://status.search.google.com/) ## SDKs All first-party, all code-generated from the Discovery Document. - JavaScript: `@googleapis/indexing` 7.0.0 (2026-08-03), or `googleapis` 174.0.1 (2026-08-05) - Python: `google-api-python-client` 2.198.0 (2026-06-25) — `build('indexing','v3',...)` - Ruby: `google-apis-indexing_v3` 0.19.0 (2026-06-21) - .NET: `Google.Apis.Indexing.v3` 1.74.0.3191 (2026-05-12) - Go: `google.golang.org/api/indexing/v3` (module v0.293.0, 2026-08-11) - PHP: `google/apiclient` v2.19.4 (2026-06-29) - Java: `com.google.apis:google-api-services-indexing` v3-rev20230927-2.0.0 — **last published 2023-10-04**, still pinned to a 2023 discovery revision. ## What this API does not have Recorded so an agent does not go looking: no MCP server, no A2A agent card, no llms.txt, no webhooks or events, no AsyncAPI, no GraphQL, no published .proto, no CLI, no sandbox or test mode, no idempotency key, no pagination, no rate-limit headers, no SLA, no roadmap, and no deprecation policy. ## Artifacts in this repository `openapi/` `json-schema/` `json-ld/` `rules/` `collections/` `postman/` `authentication/` `scopes/` `security/` `well-known/` `packages/` `plans/` `rate-limits/` `errors/` `lifecycle/` `conventions/` `conformance/` `changelog/` `sandbox/` `data-model/` `mcp/` `overlays/` `skills/` `llms/` `agentic-access/` `finops/`