Documentation

API documentation

Submit batches and read results from your own code, with safe retries built in.

Getting access

  1. Register, verify your email, and wait for your account to be approved.
  2. Open API access in your account and request access.
  3. An admin reviews the request. When approved, your key appears once on that page. Copy it right away.
  4. 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. 1. Get a key. Request API access in your account; your key is shown once when it is approved.
  2. 2. Check it works. Call GET /balance. A 200 with your credits means you are set.
  3. 3. Submit URLs. POST /batches with a list of URLs. One credit per URL.
Check your balance
curl https://indexingurl.com/api/v1/balance \
  -H "Authorization: Bearer YOUR_KEY"
200 OK
{
  "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.

Request
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"]}'
201 Created: delivered
{
  "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.

202 Accepted
{
  "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.

502 Bad Gateway
{
  "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.

422 Unprocessable Entity
{
  "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.

402 Payment Required
{
  "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.

Retry the exact same request
# 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"]}'
201 Created: same batch_number as the first attempt, credits charged once
{
  "batch_number": "IDX-20261022-000042",
  "status": "upstream_accepted",
  "entries_count": 2,
  "created_at": "2026-10-22T14:03:11+00:00"
}
409 Conflict: same key, different URLs
{
  "error": "idempotency_conflict",
  "message": "This idempotency key was already used with a different payload."
}

Check a batch and its results

Batch summary
curl https://indexingurl.com/api/v1/batches/IDX-20261022-000042 \
  -H "Authorization: Bearer YOUR_KEY"
200 OK
{
  "batch_number": "IDX-20261022-000042",
  "status": "completed",
  "entries_count": 2,
  "created_at": "2026-10-22T14:03:11+00:00"
}
Per-URL results (add ?page=2 for more)
curl https://indexingurl.com/api/v1/batches/IDX-20261022-000042/results \
  -H "Authorization: Bearer YOUR_KEY"
200 OK
{
  "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 }
}
List your batches
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

acceptedReceived and credits reserved, about to be handed over.
dispatchingBeing handed over right now.
upstream_acceptedDelivered. URLs are being processed.
completedAll URLs finished.
partially_failedFinished, some URLs failed (see results).
pending_reconciliationDelivery not confirmed yet. Credits stay reserved. We never resend it.
failedNot delivered. Credits returned.

URL

pendingWaiting to be handed over.
upstream_acceptedHanded over and being processed.
indexedProcessed successfully.
failedCould 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.
401 Unauthorized
{
  "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.

Request
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"]}'
200 OK
{
  "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.

Telegram WhatsApp