API
Scan, submit and track URLs from your own tools
The API does everything the dashboard does, with the same checks and the same credit rules. Every account has an API key on its profile page.
Authentication
Send your API key in the x-api-key header. Keep it secret: anyone who has it can use your credits. You can generate a new key from your profile at any time.
https://api.storewike.storeEndpoints
| Method | Path | What it does |
|---|---|---|
| POST | /api/urls/preflight | Scan up to 100 URLs for indexing blockers. Streams progress as Server-Sent Events. |
| POST | /api/urls/submit | Submit one URL. |
| POST | /api/urls/submit/bulk | Submit up to 50 URLs. Streams one result per URL as Server-Sent Events. |
| GET | /api/urls/jobs | List your jobs. Filter with ?status=INDEXED; paginate with page and limit. |
| GET | /api/urls/status/:jobId | Get one job and its latest Search Console check. |
| POST | /api/urls/status/:jobId/refresh | Run a live Search Console check for one job now. |
Submit a URL
curl -X POST https://api.storewike.store/api/urls/submit \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/blog/my-post"}'{
"success": true,
"jobId": "6540f3c2a1b2c3d4e5f60718",
"status": "QUEUED",
"message": "URL submitted. Indexing started."
}If Search Console already shows the page as indexed, the response is 200 with alreadyIndexed: true and no credit is charged.
Check a job
curl https://api.storewike.store/api/urls/status/6540f3c2a1b2c3d4e5f60718 \
-H "x-api-key: YOUR_API_KEY"{
"success": true,
"job": {
"id": "6540f3c2a1b2c3d4e5f60718",
"originalUrl": "https://example.com/blog/my-post",
"status": "WAITING_CRAWL",
"retryCount": 0,
"latestCheck": { "status": "NOT_FOUND", "source": "GSC_API" }
}
}Poll this endpoint, or the job list, until the status is INDEXED or FAILED. Checks run on a schedule, so polling more than every few minutes brings nothing new.
Bulk submit and scan
/api/urls/preflight and /api/urls/submit/bulk take a JSON body with a urls array and answer with a Server-Sent Events stream: a start event, one result event per URL as soon as it is ready, and a final done event with the totals. Read the stream with fetch, not EventSource, because you need to send a POST body and a header.
Job statuses
| Status | Meaning |
|---|---|
| PENDING | The job was created and is about to be queued. |
| QUEUED | Waiting in the queue for its turn. |
| WRAPPER_CREATED | Prepared and about to be sent to Google. |
| WAITING_CRAWL | Sent to Google. Waiting for it to crawl and index the page. |
| CRAWLED_NOT_INDEXED | Google crawled the page but has not indexed it (yet). |
| RETRYING | Being submitted again. |
| INDEXED | Search Console confirms the page is indexed. The credit is used. |
| FAILED | Not indexed after the retries, or rejected. The credit is refunded. |
Errors
| HTTP status | Meaning |
|---|---|
| 400 | The request was invalid or cannot be accepted: a missing url, no credits left, the daily limit reached, or no Search Console access (code: "NO_SEARCH_CONSOLE"). |
| 401 | The API key is missing or wrong. |
| 422 | The pre-flight scan found a blocker such as a 404 or a noindex tag (code: "PREFLIGHT_BLOCKED"). The issues list says what. |
| 429 | Too many requests. Wait and try again. |
Every error response has success: false and a human-readable message.