Skip to main content
WEBHOOK
call.completed
{
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "created_at": "2023-11-07T05:31:56Z",
  "practice_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "data": {
    "call_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "practice_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "outcome": "<string>",
    "duration_seconds": 123,
    "links": {
      "call": "<string>",
      "recording": "<string>"
    },
    "call_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "contact_external_ref": "<string>"
  }
}

Authorizations

Authorization
string
header
required

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

X-GrowDental-Signature
string
required

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).

X-GrowDental-Delivery-Id
string<uuid>
required

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

application/json

Delivery body for call.completed.

id
string<uuid>
required

Event ID (stable across every delivery and retry of this event).

type
enum<string>
required

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.

Available options:
call.completed,
call.recording.ready,
call_request.completed,
call_attempt.resolved,
appointment.booked
Allowed value: "call.completed"
created_at
string<date-time>
required

When the event occurred.

practice_id
string<uuid> | null
required

The practice the event belongs to.

data
object
required

PHI-minimal payload — IDs, outcome, and links only.

Response

200

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.