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"])
```