DELETE /v1/scans/{id}

Delete a stored scan

Deletes a scan the account still holds, before its retention window would have ended: the stored result, its history row and its thumbnail. It cannot be undone – the scan can no longer be read, listed or replayed through an Idempotency-Key. The credit the scan drew is not returned, and the period's usage counters keep counting it. Only a live key deletes, and only its own account's scans; anything else – an unknown id, another account's scan, a scan whose window has passed, a sandbox key – is 404.

Deletes a stored scan before its retention window would have ended: the stored result, its history row and its thumbnail. It cannot be undone.

After it, the scan is neither read by GET /v1/scans/{id} nor listed by GET /v1/scans, and for 24 hours a retry under the Idempotency-Key that created it answers 409 idempotency_replay_unavailable instead of recognizing again. After that the key is forgotten, as it is for a scan kept for zero hours.

The credit the scan drew is not returned, and the period's usage counters keep counting it.

Send it with no body and no Content-Type header. A JSON content type with an empty body is refused as invalid_request.

Request

Method DELETE
Path /v1/scans/{id}
Authentication Authorization: Bearer <api key>

Path parameters

Name Type Required Description
id string yes Scan identifier: a UUID version 7 (RFC 9562), canonical lower-case 8-4-4-4-12. Its leading 48 bits are the millisecond the scan was made, so ids sort in the order the scans happened – but treat the value as opaque: nothing else about it is part of the contract.

Responses

200

The scan was deleted.

Body: ScanDeletion.

Field Type Description
id ScanId Scan identifier: a UUID version 7 (RFC 9562), canonical lower-case 8-4-4-4-12. Its leading 48 bits are the millisecond the scan was made, so ids sort in the order the scans happened – but treat the value as opaque: nothing else about it is part of the contract.
deleted boolean Always true: the stored result is gone and cannot be read back.
{
  "id": "01a0af18-cd8d-7a61-9f2d-4c7b8e105da3",
  "deleted": true
}

401

Missing or malformed Authorization: Bearer <api key> header, or an unknown key.

Body: ErrorResponse.

{
  "error": {
    "code": "unauthorized",
    "message": "Send your API key as `Authorization: Bearer <key>`.",
    "docs_url": "https://doc.cheap/docs/errors/unauthorized",
    "request_id": "req_9e6b1f7c-2d4a-4b83-9c51-7f0ad3e8b642",
    "event_id": null
  }
}

404

No scan with this id exists, or its retention window has passed.

Body: ErrorResponse.

{
  "error": {
    "code": "not_found",
    "message": "No scan with id 01a0af18-cd8d-7a61-9f2d-4c7b8e105da3 exists or it has expired.",
    "docs_url": "https://doc.cheap/docs/errors/not_found",
    "request_id": "req_9e6b1f7c-2d4a-4b83-9c51-7f0ad3e8b642",
    "event_id": null
  }
}

429

Rate limit exceeded for this key or IP.

Body: ErrorResponse.

{
  "error": {
    "code": "rate_limited",
    "message": "Sandbox limit of 10 requests per hour per IP reached.",
    "docs_url": "https://doc.cheap/docs/errors/rate_limited",
    "request_id": "req_9e6b1f7c-2d4a-4b83-9c51-7f0ad3e8b642",
    "event_id": null
  }
}

500

Unexpected failure on the server; the scan was not charged.

Body: ErrorResponse.

{
  "error": {
    "code": "internal_error",
    "message": "Unexpected error.",
    "docs_url": "https://doc.cheap/docs/errors/internal_error",
    "request_id": "req_9e6b1f7c-2d4a-4b83-9c51-7f0ad3e8b642",
    "event_id": null
  }
}

503

Temporarily unable to serve the request: a store this service depends on is unreachable. Nothing was charged and it may be retried, after the Retry-After seconds where that header is present.

Body: ErrorResponse.

{
  "error": {
    "code": "service_unavailable",
    "message": "The service is temporarily unable to handle this request; nothing was charged. Retry shortly.",
    "docs_url": "https://doc.cheap/docs/errors/service_unavailable",
    "request_id": "req_9e6b1f7c-2d4a-4b83-9c51-7f0ad3e8b642",
    "event_id": null
  }
}

Error codes reachable here

Code When Page
internal_error The service failed in a way it does not model. Nothing was deleted. internal_error
not_found No scan with that id is stored for this account – it was never stored, it belongs to another account, its retention window has passed, it was already deleted, or the key is a sandbox key. The cases are not distinguished. not_found
rate_limited The caller is over the rate limit for its key kind. rate_limited
service_unavailable A store this endpoint writes to is unreachable, so nothing was deleted; retry after the Retry-After seconds. service_unavailable
unauthorized The Authorization header is missing, malformed or names an unknown key. unauthorized

Every error body carries the same shape; the full list is on Errors.