Validic · AsyncAPI Specification

Validic Events Webhooks

Version

View Spec View on GitHub Health DataDigital HealthWearablesRemote Patient MonitoringHealth IoTInteroperabilityHIPAAAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-15'
method: searched
source: >-
  https://developer.validic.com/docs/creating-a-stream +
  https://developer.validic.com/docs/connect-to-a-stream +
  https://developer.validic.com/docs/using-the-status-event-api +
  https://help.validic.com/space/VCS/3374284801/Streaming+API+vs+Push+Service +
  https://dashboard.validic.com/inform-quickstart.txt
description: >-
  Validic's event surface, captured as a catalogue because Validic publishes NO
  AsyncAPI document for it. There are two independent asynchronous delivery
  channels for the same normalised record - a pull-style Server-Sent Events
  stream the customer connects OUT to, and a push-style webhook Validic
  delivers IN to a customer endpoint. Both are real, both are documented in
  prose, neither has a machine-readable contract.
asyncapi_published: false
asyncapi_probe:
- url: https://api.v2.validic.com/asyncapi.yaml
  status: 403
- url: https://streams.v2.validic.com/asyncapi.yaml
  status: 403
- url: https://developer.validic.com/asyncapi.yaml
  status: 404
- source: https://github.com/validic
  result: no AsyncAPI document in any of the 8 public repositories
- source: https://developer.validic.com/llms.txt
  result: no AsyncAPI or event-schema page in the documentation index
channels:
- name: Streaming API
  style: server-sent-events
  direction: consumer connects out
  protocol: HTTP long-lived connection
  content_type: text/event-stream
  base: https://streams.v2.validic.com
  auth: '?token={ORG_TOKEN}'
  scope: organization-wide (all users under the org)
  lifecycle:
    create: POST /streams?token= with { name, start_date, resource_filter?, event_type_filter? }
    read: GET /streams?token= and GET /streams/{id}?token=
    update: PUT /streams/{id}?token=
    delete: DELETE /streams/{id}?token= (requires 0 active connections)
    connect: GET /streams/{id}/connect?token=
    replay: GET /replay?token=&resources=summary,workout&date=YYYY-MM-DD
  limits:
    streams_per_customer: 5
    concurrent_connections_per_stream: 3
    heartbeat_seconds: 5
  delivery_guarantee: at-least-once
  consumer_obligation: >-
    "It is up to the customer to ensure idempotent handling of redelivered
    messages." De-duplicate on the record `id` / `checksum`.
  load_balancing: >-
    With more than one connection to a single stream, events are distributed
    across the connections. There is NO load balancing across separate streams -
    each stream is independent.
  reconnect_hazard: >-
    A disconnect starts an internal rebalance. Reconnecting before it finishes
    can return HTTP 422 (max client connections exceeded). Retry with back-off.
  resumption:
    last_event_id: false
    mechanism: >-
      No Last-Event-ID resumption. Recovery is via the separate /replay
      endpoint, parameterised by DATE and resource list rather than by event id
      - so a consumer can replay a day but cannot resume precisely where it
      stopped.
  events:
  - name: data
    payload: >-
      A full normalised Record - identical schema to the REST data endpoints
      (id, type, start_time, end_time, source, metrics[], user).
    note: The primary payload; this is why the stream exists.
  - name: rule
    payload: '{ rule_id, user_id, triggered_at }'
    note: >-
      Fires when a configured rule threshold is met - the alerting hook for
      remote patient monitoring.
  - name: connection
    payload: '{ user_id, source, event: "connected" | "disconnected" }'
    note: >-
      Emitted when a user connects or disconnects an API/cloud source through
      the Marketplace. Added 2023-01-26 per the changelog. The REST equivalent
      is GET /organizations/{org_id}/connections.
  - name: poke
    payload: none
    note: Heartbeat every 5 seconds. Discard it; it exists to keep the connection open.
  filters:
    resource_filter:
      applies_to: the `data` event
      values:
      - measurement
      - cgm
      - workout
      - summary
      - sleep
      - intraday
      - nutrition
    event_type_filter:
      applies_to: the event stream as a whole
      values:
      - data
      - rule
      - connection
    note: >-
      Filters are set at stream CREATION, not per connection, so every client
      on a stream sees a consistent view. Changing what you receive means
      updating or recreating the stream.
- name: Push Service
  style: webhook
  direction: Validic delivers in
  protocol: HTTPS POST to a customer-supplied endpoint
  scope: organization-wide
  payload: >-
    Batches of normalised records, same record model as REST and the stream.
    FHIR R4 mapping is available on this channel per
    https://validic.com/how-we-help/arpa-h-advocate/.
  configuration: >-
    Endpoint registration is arranged with Validic rather than self-served -
    there is no public API operation for creating or listing push
    subscriptions.
  observability:
    name: Push Service Status API
    operation: GET /organizations/{organization_id}/notifications?token={token}
    host: https://api.prod.validic.com
    parameters:
    - name: organization_id
      in: path
      required: true
    - name: token
      in: query
      required: true
    - name: start_time
      in: query
      required: false
      format: YYYY-MM-DDTHH:MM:SSZ
    - name: end_time
      in: query
      required: false
      format: YYYY-MM-DDTHH:MM:SSZ
    docs: https://developer.validic.com/docs/using-the-status-event-api
    note: >-
      Returns the delivery status of individual push notification BATCHES over
      a time window - a genuine webhook-observability endpoint, which is more
      than most providers ship.
    host_discrepancy: >-
      This operation is documented against api.prod.validic.com, a FOURTH host
      that appears nowhere else in Validic's documentation, in either published
      OpenAPI, or in apis.yml. Recorded exactly as published; not reconciled,
      and not added as a baseURL, because no other Validic source names it.
  security:
    signature_verification: not documented
    retry_policy: not documented
    note: >-
      No webhook signing secret, HMAC header or replay-window is published, and
      no retry/back-off schedule is documented. For a HIPAA-regulated PHI
      delivery channel that is a notable omission in the public docs.
choosing_between_them:
  guidance_url: https://help.validic.com/space/VCS/3374284801/Streaming+API+vs+Push+Service
  summary: >-
    Both channels carry the same records. The Streaming API suits consumers
    that can hold an outbound long-lived connection and want control over
    replay; the Push Service suits consumers that would rather expose an
    endpoint and be delivered to. Validic steers whole-population retrieval to
    either of these and away from the REST API, which it explicitly says is not
    for bulk.
gap:
  summary: >-
    Two production event channels, four named SSE event types, a documented
    filter vocabulary and a batch-status API - and not one line of AsyncAPI.
    Everything needed to generate one already exists in the prose.
  what_would_close_it: >-
    An AsyncAPI 3.x document for streams.v2.validic.com describing the four
    event types and their payload schema, plus a webhook channel for the Push
    Service with a documented signature scheme.
maintainers:
- FN: Kin Lane
  email: kin@apievangelist.com