API
Create checks and read verdicts from your own system. Same credits, same verdicts, same endpoints the app uses — there is no separate API to fall out of step.
Base URL https://api.indexaction.com/api/v1
Authentication
Create a key in your account under API, then send it as a bearer-style header. The key is shown once at creation — only a hash is stored, so it cannot be recovered afterwards. Rate limits apply per key, so one integration can never starve another.
Authorization: Api-Key ia_live_xxxxxxxxxxxxxxxx Create a check
Duplicates and invalid lines are removed before anything is charged, and the response tells you
what was dropped. Send an Idempotency-Key and a retried
request resolves to the same check instead of charging twice.
curl https://api.indexaction.com/api/v1/checks/ \
-H "Authorization: Api-Key YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"urls": [
"https://example.com/page-1",
"https://example.com/page-2"
],
"name": "June batch"
}' Returns 201 with the check, initially queued:
{
"id": "55c79216-28fd-4c54-b813-14bb210d6fae",
"status": "queued",
"total_count": 2,
"processed_count": 0,
"credits_used": "2.00",
"input_report": { "submitted": 2, "accepted": 2, "duplicates": 0, "invalid": 0 },
"results": []
} Read the results
Poll until status is
succeeded,
failed or
canceled. Partial results are available while it runs, so
you can stream progress. A second or two between polls is plenty.
{
"status": "succeeded",
"total_count": 2,
"indexed_count": 1,
"not_indexed_count": 1,
"error_count": 0,
"indexed_pct": 50.0,
"credits_used": "2.00",
"credits_refunded": "0.00",
"results": [
{ "url": "https://example.com/page-1", "status": "indexed",
"note": "Found in Google",
"matches": [{ "link": "https://example.com/page-1", "title": "Page 1" }] },
{ "url": "https://example.com/page-2", "status": "not_indexed",
"note": "Google returned no result", "matches": [] }
]
} Verdicts
Three values, and the third one matters. Most tools collapse a failed check into “not indexed”, which sends you chasing a problem that may not exist.
indexed Google returned the page — at the exact URL, or the same page under its canonical URL.
not_indexed Google returned no result in any query form we try. Established by an individual query, not inferred.
error We could not determine it — a timeout or an upstream failure. Treat as unknown, never as missing. This credit is refunded.
indexed_pct excludes errors from its denominator: a run
where half the checks failed should not report a halved index rate.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /checks/ | Create a check. Up to 1,000 URLs. |
| GET | /checks/{id}/ | Status, counts, and per-URL verdicts. |
| GET | /checks/ | Paginated history. Filter by status, project, date. |
| POST | /checks/{id}/cancel/ | Stop a running check; unchecked URLs are refunded. |
| POST | /checks/{id}/rerun/ | Re-run the same URL list. |
| GET | /checks/{id}/diff/ | Newly indexed and dropped-out URLs vs the previous check. |
| GET | /checks/{id}/export/ | Download CSV or XLSX. ?format=csv|xlsx&verdict=… |
| GET | /projects/ | Saved URL lists. Full CRUD. |
| GET | /dashboard/ | Balance and aggregate totals. |
Errors
Every error carries a stable machine-readable code, so
you never have to match on human-readable text.
{ "code": "insufficient_credits",
"detail": "You do not have enough credits for this check.",
"required": "1000.00", "balance": "240.00", "shortfall": "760.00" } 402 insufficient_credits— top up and retry.409 active_run_limit— wait for a check to finish.503 provider_unavailable— nothing was charged; retry shortly.400 validation_error— seeerrorsfor field detail.401 authentication_failed— the key is wrong or revoked.429 throttled— slow down; limits are per key.
An OpenAPI schema is served at
https://api.indexaction.com/api/schema/, with a
browsable reference at /api/docs/.