API overview
One endpoint, one auth method, one request body. The whole API surface for submitting URLs is small by design — every additional knob is a chance for error in your publish pipeline.
| Field | Value |
|---|---|
| Base URL | https://instanturlindexer.com |
| Submit endpoint | POST /api/indexing/submit |
| History endpoint | GET /api/indexing/history |
| Auth header | Authorization: Bearer iui_<48-hex> |
| Content-Type | application/json |
| URLs per request | 1–500 |
| Rate limit | Plan-based (Starter 80/day, Enterprise 4000/day) |
Authentication
Every authenticated endpoint accepts either a cookie session or a Bearer API key. For programmatic use, always use the API key.
- Sign in to the dashboard.
- Go to Profile → API Access.
- Click Generate API Key. The key is shown once — copy it immediately.
- Store the key in your secrets manager (env var, vault, or equivalent). Never commit it to source control.
Submitting URLs (cURL)
curl -X POST https://instanturlindexer.com/api/indexing/submit \
-H "Authorization: Bearer iui_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://yoursite.com/blog/post-1",
"https://yoursite.com/blog/post-2"
]
}'Response (immediate, before indexing completes):
{
"ok": true,
"submissionId": "iui_sub_4f8a2c91...",
"queued": 2,
"invalid": 0,
"creditsCharged": 2,
"creditsRemaining": 78
}Submitting URLs (Node.js)
import fetch from "node-fetch";
async function submitUrls(urls) {
const res = await fetch(
"https://instanturlindexer.com/api/indexing/submit",
{
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.IUI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ urls }),
}
);
if (!res.ok) throw new Error(`Submit failed: ${res.status}`);
return res.json();
}
const result = await submitUrls([
"https://yoursite.com/blog/post-1",
"https://yoursite.com/blog/post-2",
]);
console.log("Queued:", result.queued, "Credits left:", result.creditsRemaining);Submitting URLs (Python)
import os
import requests
def submit_urls(urls):
res = requests.post(
"https://instanturlindexer.com/api/indexing/submit",
headers={
"Authorization": f"Bearer {os.environ['IUI_API_KEY']}",
"Content-Type": "application/json",
},
json={"urls": urls},
timeout=10,
)
res.raise_for_status()
return res.json()
result = submit_urls([
"https://yoursite.com/blog/post-1",
"https://yoursite.com/blog/post-2",
])
print("Queued:", result["queued"], "Credits left:", result["creditsRemaining"])Checking submission history
Submission records persist for 48 hours. Query the history endpoint to see per-URL outcomes:
curl https://instanturlindexer.com/api/indexing/history?limit=50 \
-H "Authorization: Bearer iui_YOUR_KEY"Each record includes the URL, status (submitted/indexed/failed), trackingId once assigned, timestamps, and the sanitised failure reason if applicable.
Error handling
| Status | Cause | Action |
|---|---|---|
| 400 | Malformed JSON or > 500 URLs | Validate input; split batches |
| 401 | Missing or invalid API key | Check Authorization header |
| 403 | Plan does not allow API access | Upgrade plan (all plans support API in 2026) |
| 402 | Insufficient credits | Top up credits or wait for next plan cycle |
| 429 | Rate limit exceeded | Back off and retry with exponential delay |
| 500/502/503 | Upstream issue | Retry with backoff; URLs auto-queue on our side |
Best practices
- Submit on publish, not on every save. Hook the API into your CMS's publish event, not the autosave loop.
- Batch where you can. 500 URLs in one request is cheaper and faster than 500 sequential 1-URL requests.
- Don't submit URLs that fail indexability checks. A noindex'd page being submitted burns credits with no chance of indexing.
- Track outcomes. Use the history endpoint to verify your submissions actually indexed, not just submitted.
- Rotate keys on team changes. When someone leaves the team, rotate the API key.
Example: CMS publish hook
// In your CMS's "post-published" hook
async function onPostPublished(post) {
await submitUrls([
`https://yoursite.com/${post.slug}`,
]);
}
// Or with related URLs (sitemap, category page)
async function onMajorContentChange(post) {
await submitUrls([
`https://yoursite.com/${post.slug}`,
`https://yoursite.com/category/${post.category}`,
`https://yoursite.com/sitemap.xml`,
]);
}Where to start
Sign up, grab an API key from the dashboard, and integrate the POST into your publish pipeline. The Starter plan ($5 / 80 URLs) is enough to prove the workflow end to end before committing to higher tiers.