QEHSQEHS

Developer portal

attachment.uploaded.v1

An attachment was uploaded and passed virus scanning.

attachment.uploaded.v1v1at-least-once delivery

Fires when

After the signed-URL upload completes and the async virus scan clears. Not fired if the scan flags the file.

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.attachmentIdstring (uuid)requiredUnique ID of the stored attachment.
data.recordIdstring (uuid)requiredRecord the attachment belongs to.
data.sizeBytesintegerrequiredFile size in bytes after upload.
data.mimeTypestringrequiredDetected MIME type, e.g. image/jpeg.
data.filenamestringrequiredOriginal filename as supplied at upload time.

Sample payload

{
  "eventId": "ffffffff-0000-1111-2222-333333333333",
  "event": "attachment.uploaded.v1",
  "tenantId": "00000000-1111-2222-3333-444444444444",
  "firedAt": "2026-04-18T13:15:00.000Z",
  "data": {
    "attachmentId": "12345678-abcd-ef01-2345-678901234567",
    "recordId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "sizeBytes": 204800,
    "mimeType": "image/jpeg",
    "filename": "photo-site-inspection.jpg"
  }
}

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.