Fasten Health · AsyncAPI Specification

Fasten Health Webhooks

Version

View Spec View on GitHub HealthcareFHIRPersonal Health RecordElectronic Medical RecordHealth Data InteroperabilityTEFCAEHI ExportPatient ConsentSelf-HostedOpen-SourceHL7Healthcare ConnectivityAsyncAPIEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-14'
method: searched
source: >-
  https://docs.connect.fastenhealth.com/webhooks/introduction,
  https://docs.connect.fastenhealth.com/webhooks/events,
  https://docs.connect.fastenhealth.com/webhooks/delivery,
  https://docs.connect.fastenhealth.com/webhooks/verification
spec_type: null
asyncapi_published: false
asyncapi_probe:
  - url: https://docs.connect.fastenhealth.com/asyncapi.yaml
    status: 404
  - url: https://docs.connect.fastenhealth.com/api-reference/asyncapi.yaml
    status: 404
note: >-
  Fasten Connect has a real, well-documented event surface but publishes NO AsyncAPI document. The
  webhook catalog below is captured from the provider's own event reference; no AsyncAPI was
  generated on their behalf. Events are the primary completion signal for bulk EHI export, not an
  optional extra — the export API is asynchronous by design.

transport: https-webhook
configuration: >-
  Endpoints are registered in the Fasten Developer Portal (https://portal.fastenhealth.com), with
  separate endpoints and separate signing secrets for test and live modes. Event types are
  individually selectable per endpoint.

security:
  signature_header: Webhook-Signature
  scheme: Standard Webhooks (https://www.standardwebhooks.com/)
  secret_source: Signing Secret, revealed on the endpoint's Delivery Logs page in the portal
  replay_protection: signed timestamp inside the signature
  libraries: >-
    Any Standard Webhooks implementation. The docs show JavaScript, Go, Python, Ruby and Java
    examples using the community `standardwebhooks` libraries; Fasten ships no first-party
    verification SDK.

delivery:
  guarantee: at-least-once
  deduplication_key: id (UUIDv4, on every event)
  retries: 4
  failure_conditions:
    - non-2xx response
    - response slower than 60 seconds
    - connection error
  auto_disable: true
  auto_disable_notice: email alert; manual re-enable in portal under Developers > Webhooks
  handler_guidance: respond 200 immediately, then process asynchronously via a queue
  log_retention_days: 15

event_count: 7
events:
  - type: patient.ehi_export_success
    description: Bulk EHI export completed; records are ready to download.
    enabled_by_default: true
    fields:
      - {name: download_links, type: "object[]", required: true, note: "url + export_type + content_type; jsonl/application/fhir+ndjson by default"}
      - {name: org_connection_id, type: string}
      - {name: task_id, type: string}
      - {name: org_id, type: string}
      - {name: stats, type: object, required: true, note: "total_resources + total_by_resource_type keyed by FHIR resource type"}
      - {name: download_link, type: object, deprecated: true, note: "superseded by download_links"}

  - type: patient.ehi_export_failed
    description: Bulk EHI export failed.
    enabled_by_default: true
    fields:
      - {name: failure_reason, type: string, required: true, enum_ref: errors/fasten-health-problem-types.yml}
      - {name: org_connection_id, type: string}
      - {name: task_id, type: string}
      - {name: org_id, type: string}

  - type: patient.connection_success
    description: >-
      Patient successfully connected to the health system and the popup window closed. Documented as
      the durable backend signal for a completed consent; connection FAILURES are not yet available
      as a webhook event.
    enabled_by_default: false
    enablement: toggle in the Fasten Connect dashboard per webhook endpoint
    fields:
      - {name: org_connection_id, type: string, required: true}
      - {name: endpoint_id, type: string, required: true, note: "may be omitted in TEFCA mode"}
      - {name: portal_id, type: string, required: true, note: "may be omitted in TEFCA mode"}
      - {name: brand_id, type: string, required: true, note: "may be omitted in TEFCA mode"}
      - {name: connection_status, type: string, required: true, enum: [authorized, revoked]}
      - {name: platform_type, type: string, required: true, note: EHR type of the connected endpoint}
      - {name: request_id, type: string, note: correlation id for support tickets}
      - {name: external_id, type: string, note: opaque integrator-supplied patient identifier}
      - {name: external_state, type: string, note: identifies a unique connection attempt}
      - {name: scope, type: string, note: "SMART on FHIR scope granted; always patient/*.read in TEFCA mode"}
      - {name: consent_expires_at, type: string, format: rfc3339}
      - {name: tefca_directory_id, type: string, note: present for TEFCA-connected health systems}

  - type: patient.authorization_revoked
    description: >-
      Patient consent revoked or expired, detected when Fasten's periodic token refresh fails.
      Fasten may revoke connections in bulk, so handlers must tolerate many events at once.
    enabled_by_default: false
    enablement: toggle in the Fasten Connect dashboard per webhook endpoint
    fields:
      - {name: org_connection_id, type: string, required: true}
      - {name: endpoint_id, type: string}
      - {name: portal_id, type: string}
      - {name: brand_id, type: string}
      - {name: platform_type, type: string, required: true}
      - {name: connection_status, type: string, required: true, note: always "revoked"}

  - type: patient.request_health_system
    description: Patient asked for a health system that is not yet in the Fasten catalog.
    fields:
      - {name: email, type: string, required: true}
      - {name: name, type: string, required: true}
      - {name: website, type: string}
      - {name: street_address, type: string}

  - type: patient.request_support
    status: beta
    description: Patient requested support during the connection process.
    fields:
      - {name: email, type: string, required: true}
      - {name: name, type: string}
      - {name: body, type: string, required: true, warning: "may contain PII or PHI; format is arbitrary and subject to change"}

  - type: webhook.test
    description: Manual test event fired from the webhook simulator.
    fields:
      - {name: hello, type: string}
      - {name: random, type: string}

envelope:
  fields:
    - {name: id, type: string, format: uuidv4, note: unique event id; the documented deduplication key}
  note: >-
    The introduction page shows the event envelope carrying an `id`; per-event documentation covers
    the payload body only.

tooling:
  simulator: https://docs.connect.fastenhealth.com/guides/webhook-debugging-simulator
  delivery_logs: >-
    Per-endpoint delivery logs in the Developer Portal showing response code, body and headers for
    the last 15 days.

gaps:
  - No AsyncAPI (or CloudEvents) document is published for this event surface.
  - Connection FAILURE has no event; only success is emitted.
  - >-
    Two of the four lifecycle events (patient.connection_success, patient.authorization_revoked)
    are off by default and must be enabled per endpoint in the dashboard.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/fasten-health-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.