---
title: "A crawl finished (completed, failed or canceled)"
method: POST
path: "crawl.completed"
---

# A crawl finished (completed, failed or canceled)

`POST crawl.completed` (webhook)

Sent to the crawl's `webhook_url` (or the account webhook). Signed like batch
webhooks: `X-SerpKite-Event: crawl.completed`, `X-SerpKite-Delivery` (the task id),
`X-SerpKite-Timestamp` and `X-SerpKite-Signature: v1=<hex HMAC-SHA256(secret,
"<timestamp>.<raw body>")>`. Retried with backoff until a 2xx.

## Payload

- TaskCompletedEvent: Body of `crawl.completed`
  - `event` 'crawl.completed', required
  - `id` string, uuid, required
  - `kind` 'crawl', required
  - `status` 'queued' | 'running' | 'completed' | 'failed' | 'canceled', required
  - `created_at` string, date-time, required
  - `completed_at` string, date-time, nullable
  - `credits_used` number, required
  - `poll_url` string: Where the task (and its full result) can be fetched for 24 hours
  - `result` unknown
  - `result_omitted` boolean: Set when the result was too large for the webhook; GET poll_url for it
  - `error` object
    - `code` string
    - `message` string

## Acknowledgement `200`

Any 2xx acknowledges the delivery

---

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