Batch Scanning API
Growth — The batch API lets you submit up to 500 URLs in a single request. URLs are processed asynchronously and you can poll for progress or listen for a webhook notification when the batch completes.
POST /api/v1/batch/scan
Submit a batch of URLs for scanning. Returns immediately with a batch ID and 202 Accepted status.
curl -X POST https://zeodyn.com/api/v1/batch/scan \
-H "Authorization: Bearer zd_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://example.com",
"https://shop.example.com",
"https://blog.example.com"
],
"label": "Monthly check"
}'| Field | Type | Required | Description |
|---|---|---|---|
| urls | string[] | Yes | Array of URLs to scan (max 500) |
| label | string | No | Optional label for identification |
{
"id": "b1c2d3e4-f5a6-7890-bcde-f12345678901",
"status": "pending",
"totalUrls": 3
}GET /api/v1/batch/scan/{id}
Poll for the status of a batch scan. The response includes progress counts and, once complete, individual URL results.
curl https://zeodyn.com/api/v1/batch/scan/b1c2d3e4-f5a6-7890-bcde-f12345678901 \
-H "Authorization: Bearer zd_live_xxxxx"{
"id": "b1c2d3e4-f5a6-7890-bcde-f12345678901",
"status": "processing",
"label": "Monthly check",
"totalUrls": 3,
"completedUrls": 1,
"failedUrls": 0,
"createdAt": "2026-02-22T10:30:00.000Z"
}{
"id": "b1c2d3e4-f5a6-7890-bcde-f12345678901",
"status": "completed",
"label": "Monthly check",
"totalUrls": 3,
"completedUrls": 3,
"failedUrls": 0,
"createdAt": "2026-02-22T10:30:00.000Z",
"completedAt": "2026-02-22T10:32:15.000Z",
"urls": [
{
"id": "u1a2b3c4-...",
"url": "https://example.com",
"status": "completed",
"completedAt": "2026-02-22T10:31:05.000Z",
"result": {
"score": 72,
"band": "Strong Foundation",
"scannedUrl": "https://example.com",
"scanId": "a1b2c3d4-..."
}
},
{
"id": "u5d6e7f8-...",
"url": "https://shop.example.com",
"status": "completed",
"completedAt": "2026-02-22T10:31:45.000Z",
"result": {
"score": 65,
"band": "Developing",
"scannedUrl": "https://shop.example.com",
"scanId": "e5f6a7b8-..."
}
},
{
"id": "u9a0b1c2-...",
"url": "https://blog.example.com",
"status": "failed",
"errorMessage": "Scan timed out"
}
]
}Status transitions: pending → processing → completed (or failed).
result.scanId from each completed URL to fetch the full scan result via GET /api/v1/scan/{id}.GET /api/v1/batch/scans
List your batch scans with pagination. Returns batches in reverse chronological order.
curl "https://zeodyn.com/api/v1/batch/scans?page=1&limit=10" \
-H "Authorization: Bearer zd_live_xxxxx"{
"batches": [
{
"id": "b1c2d3e4-...",
"status": "completed",
"label": "Monthly check",
"totalUrls": 3,
"completedUrls": 3,
"failedUrls": 0,
"createdAt": "2026-02-22T10:30:00.000Z",
"completedAt": "2026-02-22T10:32:15.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 5,
"totalPages": 1
}
}Webhook notification
When a batch completes, a batch_complete webhook is fired to all subscribed endpoints. This lets you avoid polling for long-running batches.