REST API · v1

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

The API gives you everything the dashboard does: create indexing projects at either speed, follow their progress and export per-URL results. Every request and response is JSON, and all requests are made over HTTPS.

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.

Quickstart

From zero to your first indexed URLs in three steps.
  1. 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.

    Shell
    export PREINDEX_API_KEY="pi_live_..."
  2. 2

    Submit your URLs

    Send a POST with your URLs. The response includes a project_id and 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. 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

Send your key in the 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.
Headers
X-API-Key: pi_live_YOUR_API_KEY

# or
Authorization: Bearer pi_live_YOUR_API_KEY

Credits & speeds

API submissions use the same credits as the dashboard. Credits are deducted when a project is created, and the response tells you how many remain.
Instant2 credits / URL
  • Reaches Google in about 2 minutes
  • Paid plans only (403 on free)
  • Non-refundable
Standard1 credit / URL
  • 12–24 hour indexing window
  • Optional drip feed over 1–30 days
  • 100% refund on unindexed URLs

Rate limits

Limits keep the network fast for everyone. If you exceed the request rate you'll get a 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

Failed requests return an HTTP error status and a JSON body with a machine-readable error code and a human-readable message.
StatusError code & meaning
400invalid_json

The request body is not valid JSON.

400missing_urls

No URLs were provided in the urls field.

400invalid_url_format

One or more URLs don’t start with http:// or https://.

400batch_limit_exceeded

More than 499 URLs in one request. Split it into several.

400invalid_project_id

The project ID isn’t a valid UUID.

400invalid_idempotency_key

The Idempotency-Key header isn’t 1–255 visible ASCII characters.

401unauthorized

No API key was sent.

401invalid_key_format

The key isn’t in the pi_live_… format.

401invalid_api_key

The key doesn’t exist.

401revoked_api_key

The key was revoked. Create a new one.

402insufficient_credits

Not enough credits for this many URLs at this speed.

403paid_plan_required

Instant indexing needs a paid plan. Use standard or buy a pack.

404project_not_found

No project with that ID exists on your account.

409idempotency_key_reused

That Idempotency-Key was already used for a different request. Use a new key.

429rate_limit_exceeded

More than 120 requests in a minute for this key. Back off and retry.

500server_error

Something failed on our side. Wait a moment and retry.

502dispatch_failed

The indexing network rejected these URLs. All credits were refunded.

503service_unavailable

Submissions are briefly paused. Nothing was charged. Retry after a few minutes.

Error response
{
  "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.

Indexing

Submit URLs for instant indexing

POST/api/v1/indexing/instant

Push URLs to Google with maximum priority — most are crawled in about 2 minutes. Available on paid plans. Instant submissions are non-refundable.

2 credits / URL

Parameters

  • urlsstring[] | stringbodyRequired

    Up to 499 URLs, as an array or one string separated by commas or new lines. Each must start with http:// or https://.

  • project_namestringbody

    A label for the project, up to 200 characters. Defaults to the speed, date and URL count.

  • Idempotency-Keystringheader

    Recommended. 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"
    ]
  }'
Response · 201
{
  "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

POST/api/v1/indexing/standard

Natural 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 / URL

Parameters

  • urlsstring[] | stringbodyRequired

    Up to 499 URLs, as an array or one string separated by commas or new lines. Each must start with http:// or https://.

  • project_namestringbody

    A label for the project, up to 200 characters. Defaults to the speed, date and URL count.

  • dripfeedintegerbody

    Standard only. Spread submission across 1–30 days. Defaults to 1.

  • Idempotency-Keystringheader

    Recommended. 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"
    ]
  }'
Response · 201
{
  "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

POST/api/v1/projects

One 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 / URL

Parameters

  • urlsstring[] | stringbodyRequired

    Up 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"body

    Speed to use. If omitted the request is treated as instant, so always set it explicitly.

  • project_namestringbody

    A label for the project, up to 200 characters. Defaults to the speed, date and URL count.

  • dripfeedintegerbody

    Standard only. Spread submission across 1–30 days. Defaults to 1.

  • Idempotency-Keystringheader

    Recommended. 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"
    ]
  }'
Response · 201
{
  "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."
}
Projects

List your projects

GET/api/v1/projects?page=1&limit=20

A paginated list of your indexing projects with their progress and status.

Free, no credits used

Parameters

  • pageintegerquery

    Page number, starting at 1. Defaults to 1.

  • limitintegerquery

    Projects 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"
Response · 200
{
  "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

GET/api/v1/projects/{project_id}

Live progress for one project: indexed, pending and failed counts plus the overall indexing rate.

Free, no credits used

Parameters

  • project_iduuidpathRequired

    The 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"
Response · 200
{
  "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

GET/api/v1/projects/{project_id}/report

Every submitted URL with its indexing status, as JSON or a downloadable CSV (format=csv).

Free, no credits used

Parameters

  • project_iduuidpathRequired

    The project_id returned when the project was created.

  • format"json" | "csv"query

    Response 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
Response · 200
{
  "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"
    }
  ]
}
Account

Check your credit balance

GET/api/v1/credits/balance

Your available credits and current plan.

Free, no credits used

Parameters

This endpoint takes no parameters.

curl -X GET "https://preindex.io/api/v1/credits/balance" \
  -H "X-API-Key: YOUR_API_KEY"
Response · 200
{
  "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.