---
title: "A bulk job finished"
method: POST
path: "job.completed"
---

# A bulk job finished

`POST job.completed` (webhook)

Sent when a job reaches `completed`. `progress.total` counts rows (numbers and e-mails); `checks_total`, `done`, `conclusive` and `non_billable` count checks (row × check), so `done` equals `checks_total` when the job is finished. Fetch the rows from `results_url` with your key. Payloads never contain phone numbers or e-mail addresses. Same headers and retries as lookup.completed.

## Payload

- JobWebhookEvent: Every webhook body has this envelope. `id` is the event id (also the webhook-id header); use it to deduplicate retries.
  - `type` string, required
  - `id` string, required
  - `created_at` string, date-time, required
  - `data` object, required: The object the event is about (never phone numbers or e-mail addresses).
    - `object` 'job', required
    - `id` string, required
    - `status` string, required
    - `progress` JobProgress, required: total = rows (numbers + e-mails); checks_total = Σ rows × checks of their input type; done/conclusive/non_billable count checks.
      - `total` integer
      - `checks_total` integer
      - `done` integer
      - `conclusive` integer
      - `non_billable` integer
    - `results_url` string, uri: job.completed only.

## Acknowledgement `200`

Any 2xx acknowledges the event.

---

[API](https://skmtc.dev/mobilevalidate/apis/mobilevalidate-api.md) · [All operations](https://skmtc.dev/mobilevalidate/apis/mobilevalidate-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mobilevalidate/apis/mobilevalidate-api/revisions/f2e56c2454ef?raw)
