Receive webhooks
Build the receiver endpoint and follow-up fetch flow.
Reference
Planned recording.transcript_ready notification contract and receiver expectations.
recording.transcript_ready is a planned public webhook contract with runtime status planned_not_generally_available. It is documented so receivers can prepare for the notification shape, but outbound delivery is not generally available yet.
The event is a thin pointer notification. Receivers fetch clinical data through the public REST API after receiving the notification instead of expecting clinical artifacts in the webhook body.
{
"id": "evt_recording_transcript_ready_01",
"type": "recording.transcript_ready",
"api_version": "2026-05-01",
"occurred_at": "2026-05-01T15:29:55Z",
"organization_id": "org_123",
"resources": {
"encounter_id": "enc_123",
"document_id": "doc_123"
}
}
Webhook examples use synthetic identifiers. The payload is intentionally minimal and excludes transcript turns, patient demographics, phone-call metadata, signed audio URLs, document content, receiver-specific correlation fields, endpoint URLs, storage keys, raw request or response bodies, IP addresses, user agents, and secrets.
webhook.endpoint_test is not part of this public webhook inventory.
| Header | Required | Contract |
|---|---|---|
ChartHero-Event-Id |
Yes | Matches JSON body id; this is the receiver business idempotency key. |
ChartHero-Delivery-Id |
Yes | Stable for one event/endpoint delivery and reused across retries; support/debug metadata only. |
ChartHero-Timestamp |
Yes | Decimal Unix epoch seconds. Receivers should reject signatures outside a 300 second local-clock tolerance. |
ChartHero-Signature |
Yes | v1= HMAC-SHA256 signature over {timestamp}.{raw_request_body}. |
ChartHero-Webhook-Version |
Yes | Matches JSON body api_version; current version is 2026-05-01. |
ChartHero-Event-Id: evt_recording_transcript_ready_01
ChartHero-Delivery-Id: whd_recording_transcript_ready_01
ChartHero-Timestamp: 1777649400
ChartHero-Signature: v1=a3cc6cb77b21da521f106cc32f59c3d119181f533faef8c7ff3e44f906053701
ChartHero-Webhook-Version: 2026-05-01
This example uses synthetic values. ChartHero-Timestamp is the delivery signing timestamp and is not necessarily the body occurred_at.
Use the exact raw request body bytes as received. Build the signature input as {timestamp}.{raw_request_body}, where timestamp is the ChartHero-Timestamp Unix epoch seconds string. Verify the v1 HMAC-SHA256 digest from ChartHero-Signature with the endpoint signing secret, and reject timestamps outside the 300 second tolerance.
ChartHero-Event-Id must equal body id. ChartHero-Webhook-Version must equal body api_version.
Any HTTP 2xx response is receiver success. No JSON acknowledgement body is required.
Delivery is at least once. Receivers must dedupe business work by event id or ChartHero-Event-Id, not by ChartHero-Delivery-Id.
| Class | Values |
|---|---|
| Retryable | connection errors, DNS errors, TLS errors, timeouts, 408, 409, 425, 429, 5xx |
| Terminal | 1xx, 3xx, 400, 401, 403, 404, other non-transient 4xx |
ChartHero-Delivery-Id identifies one event/endpoint delivery record, is reused across retries, and is support/debugging metadata only.
Receivers fetch approved clinical resources through public REST routes after the webhook arrives. Activation approves a receiver-specific subset of candidate routes. The receiver API key must grant only the union of scopes required for those approved routes. recordings:read is required only when the audio route is approved.
| Follow-up route | Required scopes |
|---|---|
GET /external/v1/encounters/{encounter_id} |
encounters:read, patients:read, documents:read |
GET /external/v1/encounters/{encounter_id}/documents/{document_id} |
encounters:read, documents:read |
GET /external/v1/encounters/{encounter_id}/documents/{document_id}/transcript |
encounters:read, documents:read |
GET /external/v1/encounters/{encounter_id}/documents/{document_id}/audio |
encounters:read, documents:read, recordings:read |
Clinical delivery remains unavailable until ChartHero has activated the receiver for a subscription. Activation confirms the approved follow-up routes, least-privilege receiver API-key scopes, webhook signing setup, receiver correlation, network allowlisting when applicable, and outbound delivery and audit readiness.
Clinical subscriptions default disabled. Activation records readiness and provenance atomically with the active subscription revision.
Management/setup availability controls setup surfaces only. It does not make deliveries available until receiver activation is complete.
Readiness revocation is future runtime behavior: disable affected clinical subscriptions and explicitly cancel already-created non-terminal unsucceeded work, including pending deliveries, currently leased sending deliveries, and expired/stale sending deliveries. This documentation placeholder does not implement those actions.
Current receiver correlation status is not_confirmed_runtime_blocked. Runtime delivery cannot launch for the first receiver until ChartHero IDs are confirmed usable or an approved public correlation field is added to follow-up API responses.
Build the receiver endpoint and follow-up fetch flow.
Validate delivery signatures and timestamp tolerance.
Review the generated webhook operation.