Documentation
API documentation
Submit batches and read results from your own code, with safe retries built in.
Getting access
- Register, verify your email, and wait for your account to be approved.
- Open API access in your account and request access.
- An admin reviews the request. When approved, your key appears once on that page. Copy it right away.
- To rotate a key, use "Rotate key" on the same page (your password is needed; no approval is required). The old key stops working the moment the new one is issued.
Quick start
- 1. Get a key. Request API access in your account; your key is shown once when it is approved.
- 2. Check it works. Call
GET /balance. A 200 with your credits means you are set. - 3. Submit URLs.
POST /batcheswith a list of URLs. One credit per URL.
curl https://indexingurl.com/api/v1/balance \
-H "Authorization: Bearer YOUR_KEY"
{
"credit_balance": 1500
}
Basics
- Base URL
https://indexingurl.com/api/v1- Auth
Authorization: Bearer YOUR_KEY- Format
- JSON in, JSON out
- Rate limit
- 60 requests per minute per account (429 when exceeded)
- URLs
- http or https, up to 2,048 characters each
- Batch size
- 1 to 1,000 URLs per request (your own limit may be lower)
- Cost
- 1 credit per URL, duplicates included
- Keys
- One key per account; rotate it any time from your API page
Endpoints
| GET | /balance |
Your credit balance. |
| POST | /batches |
Submit 1 to 1,000 URLs. Reserves 1 credit per URL. |
| GET | /batches |
List your batches, newest first (25 per page). |
| GET | /batches/{batch_number} |
One batch summary. |
| GET | /batches/{batch_number}/results |
Per-URL status (200 per page). |
| POST | /submit |
Simple submit, compatible with the previous IndexingURL API. See the last section. |
Submit a batch
Send the URLs you want indexed. Credits are reserved when the batch is accepted and the batch is handed over straight away, so the response already tells you how delivery went.
curl -X POST https://indexingurl.com/api/v1/batches \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-2026-10-22-001" \
-d '{"urls": ["https://example.com/a", "https://example.com/b"]}'
{
"batch_number": "IDX-20261022-000042",
"status": "upstream_accepted",
"entries_count": 2,
"created_at": "2026-10-22T14:03:11+00:00"
}
Other outcomes you should handle
202 Accepted: delivery is not confirmed yet. Your credits stay reserved while we check. Do not resubmit. Poll the batch instead.
{
"batch_number": "IDX-20261022-000043",
"status": "pending_reconciliation",
"entries_count": 2,
"created_at": "2026-10-22T14:05:40+00:00"
}
502 Bad Gateway: the batch could not be delivered and your credits were returned. Safe to submit again.
{
"error": "delivery_failed",
"message": "The batch could not be delivered. Your credits were returned; you can submit it again.",
"batch_number": "IDX-20261022-000044",
"status": "failed",
"entries_count": 2,
"created_at": "2026-10-22T14:07:02+00:00"
}
422 Unprocessable: nothing was charged. Fix the listed entries.
{
"error": "invalid_urls",
"message": "One or more entries are not valid http(s) URLs.",
"invalid": ["example.com/no-scheme", "ftp://example.com/file"]
}
402 Payment Required: not enough credits. Nothing was queued.
{
"error": "insufficient_credits",
"message": "Insufficient credits: available 1, requested 2.",
"available": 1,
"requested": 2
}
Retrying safely with Idempotency-Key
If a request times out you cannot know whether it arrived. Send the same Idempotency-Key (up to 150 characters) again:
you get the original batch back and nothing is charged twice. The same key with a different URL list is rejected with 409.
# First attempt: times out. Run it again with the same key and the same URLs.
curl -X POST https://indexingurl.com/api/v1/batches \
-H "Authorization: Bearer YOUR_KEY" \
-H "Idempotency-Key: order-2026-10-22-001" \
-d '{"urls": ["https://example.com/a", "https://example.com/b"]}'
{
"batch_number": "IDX-20261022-000042",
"status": "upstream_accepted",
"entries_count": 2,
"created_at": "2026-10-22T14:03:11+00:00"
}
{
"error": "idempotency_conflict",
"message": "This idempotency key was already used with a different payload."
}
Check a batch and its results
curl https://indexingurl.com/api/v1/batches/IDX-20261022-000042 \
-H "Authorization: Bearer YOUR_KEY"
{
"batch_number": "IDX-20261022-000042",
"status": "completed",
"entries_count": 2,
"created_at": "2026-10-22T14:03:11+00:00"
}
curl https://indexingurl.com/api/v1/batches/IDX-20261022-000042/results \
-H "Authorization: Bearer YOUR_KEY"
{
"data": [
{ "url": "https://example.com/a", "status": "indexed", "result_message": null },
{ "url": "https://example.com/b", "status": "pending", "result_message": null }
],
"meta": { "current_page": 1, "last_page": 1, "total": 2 }
}
curl "https://indexingurl.com/api/v1/batches?page=1" \
-H "Authorization: Bearer YOUR_KEY"
Poll no more than about once a minute; most batches settle within minutes.
Statuses
Batch
accepted | Received and credits reserved, about to be handed over. |
dispatching | Being handed over right now. |
upstream_accepted | Delivered. URLs are being processed. |
completed | All URLs finished. |
partially_failed | Finished, some URLs failed (see results). |
pending_reconciliation | Delivery not confirmed yet. Credits stay reserved. We never resend it. |
failed | Not delivered. Credits returned. |
URL
pending | Waiting to be handed over. |
upstream_accepted | Handed over and being processed. |
indexed | Processed successfully. |
failed | Could not be processed. See result_message. |
Errors
| 401 | Missing or invalid API key. |
| 402 | Not enough credits for the requested URLs. |
| 403 | Email not verified, account pending or suspended, or API access not enabled. |
| 404 | Batch not found (or it belongs to another account). |
| 409 | Idempotency-Key reused with a different URL list. |
| 422 | Invalid URLs, or batch size outside 1 to 1,000. |
| 429 | Too many requests. Wait a moment and retry. |
| 502 | Batch could not be delivered. Credits were returned. |
{
"success": false,
"message": "Invalid API key."
}
Errors are JSON with a message, and an error code on batch endpoints (for example insufficient_credits). A 5xx other than 502 is on our side: retry with the same Idempotency-Key.
Good practice
-
Always send an
Idempotency-Key, generated once per batch and reused on every retry. -
On a 202, never submit the same URLs again. Poll
GET /batches/{batch_number}until the status settles. - Remove duplicates before sending: every entry costs a credit.
- Keep the key out of public code and chat. If it leaks, rotate it on your API page; the old key stops working at once.
Compatible with the previous IndexingURL API
Tools written for the old site keep working: POST /submit takes {"urls": [...]}, ignores invalid entries and repeats,
and returns how many credits remain. It uses the same key and the same credits as everything above. You only need a new key.
curl -X POST https://indexingurl.com/api/v1/submit \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com/page-1", "https://example.com/page-2"]}'
{
"success": true,
"message": "URLs submitted successfully",
"submitted": 2,
"urlsProcessed": 2,
"requestId": "IDX-20261022-000045",
"apiLimit": 1500,
"apiUsed": 2,
"remaining": 1498
}
remaining is your credit balance. Not enough credits gives 429 with success: false and the same fields. Delivery follows the same
rules as /batches: 202 when not confirmed yet (do not resubmit), 502 when it failed and the credits came back.