healthcare.dev docs
API referenceWebhooks

Webhook delivery log

GET /v1/webhooks/{id}/deliveries

GET https://api.healthcare.dev/v1/webhooks/{id}/deliveries

Pro plan and up (403 plan-upgrade-required below Pro); never counts as a billable call. The webhook's deliveries, newest first, kept 30 days: status (pending while retrying, held while the webhook is off, succeeded, failed after the last retry, skipped when the plan no longer includes it), and every attempt with its status code, latency and the first 1 KB of your endpoint's response. Page with cursor.

Requires an API key: Authorization: Bearer hdev_live_.... See Authentication.

Path parameters

NameTypeRequiredDescriptionExample
idstringyesWebhook id5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b

Query parameters

NameTypeRequiredDescriptionExample
status"pending" | "held" | "succeeded" | "failed" | "skipped"noOnly deliveries in this statuspending
limitintegernoPage size, 1 to 100 (default 25)25
cursorstringnoOpaque cursor from links.next

Examples

curl

curl "https://api.healthcare.dev/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?limit=25" \
  -H "Authorization: Bearer $HDEV_API_KEY"

TypeScript

const res = await fetch("https://api.healthcare.dev/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?limit=25", {
  headers: { Authorization: `Bearer ${process.env.HDEV_API_KEY}` },
});
const { data, meta } = await res.json();

Python

import os
import requests

res = requests.get("https://api.healthcare.dev/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?limit=25", headers={"Authorization": f"Bearer {os.environ['HDEV_API_KEY']}"})
body = res.json()

Try it

GEThttps://api.healthcare.dev/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?status=pending&limit=25
Get a free key
Copy as curl
curl "https://api.healthcare.dev/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?status=pending&limit=25" \
  -H "Authorization: Bearer $HDEV_API_KEY"

Response

Deliveries, newest first

{
  "data": [
    {
      "id": "string",
      "event_id": "string",
      "event_type": "dataset.released",
      "status": "pending",
      "attempts": 1,
      "next_attempt_at": "string",
      "last_status_code": 1,
      "last_error": "string",
      "replay_of": "string",
      "created_at": "string",
      "completed_at": "string",
      "attempt_log": [
        {
          "attempt": null,
          "attempted_at": null,
          "status_code": null,
          "latency_ms": null,
          "error": null,
          "response_body": null
        }
      ]
    }
  ],
  "meta": {
    "source": "cms-icd10",
    "data_version": "2026.1",
    "retrieved_at": "2026-10-24T12:00:00Z",
    "license": "Public domain (CMS). Reference data, not medical advice."
  },
  "links": {
    "self": "/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?limit=25",
    "next": "/v1/webhooks/5f0c2a8e-6b1d-4f7e-9a51-2c3d4e5f6a7b/deliveries?limit=25&cursor=eyJrIjoiRTExLjkifQ"
  }
}

Fields

FieldTypeAlways presentDescription
idstringyes
event_idstringyes
event_typeWebhookEventTypeyes
status"pending" | "held" | "succeeded" | "failed" | "skipped"yespending while retrying; held while the webhook is off (sent when it is turned back on); failed after the last retry; skipped when the plan no longer includes it
attemptsintegeryes
next_attempt_atstring | nullyes
last_status_codeinteger | nullyes
last_errorstring | nullyes
replay_ofstring | nullyesThe delivery this one replays
created_atstringyes
completed_atstring | nullyes
attempt_logWebhookAttempt[]yes

Errors

Errors are application/problem+json (RFC 9457). Branch on type, not on title. See Errors.

StatustypeWhen
400invalid-requestA parameter or the body failed validation; errors lists each field.
401unauthorizedMissing, malformed or revoked API key.
403plan-upgrade-requiredThe plan doesn't include this feature; required_plan names the plan that does.
404not-foundNo record with that id (retired records are still returned).
429rate-limited / quota-exceededToo many requests per second (retry after Retry-After), or the monthly quota is used up.

On this page