QEHSQEHS

Developer portal

export.completed.v1

An async export job finished and a download is ready.

export.completed.v1v1at-least-once delivery

Fires when

When a tenant data export or evidence bundle job reaches the succeeded state. The downloadUrl is pre-signed and expires after 24 hours.

Payload fields

Envelope fields are shared across all event types. Event-specific data is nested under data.

FieldTypeRequiredDescription
eventIdstring (uuid)requiredUnique per delivery attempt. Use for deduplication.
eventstringrequiredFully-qualified event name, e.g. record.created.v1.
tenantIdstring (uuid)requiredTenant that owns the affected resource.
firedAtstring (date-time)requiredISO-8601 UTC timestamp when the event was emitted.
data.jobIdstringrequiredID of the completed async job.
data.downloadUrlstring (url)requiredPre-signed URL for the export file. Expires after 24 hours.
data.expiresAtstring (date-time)requiredExpiry time for the download URL.
data.kind"full_export" | "evidence_bundle" | "bulk_export"requiredType of export that completed.

Sample payload

{
  "eventId": "00000000-1111-2222-3333-444444444444",
  "event": "export.completed.v1",
  "tenantId": "00000000-1111-2222-3333-444444444444",
  "firedAt": "2026-04-18T13:20:00.000Z",
  "data": {
    "jobId": "job-export-abc123",
    "downloadUrl": "https://storage.qehsethos.com/exports/tenant/2026-04-18/export.zip?sig=...",
    "expiresAt": "2026-04-19T13:20:00.000Z",
    "kind": "full_export"
  }
}

Verify the signature

Every delivery includes X-QEHS-Signature: sha256=<hex> and X-Job-ID headers. Verify before trusting the body. See the webhooks signature docs for a full verification example.