API Documentation

Integrate IndexPilot into your workflow with our REST API. Base URL: https://indexpilot.app/api/v1

Authentication

All API requests require an API key. Include it in the Authorization header:

Authorization: Bearer ipk_your_api_key_here

Generate API keys in Settings → API Keys. Keys use the ipk_ prefix. Free plan: 1 key, Pro: 3, Enterprise: 10.

Submit URLs for Indexing

POST/api/v1/submit

Submit one or more URLs for indexing across all configured search engines.

Request Body

ParameterTypeDescription
urls*string[]Array of URLs to submit (max 100 per request)
enginesstring[]Specific engines to use. Default: all available
submissionNamestringLabel for this batch (shown in history)

Example Request

POST /api/v1/submit
Content-Type: application/json
Authorization: Bearer ipk_your_api_key

{
  "urls": [
    "https://example.com/page-1",
    "https://example.com/page-2"
  ],
  "submissionName": "New blog posts"
}

Response

{
  "submitted": 2,
  "failed": 0,
  "invalidUrls": [],
  "creditsUsed": 2,
  "creditsRemaining": 48,
  "enginesUsed": ["GOOGLE_INDEXING_API", "INDEXNOW"],
  "results": [
    { "url": "https://example.com/page-1", "success": true, "jobCount": 3 },
    { "url": "https://example.com/page-2", "success": true, "jobCount": 3 }
  ]
}

Available Engines

ParameterTypeDescription
GOOGLE_INDEXING_APIGoogle Indexing API (requires GSC owner setup)
INDEXNOW_BINGIndexNow protocol — Bing
INDEXNOW_YANDEXIndexNow protocol — Yandex
INDEXNOW_SEZNAMIndexNow protocol — Seznam
INDEXNOW_NAVERIndexNow protocol — Naver

Check Index Status

POST/api/v1/check-index

Check if a URL is indexed in Google using the URL Inspection API.

Request Body

ParameterTypeDescription
url*stringThe URL to check
siteUrlstringSite property URL (auto-derived if omitted)

Response

{
  "url": "https://example.com/page-1",
  "indexed": true,
  "verdict": "PASS",
  "coverageState": "Submitted and indexed",
  "lastCrawlTime": "2026-03-20T10:30:00Z"
}

Credit Balance

GET/api/v1/balance

Get your current credit balance and plan information.

Response

{
  "credits": 48,
  "plan": "FREE",
  "email": "you@example.com"
}

Submission History

GET/api/v1/history

Get recent URL submissions.

Query Parameters

ParameterTypeDescription
limitnumberNumber of results (1-20, default: 5)

Response

{
  "submissions": [
    {
      "id": "abc123",
      "url": "https://example.com/page-1",
      "status": "SUBMITTED",
      "engines": 3,
      "createdAt": "2026-03-20T10:30:00Z"
    }
  ]
}

List Sites

GET/api/v1/sites

Get all your registered and verified sites.

Response

{
  "sites": [
    {
      "id": "abc123",
      "domain": "example.com",
      "url": "https://example.com",
      "verified": true,
      "urlCount": 150,
      "sitemapCount": 2,
      "createdAt": "2026-03-01T00:00:00Z"
    }
  ]
}

Rate Limits

API rate limits depend on your plan:

PlanRequests/minURLs/requestAPI Keys
Free10101
Pro601003
Enterprise30010010

When you exceed the rate limit, the API returns 429 Too Many Requests. Wait and retry.

Error Codes

All errors return a JSON body with an error field:

{ "error": "Insufficient credits" }
StatusMeaning
400Invalid request (bad URL, missing fields)
401Invalid or missing API key
402Insufficient credits
429Rate limit exceeded
500Internal server error

Quick Start Examples

Copy-paste examples for popular languages:

cURL

curl -X POST https://indexpilot.app/api/v1/submit \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ipk_your_api_key" \
  -d '{"urls": ["https://example.com/new-page"]}'

JavaScript / Node.js

const res = await fetch("https://indexpilot.app/api/v1/submit", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer ipk_your_api_key",
  },
  body: JSON.stringify({
    urls: ["https://example.com/new-page"],
  }),
});

const data = await res.json();
console.log(data.submitted, "URLs submitted,", data.creditsRemaining, "credits left");

Python

import requests

res = requests.post(
    "https://indexpilot.app/api/v1/submit",
    headers={
        "Authorization": "Bearer ipk_your_api_key",
    },
    json={
        "urls": ["https://example.com/new-page"],
    },
)

data = res.json()
print(f"Submitted: {data['submitted']}, Credits: {data['creditsRemaining']}")

PHP

$ch = curl_init("https://indexpilot.app/api/v1/submit");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json",
        "Authorization: Bearer ipk_your_api_key",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "urls" => ["https://example.com/new-page"],
    ]),
]);

$response = curl_exec($ch);
$data = json_decode($response, true);
echo "Submitted: " . $data["submitted"];