Developer portal
export.completed.v1
An async export job finished and a download is ready.
export.completed.v1v1at-least-once deliveryFires 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.
| Field | Type | Required | Description |
|---|---|---|---|
eventId | string (uuid) | required | Unique per delivery attempt. Use for deduplication. |
event | string | required | Fully-qualified event name, e.g. record.created.v1. |
tenantId | string (uuid) | required | Tenant that owns the affected resource. |
firedAt | string (date-time) | required | ISO-8601 UTC timestamp when the event was emitted. |
data.jobId | string | required | ID of the completed async job. |
data.downloadUrl | string (url) | required | Pre-signed URL for the export file. Expires after 24 hours. |
data.expiresAt | string (date-time) | required | Expiry time for the download URL. |
data.kind | "full_export" | "evidence_bundle" | "bulk_export" | required | Type 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.