---
title: "Get all results for an enumeration batch"
method: GET
path: "/email/batch/{batch_id}/results"
---

# Get all results for an enumeration batch

`GET /email/batch/{batch_id}/results`

## Path parameters

- `batch_id` string, uuid, required

## Response `200`

Successful Response

- BatchResultsResponse — All job results for a batch (`GET /email/batch/{id}/results`). `completed`/`failed` are counted from the job rows in `results`, not read from `mirrorball.batch`'s worker-maintained counters — the worker's attempts-exhausted sweep fails jobs without bumping those counters, so they undercount. Counting rows keeps the progress bar and the "batch done" signal (terminality of `results`) consistent by construction.
  - `batch_id` string, uuid, required
  - `total` integer, required
  - `completed` integer
  - `failed` integer
  - `results` JobResponse[], required
    - `job_id` string, uuid, required
    - `status` 'queued' | 'processing' | 'completed' | 'failed', required — Job lifecycle status.
    - `kind` 'find' | 'verify', nullable
    - `result` union
      - EnumerationOutput — Full output of an email enumeration run.
        - `first_name` string, required
        - `last_name` string, required
        - `domain` string, required
        - `status` 'found' | 'not_found' | 'catch_all' | 'catch_all_pattern' | 'undeliverable' | 'error' | 'timeout' | 'greylisted' | 'rate_limited', required — Outcome status for an enumeration attempt.
        - `result` EnumerationMatch — Details about a matched email pattern.
          - `email` string, required
          - `pattern` string, required
          - `tier` integer, required
          - `smtp_code` integer, required
          - `valid` boolean, required
        - `is_catch_all` boolean, required
        - `mx_host` string, nullable
        - `provider` string, nullable
        - `attempts` integer, required
        - `duration_ms` integer, required
        - `error` string, nullable
      - ValidationOutput — Result payload for a verify job, written by the Rust worker into `mirrorball.job.result` and decoded when the job's `kind = 'validate'`.
        - `email` string, required
        - `status` 'safe' | 'risky' | 'invalid' | 'unknown', required — Deliverability verdict for a verify (validate) job. 1:1 with the Rust worker's `Reachable`: safe = deliverable, risky = catch-all or full-inbox, invalid = undeliverable/refused, unknown = greylisted/inconclusive.
        - `is_deliverable` boolean, required
        - `is_catch_all` boolean, required
        - `mx_host` string, nullable
        - `provider` string, nullable
        - `smtp_code` integer, nullable
        - `attempts` integer, required
        - `duration_ms` integer, required
        - `error` string, nullable
        - `reason` 'deliverable' | 'catch_all' | 'full_inbox' | 'greylisted' | 'mailbox_disabled' | 'no_mailbox' | 'no_smtp_connection' | 'smtp_error' | 'timed_out' — Structured cause behind a verify job's `ValidationStatus`. 1:1 with the Rust worker's `ValidationReason`. Absent on job rows written before the worker emitted it, hence optional on `ValidationOutput`.
    - `error` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/discolike/apis/discolike-api.md) · [All operations](https://skmtc.net/discolike/apis/discolike-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/discolike/discolike-api/revisions/eaeae50f8275/schema)
