Job Status
Retrieve full details and aggregate statistics for a single email validation job, plus the first 100 records inline. For more records, use Job Records.
Endpoint
Method: GET
Path: /email-validation/jobs/{job_id}/
Full URL: https://app.ecoreservice.com/backend/api/v1/email-validation/jobs/{job_id}/
Auth: Authorization: Token YOUR_API_TOKEN — see Authentication
{job_id} is the integer returned by Upload Emails.
Example Request
curl -X GET \
"https://app.ecoreservice.com/backend/api/v1/email-validation/jobs/42/" \
-H "Authorization: Token YOUR_API_TOKEN"
Successful Response — 200 OK
{
"id": 42,
"uuid": "f8a1c3e5-9b2d-4e6f-a8c1-0d3e5f7a9b2d",
"list_name": "Q1 Leads",
"status": "Processed",
"total_records": 250,
"valid_count": 178,
"invalid_count": 49,
"unknown_count": 23,
"total_credits_charged": 178.0,
"credits_charged_at": "2026-05-06T11:42:08.913Z",
"created_at": "2026-05-06T11:41:55.001Z",
"started_at": "2026-05-06T11:42:01.220Z",
"completed_at": "2026-05-06T11:43:17.880Z",
"duration": "1m 16s",
"results_summary": "250/250",
"records": [
{
"id": 9881,
"ec_id": null,
"email": "jane@acme.com",
"status": "Valid",
"validator_used": "ZeroBounce",
"is_cached": false,
"error_message": null,
"processed_at": "2026-05-06T11:42:31.412Z"
}
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
id | integer | The job's primary key |
uuid | string | UUID4 |
list_name | string | Display label |
status | string | Uploading / Processing / Processed / Failed |
total_records | integer | Total unique emails in the job |
valid_count | integer | Records with status = Valid |
invalid_count | integer | Records with status = Invalid |
unknown_count | integer | Records with status = Unknown |
total_credits_charged | number | Net charge after refunds for non-Valid emails |
credits_charged_at | datetime | When the upfront charge was applied |
created_at | datetime | Job creation timestamp |
started_at | datetime | null | When the async worker picked it up |
completed_at | datetime | null | When processing finished (or failed) |
duration | string | Human-readable processing duration |
results_summary | string | processed/total count |
records | array | First 100 records inline — see Job Records per-record fields |
Polling Guidance
- Poll every few seconds for small jobs.
- Poll every 15–30 seconds for large jobs.
- Stop polling when
statusisProcessedorFailed. - A
Failedjob has already had credits refunded — no action needed.
Error Responses
| HTTP | Body | When |
|---|---|---|
| 401 | {"detail": "Invalid token."} | Missing or invalid token |
| 404 | {"detail": "Not found."} | job_id doesn't exist or belongs to another user |
See Error Codes for the full list.