Submit URLs for indexing programmatically. Simple REST endpoints, Bearer-token auth, and predictable JSON responses.
All requests authenticate with your secret API key sent as a Bearer token in the Authorization header. You can find and regenerate your key in Settings → API.
Never expose your secret key in client-side code. Treat it like a password.
All endpoints are relative to your site’s REST base:
The rate limit is the same on every plan — plans differ in how many credits you hold, not how fast you may spend them.
| Limit | Value | Applies to |
|---|---|---|
| Requests per minute | 60 | Each API key, on a rolling one-minute window. |
| URLs per request | 200 | More than this is rejected with 422. |
| Credits per URL | 1 | Counted on submission, not on the indexing result. |
Go over the per-minute limit and the response is 429 with a Retry-After header giving the seconds to wait. Honour it instead of retrying straight away — retries inside the window keep failing.
A per-account daily submission cap can also be switched on. It is off by default; where it is on, submissions past it return 429 with a message saying so, and the window resets at midnight in the timezone configured for that cap.
Queue a batch of URLs for indexing. Returns a batch ID you can poll for status.
| Field | Type | Description |
|---|---|---|
urls | string[] | Array of absolute URLs. Max 200 per request. |
curl -X POST https://www.expressindexing.com/wp-json/indexinstantly/v1/index \ -H "Authorization: Bearer ii_live_xxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "urls": ["https://example.com/a", "https://example.com/b"] }'
{
"batch_id": "btch_8K2qA7d3",
"accepted": 2,
"blocked": 0,
"duplicates": 0,
"duplicate_urls": [],
"status": "queued",
"remaining_credits": 9798
}
A URL this account or this site has already submitted is not sent again and is not charged. It is counted in duplicates, listed in duplicate_urls, and recorded in your history with status duplicate — drop those from your own retry list rather than resending them.
Retrieve the current processing status of a previously submitted batch.
| Status | Meaning |
|---|---|
queued | Accepted and waiting in the indexing queue. |
processing | Submitted to Google; awaiting its crawl. |
indexed | Successfully submitted for indexing. |
failed | Could not be submitted (see error detail). |
duplicate | Already submitted earlier; not sent again and not charged. |
blocked | Refused by a content rule; not sent and not charged. |
Check your remaining credit balance and current plan.
The API uses conventional HTTP status codes. Errors return a JSON body with a code and message.
| Code | Meaning |
|---|---|
401 | Missing or invalid API key. |
402 | Insufficient credits. |
422 | Too many URLs (limit 200) or invalid payload. |
429 | Rate limit exceeded, or a daily cap reached. The response carries a Retry-After header with the seconds to wait. |
const res = await fetch("https://www.expressindexing.com/wp-json/indexinstantly/v1/index", { method: "POST", headers: { "Authorization": "Bearer ii_live_xxxxxxxxxxxxxxxxxxxxxxxx", "Content-Type": "application/json" }, body: JSON.stringify({ urls: ["https://example.com/page"] }) }); const data = await res.json();
import requests r = requests.post( "https://www.expressindexing.com/wp-json/indexinstantly/v1/index", headers={"Authorization": "Bearer ii_live_xxxxxxxxxxxxxxxxxxxxxxxx"}, json={"urls": ["https://example.com/page"]}, ) print(r.json())