GET /v1/batch/{jobId}/download?sig=...
The result_url field on a completed BatchJob points to this endpoint with a pre-signed sig query parameter. No X-Api-Key header required — the signature itself authenticates the request.
The signed URL is short-lived (expires after ~1 hour). Re-fetch the job to get a fresh URL if needed.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sig |
string | ✓ | HMAC-signed short-lived token (included in result_url) |
Response
HTTP 200 with Content-Type: text/csv:
input,valid_syntax,mx_found,disposable,score,deliverability,credits_used
john@example.com,true,true,false,92,deliverable,1
jane@acme.com,true,true,false,88,deliverable,1
noreply@disposablemail.xyz,true,false,true,12,undeliverable,1
Error responses
| Status | Description |
|---|---|
| 403 | Signature invalid or expired — re-fetch GET /v1/batch/:id for a fresh result_url |
| 404 | Job not found |
Example
# Use the result_url directly (includes sig)
curl "https://api.checkharbor.com/v1/batch/job_01HXYZ123/download?sig=abc123xyz" \
-o results.csv
```
const done = await checkharbor.batch.waitUntilDone("job_01HXYZ123");
const csv = await checkharbor.batch.downloadResult(done);// Parse CSV
const lines = csv.trim().split("\n");
const headers = lines[0].split(",");
const rows = lines.slice(1).map(l => l.split(","));
```
done = client.batch.wait_until_done("job_01HXYZ123")
csv_content = client.batch.download_result(done)import csv, io
reader = csv.DictReader(io.StringIO(csv_content))
for row in reader:
print(row["input"], row["deliverability"])
```