Documentation Index
Fetch the complete documentation index at: https://docs.veridianhp.com/llms.txt
Use this file to discover all available pages before exploring further.
Webhooks
Webhooks are how Veridian tells your server about events that happen asynchronously — most importantly, when a payment clears. Webhooks are the source of truth for payment outcomes. The hosted page and the patient’s browser do not communicate payment results to your backend. Always wait for the webhook.Configuring an endpoint
In the dashboard, open Settings → Webhooks and add an endpoint URL. We require HTTPS — HTTP endpoints are rejected. Each endpoint has its own signing secret (whsec_...). Treat it like an API
key.
Event types
| Event | When it fires |
|---|---|
session.created | A session was minted via the API. |
session.opened | The patient first opened the hosted page. |
session.payment.processing | The patient confirmed; ACH is in flight. |
session.payment.succeeded | Funds confirmed. Mark the invoice paid. |
session.payment.failed | Bank declined or processor error. |
session.payment.reversed | An already-succeeded payment was reversed (NSF, etc.). |
session.cancelled | Practice or patient cancelled the session. |
session.expired | Session reached its TTL with no payment. |
Event payload
Every webhook payload has the same envelope:Signature verification
Every request carries an HMAC signature header:Idempotency
Veridian may deliver the same event more than once — for example, if your server returned200 but our network dropped the response. Always dedupe by
event.id in your handler:
event_id PRIMARY KEY works perfectly.
Retries
Veridian retries on:- Connection failures
- HTTP 5xx responses
- HTTP 408 (request timeout)
- HTTP 429 (rate limit) — with exponential backoff
- 2xx responses (treated as accepted)
- 4xx responses other than 408 and 429 (treated as your bug)
1m, 5m, 30m, 2h, 12h, 24h, then we give up and
flag the endpoint in your dashboard. Don’t return 200 unless you’ve durably
recorded the event.
Ordering
Events are delivered in best-effort chronological order, but network realities mean you may receive them out of order. Process byevent.createdAt and your dedupe table, not by arrival order.
Replay from the dashboard
If your endpoint was down, you can replay individual events or a time range from the dashboard. Replayed events have the sameevent.id as the original,
so your dedupe logic keeps you safe.
What’s next
Errors
Error responses for webhook config endpoints.
Sessions
The events on this page describe sessions — read the schema there.
