PreIndex API
Submit URLs for indexing, track every link and pull reports straight from your CMS, rank tracker or scripts. Plain JSON over HTTPS, one header to authenticate.
Base URL
https://preindex.io/api/v1- Auth header
- X-API-Key
- Format
- application/json
Guides
Introduction
Submit
Create projects with up to 499 URLs per request.
Track
Poll a project for indexed, pending and failed counts.
Export
Download every URL’s status as JSON or CSV.
- 1
Create an API key
Open API access in your dashboard and create a key. It's shown once, so store it somewhere safe, such as an environment variable.
Shellexport PREINDEX_API_KEY="pi_live_..." - 2
Submit your URLs
Send a
POSTwith your URLs. The response includes aproject_idand the credits used.curl -X POST "https://preindex.io/api/v1/indexing/standard" \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "project_name": "Tier 1 Backlinks & Evergreen Blogs", "dripfeed": 3, "urls": [ "https://example.com/blog/article-1", "https://example.com/blog/article-2", "https://example.com/blog/article-3" ] }' - 3
Track progress
Poll the project to see how many URLs are indexed. Every few minutes is plenty; indexing happens over hours, not seconds.
curl -X GET "https://preindex.io/api/v1/projects/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" \ -H "X-API-Key: YOUR_API_KEY"
Authentication
X-API-Key header on every request. A standard Authorization: Bearer header works too.- Keys look like
pi_live_followed by 48 characters. - You can have up to 5 active keys and revoke any of them instantly.
- We store only a hash of each key, so a lost key can't be shown again. Create a new one instead.
- Never put keys in browser code or public repositories; call the API from your server.
X-API-Key: pi_live_YOUR_API_KEY
# or
Authorization: Bearer pi_live_YOUR_API_KEYCredits & speeds
- Reaches Google in about 2 minutes
- Paid plans only (403 on free)
- Non-refundable
- 12–24 hour indexing window
- Optional drip feed over 1–30 days
- 100% refund on unindexed URLs
Rate limits
429; wait a minute and retry.- Requests
- 120 / minute
- per API key
- URLs per request
- 499
- split larger batches
- Active keys
- 5
- per account
- Drip feed
- 1–30 days
- standard only
Errors
error code and a human-readable message.| Status | Error code & meaning |
|---|---|
| 400 | invalid_jsonThe request body is not valid JSON. |
| 400 | missing_urlsNo URLs were provided in the urls field. |
| 400 | invalid_url_formatOne or more URLs don’t start with http:// or https://. |
| 400 | batch_limit_exceededMore than 499 URLs in one request. Split it into several. |
| 400 | invalid_project_idThe project ID isn’t a valid UUID. |
| 400 | invalid_idempotency_keyThe Idempotency-Key header isn’t 1–255 visible ASCII characters. |
| 401 | unauthorizedNo API key was sent. |
| 401 | invalid_key_formatThe key isn’t in the pi_live_… format. |
| 401 | invalid_api_keyThe key doesn’t exist. |
| 401 | revoked_api_keyThe key was revoked. Create a new one. |
| 402 | insufficient_creditsNot enough credits for this many URLs at this speed. |
| 403 | paid_plan_requiredInstant indexing needs a paid plan. Use standard or buy a pack. |
| 404 | project_not_foundNo project with that ID exists on your account. |
| 409 | idempotency_key_reusedThat Idempotency-Key was already used for a different request. Use a new key. |
| 429 | rate_limit_exceededMore than 120 requests in a minute for this key. Back off and retry. |
| 500 | server_errorSomething failed on our side. Wait a moment and retry. |
| 502 | dispatch_failedThe indexing network rejected these URLs. All credits were refunded. |
| 503 | service_unavailableSubmissions are briefly paused. Nothing was charged. Retry after a few minutes. |
{
"success": false,
"error": "insufficient_credits",
"message": "Insufficient credits. You need 6 credits for 3 URLs (2 credits/URL), but only have 4 available."
}Successful submissions return 201 with status Submitted. If the indexing network is briefly busy you get 202 with status Pending: the project is queued and sent automatically, and refunded in full if it can't be sent. Reads return 200. Every response includes a boolean success field.
Submit URLs for instant indexing
/api/v1/indexing/instantPush URLs to Google with maximum priority — most are crawled in about 2 minutes. Available on paid plans. Instant submissions are non-refundable.
2 credits / URLParameters
urlsstring[] | stringbodyRequiredUp to 499 URLs, as an array or one string separated by commas or new lines. Each must start with http:// or https://.
project_namestringbodyA label for the project, up to 200 characters. Defaults to the speed, date and URL count.
Idempotency-KeystringheaderRecommended. A unique value (a UUID works well) for each new submission. If a request times out, send it again with the same key: you get the first result back and are never charged twice. Reusing a key for a different request returns 409.
curl -X POST "https://preindex.io/api/v1/indexing/instant" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_name": "Breaking News & Product Launches",
"urls": [
"https://example.com/breaking-news-page",
"https://example.com/new-product-launch"
]
}'{
"success": true,
"project_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"project_name": "Breaking News & Product Launches",
"service": "instant",
"speed_tier": "Instant (~2 Min)",
"target_window": "under 2 minutes",
"dripfeed_days": 0,
"urls_count": 2,
"credits_deducted": 4,
"credits_per_url": 2,
"credits_remaining": 1236,
"status": "Submitted",
"message": "URLs dispatched directly to high-priority indexing engine."
}Submit URLs for standard indexing
/api/v1/indexing/standardNatural discovery over a 12–24 hour window, with optional drip feed (1–30 days). Credits for URLs that aren't indexed are refunded in full, automatically.
1 credit / URLParameters
urlsstring[] | stringbodyRequiredUp to 499 URLs, as an array or one string separated by commas or new lines. Each must start with http:// or https://.
project_namestringbodyA label for the project, up to 200 characters. Defaults to the speed, date and URL count.
dripfeedintegerbodyStandard only. Spread submission across 1–30 days. Defaults to 1.
Idempotency-KeystringheaderRecommended. A unique value (a UUID works well) for each new submission. If a request times out, send it again with the same key: you get the first result back and are never charged twice. Reusing a key for a different request returns 409.
curl -X POST "https://preindex.io/api/v1/indexing/standard" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_name": "Tier 1 Backlinks & Evergreen Blogs",
"dripfeed": 3,
"urls": [
"https://example.com/blog/article-1",
"https://example.com/blog/article-2",
"https://example.com/blog/article-3"
]
}'{
"success": true,
"project_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"project_name": "Tier 1 Backlinks & Evergreen Blogs",
"service": "standard",
"speed_tier": "Standard (12–24 Hrs)",
"target_window": "12 to 24 hours",
"dripfeed_days": 3,
"urls_count": 3,
"credits_deducted": 3,
"credits_per_url": 1,
"credits_remaining": 1237,
"status": "Submitted",
"message": "URLs submitted to standard indexing network with natural discovery."
}Create a project with any speed
/api/v1/projectsOne endpoint for both speeds. Set "service" to "standard" (1 credit/URL) or "instant" (2 credits/URL), and optionally "dripfeed" days for Standard. If "service" is left out, the request is treated as instant.
1–2 credits / URLParameters
urlsstring[] | stringbodyRequiredUp to 499 URLs, as an array or one string separated by commas or new lines. Each must start with http:// or https://.
service"standard" | "instant"bodySpeed to use. If omitted the request is treated as instant, so always set it explicitly.
project_namestringbodyA label for the project, up to 200 characters. Defaults to the speed, date and URL count.
dripfeedintegerbodyStandard only. Spread submission across 1–30 days. Defaults to 1.
Idempotency-KeystringheaderRecommended. A unique value (a UUID works well) for each new submission. If a request times out, send it again with the same key: you get the first result back and are never charged twice. Reusing a key for a different request returns 409.
curl -X POST "https://preindex.io/api/v1/projects" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_name": "E-Commerce Category URLs",
"service": "instant",
"urls": [
"https://example.com/category/shoes",
"https://example.com/category/shirts",
"https://example.com/blog/new-arrivals"
]
}'{
"success": true,
"project_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"project_name": "E-Commerce Category URLs",
"service": "instant",
"speed_tier": "Instant (~2 Min)",
"urls_count": 3,
"credits_deducted": 6,
"credits_per_url": 2,
"credits_remaining": 1234,
"status": "Submitted",
"message": "URLs dispatched directly to high-priority indexing engine."
}List your projects
/api/v1/projects?page=1&limit=20A paginated list of your indexing projects with their progress and status.
Free, no credits usedParameters
pageintegerqueryPage number, starting at 1. Defaults to 1.
limitintegerqueryProjects per page, 1–100. Defaults to 20.
curl -X GET "https://preindex.io/api/v1/projects?page=1&limit=20" \
-H "X-API-Key: YOUR_API_KEY"{
"success": true,
"total": 35,
"page": 1,
"limit": 20,
"projects": [
{
"id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"name": "E-Commerce Category URLs",
"status": "Completed",
"total_urls": 100,
"processed_urls": 100,
"created_at": "2026-11-02T12:00:00Z"
}
]
}Get a project's progress
/api/v1/projects/{project_id}Live progress for one project: indexed, pending and failed counts plus the overall indexing rate.
Free, no credits usedParameters
project_iduuidpathRequiredThe project_id returned when the project was created.
curl -X GET "https://preindex.io/api/v1/projects/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" \
-H "X-API-Key: YOUR_API_KEY"{
"success": true,
"project": {
"id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"name": "E-Commerce Category URLs",
"status": "Completed",
"total_urls": 100,
"indexed_urls": 94,
"pending_urls": 0,
"processing_urls": 0,
"failed_urls": 6,
"indexing_rate": "94%",
"created_at": "2026-11-02T12:00:00Z",
"updated_at": "2026-11-02T14:30:00Z"
}
}Export a project report
/api/v1/projects/{project_id}/reportEvery submitted URL with its indexing status, as JSON or a downloadable CSV (format=csv).
Free, no credits usedParameters
project_iduuidpathRequiredThe project_id returned when the project was created.
format"json" | "csv"queryResponse format. Defaults to json; csv returns a downloadable file.
# JSON report
curl -X GET "https://preindex.io/api/v1/projects/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d/report?format=json" \
-H "X-API-Key: YOUR_API_KEY"
# Or download as CSV
curl -X GET "https://preindex.io/api/v1/projects/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d/report?format=csv" \
-H "X-API-Key: YOUR_API_KEY" \
-o preindex-report.csv{
"success": true,
"project_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"project_name": "E-Commerce Category URLs",
"status": "Completed",
"total_urls": 2,
"urls": [
{
"url": "https://example.com/category/shoes",
"status": "Indexed",
"submitted_at": "2026-11-02T12:00:00Z",
"updated_at": "2026-11-02T14:30:00Z"
},
{
"url": "https://example.com/category/shirts",
"status": "Indexed",
"submitted_at": "2026-11-02T12:00:00Z",
"updated_at": "2026-11-02T14:30:00Z"
}
]
}Check your credit balance
/api/v1/credits/balanceYour available credits and current plan.
Free, no credits usedParameters
This endpoint takes no parameters.
curl -X GET "https://preindex.io/api/v1/credits/balance" \
-H "X-API-Key: YOUR_API_KEY"{
"success": true,
"credits": 1240,
"plan": "Growth"
}Ready to automate indexing?
Create a key in seconds and send your first batch. Questions about an integration? Our team can help.