IndexMachine API: check and request Google indexing from your own code

A REST API for the sites you connected to IndexMachine. List every page with its Google status, check any URL (live, if you want), request indexing or a re-index through Google's own Request Indexing in your Search Console, and send URLs to Bing and the other engines through IndexNow.

Built for developers and agencies: wire indexing into your CMS, your deploys and your client reports. Rather ask in plain words? The MCP server puts the same API into Claude, Cursor and any AI assistant.

Live, updated daily
Median time to Google
2.8 days
Indexed within 14 days
79%

Median across 1,458 pages IndexMachine got on Google; 14-day share across 1,104 pages it requested. Both timed from the request to our first check.

At a glance

WhatDetails
Base URLhttps://api.indexmachine.co/v1
AuthenticationA Bearer API key from your dashboard, full or read-only
FormatJSON over HTTPS, cursor pagination, one error shape
ContractOpenAPI 3.1 document
AI assistantsIndexMachine MCP server

What you can build

  • Index on publish. Have your CMS or site build request indexing for every new post the moment it goes live, and send it to IndexNow for Bing.
  • Re-index after an update. Rewrote a pricing page or a top post? Request a re-index so Google sees the new version sooner.
  • Client reports for agencies. Pull indexed and not indexed counts for every site into your own dashboards, sheets and weekly reports.
  • Find what's stuck. List the pages Google hasn't indexed, rejected or flagged for a fix, and turn them into tickets in your own tracker.
  • Check before you ship. Ask whether a URL is on Google, live from Google when it matters, from a deploy script or a monitor.

Endpoints

All paths are relative to https://api.indexmachine.co/v1. A {site} is the site's id or its domain, such as example.com.

EndpointWhat it does
GET /meYour plan, the key's permissions, your hourly request budget and whether your Chrome extension is online.
GET /activityToday's Request indexing results per site and in total, which sites used up Google's daily quota, open requests and the latest events.
GET /sitesEvery Search Console property you connected, with page counts by status.
GET /sites/{site}One site: today's Request indexing quota, the median days from a first request to indexing, and 30 days of page counts.
GET /sites/{site}/pagesA site's pages by status (indexed, not_indexed, awaiting, requested, rejected, needs_fix, excluded, not_found) or by part of the URL.
GET /urls/statusWhether a URL is indexed, and as of when. live=true asks Google right now.
POST /indexing_requestsRequests indexing for a URL, also one that isn't in your sitemap yet. force: true re-indexes a page already on Google; preview: true shows what would happen and changes nothing.
GET /indexing_requests, GET /indexing_requests/{id}Follow your requests: open ones with their ETA, closed ones with Google's answer.
DELETE /indexing_requests/{id}Cancels a request that hasn't gone out yet.
POST /sites/{site}/indexnowSends up to 100 URLs of one site to Bing, Yandex and the other IndexNow engines.
GET /openapi.jsonThe OpenAPI 3.1 document. Needs no key.

Authentication

Every call sends an API key in the Authorization header. Creating one takes a minute:

  1. Open Settings in the dashboard

    Go to app.indexmachine.co/settings, or choose Settings from your profile menu.

  2. Create a key

    Under API keys press Create key, give it a label and choose Full or Read only.

  3. Copy it once

    The key starts with im_live_ and is shown only once. Keep it on your server or in a secret store, never in a browser, an app or a repository.

Authorization: Bearer im_live_...
  • Read only: sites, pages, URL checks, requests and activity.
  • Full: also requests indexing, cancels requests and submits to IndexNow. A read-only key that tries gets 403 permission_denied.
  • Roll or revoke any key on the Settings page at any time. An account holds up to 10 active keys.

You need an IndexMachine account with your Search Console sites connected (sign-up is free) and the IndexMachine Chrome extension for requests to Google. Requesting indexing and IndexNow submits need a paid plan for the site; without one the API answers 402 upgrade_required.

Quick start with curl

List the pages Google hasn't indexed

curl "https://api.indexmachine.co/v1/sites/example.com/pages?status=not_indexed" \
  -H "Authorization: Bearer $INDEXMACHINE_API_KEY"

Pages come back ordered by path, 50 per call by default and up to 200 with limit. Send next_cursor back as cursor for the next page; it is null on the last one.

Check a URL, live from Google

curl -G https://api.indexmachine.co/v1/urls/status \
  -H "Authorization: Bearer $INDEXMACHINE_API_KEY" \
  --data-urlencode "url=https://example.com/blog/new-post" \
  -d live=true

Without live=true the answer says whether the URL is indexed and as of when. With it, Google answers right now, using 1 of 50 live checks per site a day.

Request indexing, preview first

curl https://api.indexmachine.co/v1/indexing_requests \
  -H "Authorization: Bearer $INDEXMACHINE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/blog/new-post", "preview": true}'

preview: true changes nothing and answers what the request would do, with the same errors a real one would get. Drop it to send the request: the answer is a 202 with the request's id, an honest ETA and the site's Google quota for the day. A page already on Google answers already_indexed and uses nothing; add "force": true to request a re-index. The answer, shortened:

{
  "outcome": "created",
  "request": {
    "id": "c9a1e2b3-4d5f-4a6b-8c7d-9e0f1a2b3c4d",
    "url": "https://example.com/blog/new-post",
    "eta": "2026-10-31T14:05:00Z"
  },
  "quota": {
    "site_used_today": 4,
    "site_limit": 10,
    "resets_at": "2026-11-01T07:00:00Z"
  }
}

Rate limits

LimitHow much
API requests1,000 per hour on paid plans, 300 per hour otherwise
Live URL checks50 per site a day
Open indexing requests10 per site, 100 in all
Request indexing on GoogleGoogle's own daily quota, about 10 per site, reset at midnight Pacific
IndexNow submits20 per site a day, up to 100 URLs each
Page lists50 per call by default, up to 200
Request lists25 per call by default, up to 100

Successful answers carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers, and GET /me shows the hourly budget. Over a limit the API answers 429 with a Retry-After header in seconds. These limits apply to your API calls: the IndexNow submissions IndexMachine sends for your sitemap pages stay unlimited.

Errors

Every 4xx and 5xx answer has the same JSON shape. Branch on error.code; error.message is written for people and can change. param names the parameter at fault, and request_id matches the X-Request-Id header (send your own and the API keeps it).

{
  "error": {
    "code": "permission_denied",
    "message": "This key is read-only.",
    "request_id": "req_7f3c2a91b4d84e0f"
  }
}
StatusCodes
400invalid_url, invalid_parameter, invalid_cursor
401api_key_missing, api_key_invalid
402upgrade_required
403permission_denied
404site_not_found, not_found
409google_indexing_off, indexnow_not_verified, request_closed
422page_excluded, pages_limit_reached
429rate_limited, request_cap
503unavailable

New codes can be added, so handle an unknown one by its HTTP status.

Rather ask your AI assistant?

The IndexMachine MCP server runs on this same API. Add it to Claude Code, Claude Desktop, claude.ai, Cursor or VS Code with the same key and ask "which pages on example.com aren't on Google yet?" in plain words.

FAQ

Does IndexMachine have a public API?

Yes. The IndexMachine API at https://api.indexmachine.co/v1 lets your own code list your sites and pages, check whether a URL is on Google, request indexing or a re-index, cancel a request and submit URLs to IndexNow. Create a key on the Settings page of the dashboard.

Is this Google's Indexing API?

No. Google's Indexing API is documented only for job posting and livestream pages. The IndexMachine API requests indexing through Google's own Request Indexing in your Search Console, which works for any page of a site you own, plus IndexNow for Bing and the other engines. No link farms.

How fast does a request get my page on Google?

A request comes back with its honest ETA and the site's quota for the day. It goes out through Google's own Request Indexing in your Search Console, within Google's daily limit of about 10 requests per site. Google then decides when it indexes the page, and GET /urls/status tells you once it has. Of 1,841 pages IndexMachine requested, 1,418 (77%) were on Google, typically by our first check about 3 days after the request.

What is the difference between a full and a read-only key?

A read-only key reads sites, pages, URL checks, requests and activity. A full key can also request indexing, cancel requests and submit to IndexNow. Give dashboards and reports a read-only key.

What are the API rate limits?

1,000 requests per hour on paid plans and 300 otherwise, 50 live URL checks per site a day, 10 open indexing requests per site (100 in all) and 20 IndexNow submits per site a day of up to 100 URLs each. Over a limit the API answers 429 with a Retry-After header.

Can an agency use the API for client sites?

Yes. The API covers every Search Console property you connect to IndexMachine, and a subscription covers unlimited sites and pages, so one key works across all your clients. Use read-only keys for reporting.

Get a key, index from your code

Sign up free, connect Search Console and see which pages Google hasn't indexed, then create an API key in Settings. Daily indexing from $12.50 once with code BETA50; see pricing.

Free account. Import may take a while for big sites, Google rate-limits Search Console.