Integrate IndexPilot into your workflow with our REST API. Base URL: https://indexpilot.app/api/v1
All API requests require an API key. Include it in the Authorization header:
Authorization: Bearer ipk_your_api_key_hereGenerate API keys in Settings → API Keys. Keys use the ipk_ prefix. Free plan: 1 key, Pro: 3, Enterprise: 10.
/api/v1/submitSubmit one or more URLs for indexing across all configured search engines.
| Parameter | Type | Description |
|---|---|---|
urls* | string[] | Array of URLs to submit (max 100 per request) |
engines | string[] | Specific engines to use. Default: all available |
submissionName | string | Label for this batch (shown in history) |
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"
}{
"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 }
]
}| Parameter | Type | Description |
|---|---|---|
GOOGLE_INDEXING_API | Google Indexing API (requires GSC owner setup) | |
INDEXNOW_BING | IndexNow protocol — Bing | |
INDEXNOW_YANDEX | IndexNow protocol — Yandex | |
INDEXNOW_SEZNAM | IndexNow protocol — Seznam | |
INDEXNOW_NAVER | IndexNow protocol — Naver |
/api/v1/check-indexCheck if a URL is indexed in Google using the URL Inspection API.
| Parameter | Type | Description |
|---|---|---|
url* | string | The URL to check |
siteUrl | string | Site property URL (auto-derived if omitted) |
{
"url": "https://example.com/page-1",
"indexed": true,
"verdict": "PASS",
"coverageState": "Submitted and indexed",
"lastCrawlTime": "2026-03-20T10:30:00Z"
}/api/v1/balanceGet your current credit balance and plan information.
{
"credits": 48,
"plan": "FREE",
"email": "you@example.com"
}/api/v1/historyGet recent URL submissions.
| Parameter | Type | Description |
|---|---|---|
limit | number | Number of results (1-20, default: 5) |
{
"submissions": [
{
"id": "abc123",
"url": "https://example.com/page-1",
"status": "SUBMITTED",
"engines": 3,
"createdAt": "2026-03-20T10:30:00Z"
}
]
}/api/v1/sitesGet all your registered and verified sites.
{
"sites": [
{
"id": "abc123",
"domain": "example.com",
"url": "https://example.com",
"verified": true,
"urlCount": 150,
"sitemapCount": 2,
"createdAt": "2026-03-01T00:00:00Z"
}
]
}API rate limits depend on your plan:
| Plan | Requests/min | URLs/request | API Keys |
|---|---|---|---|
| Free | 10 | 10 | 1 |
| Pro | 60 | 100 | 3 |
| Enterprise | 300 | 100 | 10 |
When you exceed the rate limit, the API returns 429 Too Many Requests. Wait and retry.
All errors return a JSON body with an error field:
{ "error": "Insufficient credits" }| Status | Meaning |
|---|---|
400 | Invalid request (bad URL, missing fields) |
401 | Invalid or missing API key |
402 | Insufficient credits |
429 | Rate limit exceeded |
500 | Internal server error |
Copy-paste examples for popular languages:
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"]}'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");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']}")$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"];