API referenceCompliance

Get an erasure job + its signed deletion certificate

Returns one erasure job by id, including its kind, status (pending → running → completed or failed), timestamps, and a deleted tally of how many messages, threads, and attachments were destroyed.

Endpoint
GET https://api.dairo.app/v1/erasure-jobs/{jobId}

Returns one erasure job by id, including its kind, status (pending → running → completed or failed), timestamps, and a deleted tally of how many messages, threads, and attachments were destroyed. Once the job reaches completed, the response also carries the EdDSA-signed deletion certificate and its certificateSig; the certificate states what the job searched and erased and, under scope.notCovered, what it did not reach (other members' records, other projects, earlier backups, copies outside Dairo), and verifies against Dairo's published JWKS the same way an audit-export manifest does. jobId must be a valid UUID — a malformed id returns 400, and a job outside your active organization returns 404. Requires the compliance:read scope.

Scope: compliance:read. Send the API key as a bearer token; Scopes lists what each one reaches.

Request

cURL
curl "https://api.dairo.app/v1/erasure-jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer $DAIRO_API_KEY"

Path parameters

NameTypeRequiredDescription
jobIdstring (uuid)yesThe erasure job id returned by erase/purge-inbox.

Response

200 Success. Body: application/json, ErasureJobResponse.

FieldTypeRequiredDescription
jobErasureJobyes
200
{
  "job": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "kind": "erase_subject",
    "subjectHandle": null,
    "inboxId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "status": "pending",
    "deleted": {
      "messages": 0,
      "threads": 0,
      "attachments": 0,
      "s3Objects": 0,
      "ledgerRowsRedacted": 0
    },
    "certificate": {
      "alg": null,
      "kid": null,
      "signature": null,
      "type": "dairo.deletion.certificate.v2",
      "issuer": "string",
      "jobId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "projectId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "kind": "string",
      "subjectHandle": null,
      "inboxId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "region": "string",
      "scope": {
        "searched": "string",
        "erased": [
          "string"
        ],
        "notCovered": [
          "string"
        ]
      },
      "deleted": {
        "messages": 0,
        "threads": 0,
        "attachments": 0,
        "s3Objects": 0,
        "ledgerRowsRedacted": 0
      },
      "requestedAt": "2026-10-19T09:30:00Z",
      "completedAt": "2026-10-19T09:30:00Z"
    },
    "certificateSig": null,
    "error": null,
    "createdAt": "2026-10-19T09:30:00Z",
    "startedAt": "2026-10-19T09:30:00Z",
    "completedAt": "2026-10-19T09:30:00Z"
  }
}

Errors

Every error has the same body, {"error": {"type", "code", "message", "param"}}; branch on code. Errors lists every code.

StatusMeaning
400The request is malformed or a value is invalid (invalid_request, invalid_domain, idempotency_key_mismatch).
401The API key is missing or invalid.
403The key lacks the scope this endpoint needs (scope_missing) or may not do this (not_permitted).
404No such resource in this account (resource_not_found).
422The request is well-formed but a field failed validation (validation_failed).
429Rate limit, plan limit, budget or spend cap reached (rate_limited, plan_limit_reached, budget_exceeded, spend_cap_reached).
500An unexpected error; retry with backoff, then contact support (internal_error).

On this page