Callcompleted
Sent when a call at a granted practice finishes and post-call processing has classified its outcome.
See the shared delivery semantics on each event: deliveries are
at-least-once and unordered; verify the X-GrowDental-Signature
header before trusting any payload (t=<unix>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" keyed with your endpoint secret>), and de-duplicate
on X-GrowDental-Delivery-Id.
Payloads are PHI-minimal: IDs, outcome, and links. Pull transcripts or recordings over the authenticated API if your scopes allow.
Authorizations
Partner API key sent as a Bearer token:
Authorization: Bearer gd_live_...Keys are issued by the GrowDental team (invite-only), shown once
at creation, and stored server-side only as a SHA-256 hash. Key format:
gd_live_ (or gd_test_) followed by a 43-character base62 secret
(~256 bits of entropy). To rotate, request a new key, deploy it, then
ask us to revoke the old one — both keys work during the overlap.
Headers
Delivery signature: t=<unix seconds>,v1=<hex HMAC-SHA256> where the
HMAC is computed over <t> + "." + <raw request body> using your
endpoint's signing secret. Recompute and compare with a constant-time
comparison, and reject deliveries whose t is more than 300 seconds
from the current time (replay protection).
Unique delivery ID, stable across retries of the same delivery.
Deliveries are at-least-once — de-duplicate on this value. The event
type is carried in the body envelope's type field.
Body
Delivery body for call.completed.
Event ID (stable across every delivery and retry of this event).
Event types deliverable to webhook endpoints. call_attempt.resolved
and appointment.booked are planned (Phase 2) — valid to subscribe to
now, but not yet emitted.
call.completed, call.recording.ready, call_request.completed, call_attempt.resolved, appointment.booked "call.completed"When the event occurred.
The practice the event belongs to.
PHI-minimal payload — IDs, outcome, and links only.
Response
Respond with any 2xx status within 10 seconds to acknowledge. Non-2xx responses and timeouts are retried with exponential backoff; endpoints that fail persistently are auto-disabled.