Stedi · AsyncAPI Specification

Stedi Event Destinations (webhooks)

Version 2026-02-01

Stedi publishes NO AsyncAPI document of its own. This document was assembled by API Evangelist from Stedi's own published sources: the V1EventPayload schema in Stedi's OpenAPI for the Events API, the destination management operations in the Event Destinations API, and the documented event-type catalog and delivery/retry rules. Every event name, field, header and retry interval below is Stedi's; nothing is invented. Stedi delivers thin events over HTTPS POST to a customer-configured destination URL and follows the Standard Webhooks signing spec.

View Spec View on GitHub EDIElectronic Data InterchangeHealthcareClearinghouseX12ClaimsEligibilityHIPAARevenue Cycle ManagementB2B IntegrationAsyncAPIWebhooksEvents

Channels

webhookDelivery
A single HTTPS POST carrying one thin event envelope. Stedi treats ONLY 2xx as success; 3xx, 4xx, 5xx and network failures all trigger a retry.

Messages

enrollmentActivated
Transaction enrollment activated
A transaction enrollment request reached LIVE status.
enrollmentRejected
Transaction enrollment rejected
A payer rejected a transaction enrollment request.
enrollmentUpdated
Transaction enrollment updated
An enrollment changed — status, payer, contacts or tasks.
enrollmentTaskAssigned
Enrollment task assigned
A new provider-action task was created on an enrollment.
enrollmentTaskCompleted
Enrollment task completed
The provider completed an assigned enrollment task.
enrollmentTaskDeleted
Enrollment task deleted
An enrollment task was superseded or removed.
eventPing
Ping
A validation test event used to confirm a destination is reachable.

Servers

https
events-api
Stedi's Event Destinations / Events API. Used to register a destination, read events, and retry deliveries. Not the transport for the events themselves.
https
customer-destination
The customer-owned HTTPS endpoint Stedi POSTs event payloads to. Registered with EventDestinationsCreateDestination; must match ^https://.+$.

AsyncAPI Specification

Raw ↑
asyncapi: 3.0.0
info:
  title: Stedi Event Destinations (webhooks)
  version: '2026-02-01'
  description: >
    Stedi publishes NO AsyncAPI document of its own. This document was assembled by API
    Evangelist from Stedi's own published sources: the V1EventPayload schema in Stedi's
    OpenAPI for the Events API, the destination management operations in the Event
    Destinations API, and the documented event-type catalog and delivery/retry rules. Every
    event name, field, header and retry interval below is Stedi's; nothing is invented. Stedi
    delivers thin events over HTTPS POST to a customer-configured destination URL and follows
    the Standard Webhooks signing spec.
  contact:
    name: Stedi Support
    url: https://www.stedi.com/support
    email: support@stedi.com
  externalDocs:
    url: https://www.stedi.com/docs/healthcare/event-destinations-event-types
x-provenance:
  generated: '2026-08-15'
  method: derived
  provider_publishes_asyncapi: false
  source:
  - openapi/stedi-events-api-openapi.yml
  - openapi/stedi-event-destinations-api-openapi.yml
  - https://www.stedi.com/docs/healthcare/event-destinations-event-types
  - https://www.stedi.com/docs/healthcare/event-destinations-message-handling
  - https://www.stedi.com/docs/healthcare/event-destinations-configure
servers:
  events-api:
    host: events.us.stedi.com
    protocol: https
    pathname: /2026-02-01
    description: >
      Stedi's Event Destinations / Events API. Used to register a destination, read events, and
      retry deliveries. Not the transport for the events themselves.
  customer-destination:
    host: '{destinationUrl}'
    protocol: https
    description: >
      The customer-owned HTTPS endpoint Stedi POSTs event payloads to. Registered with
      EventDestinationsCreateDestination; must match ^https://.+$.
    variables:
      destinationUrl:
        description: The customer's own webhook receiver host and path.
        default: example.com/stedi-webhooks
defaultContentType: application/json
channels:
  webhookDelivery:
    address: '{destinationUrl}'
    title: Event destination delivery
    description: >
      A single HTTPS POST carrying one thin event envelope. Stedi treats ONLY 2xx as success;
      3xx, 4xx, 5xx and network failures all trigger a retry.
    servers:
    - $ref: '#/servers/customer-destination'
    messages:
      enrollmentActivated:
        $ref: '#/components/messages/enrollmentActivated'
      enrollmentRejected:
        $ref: '#/components/messages/enrollmentRejected'
      enrollmentUpdated:
        $ref: '#/components/messages/enrollmentUpdated'
      enrollmentTaskAssigned:
        $ref: '#/components/messages/enrollmentTaskAssigned'
      enrollmentTaskCompleted:
        $ref: '#/components/messages/enrollmentTaskCompleted'
      enrollmentTaskDeleted:
        $ref: '#/components/messages/enrollmentTaskDeleted'
      eventPing:
        $ref: '#/components/messages/eventPing'
operations:
  receiveEvent:
    action: receive
    channel:
      $ref: '#/channels/webhookDelivery'
    title: Receive a Stedi event
    summary: >
      Stedi POSTs the event envelope to the destination URL. The consumer verifies the
      webhook-signature header, deduplicates on webhook-id, and then fetches current resource
      state from the REST API using resource.id — the payload is deliberately thin.
    messages:
    - $ref: '#/channels/webhookDelivery/messages/enrollmentActivated'
    - $ref: '#/channels/webhookDelivery/messages/enrollmentRejected'
    - $ref: '#/channels/webhookDelivery/messages/enrollmentUpdated'
    - $ref: '#/channels/webhookDelivery/messages/enrollmentTaskAssigned'
    - $ref: '#/channels/webhookDelivery/messages/enrollmentTaskCompleted'
    - $ref: '#/channels/webhookDelivery/messages/enrollmentTaskDeleted'
    - $ref: '#/channels/webhookDelivery/messages/eventPing'
components:
  messages:
    enrollmentActivated:
      name: enrollment.activated
      title: Transaction enrollment activated
      summary: A transaction enrollment request reached LIVE status.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
    enrollmentRejected:
      name: enrollment.rejected
      title: Transaction enrollment rejected
      summary: A payer rejected a transaction enrollment request.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
    enrollmentUpdated:
      name: enrollment.updated
      title: Transaction enrollment updated
      summary: An enrollment changed — status, payer, contacts or tasks.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
    enrollmentTaskAssigned:
      name: enrollment.task.assigned
      title: Enrollment task assigned
      summary: A new provider-action task was created on an enrollment.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
    enrollmentTaskCompleted:
      name: enrollment.task.completed
      title: Enrollment task completed
      summary: The provider completed an assigned enrollment task.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
    enrollmentTaskDeleted:
      name: enrollment.task.deleted
      title: Enrollment task deleted
      summary: An enrollment task was superseded or removed.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
    eventPing:
      name: event.ping
      title: Ping
      summary: A validation test event used to confirm a destination is reachable.
      contentType: application/json
      headers:
        $ref: '#/components/schemas/DeliveryHeaders'
      payload:
        $ref: '#/components/schemas/V1EventPayload'
  schemas:
    DeliveryHeaders:
      type: object
      description: Headers Stedi sends on every delivery attempt.
      properties:
        webhook-id:
          type: string
          description: Unique message identifier, formatted msg_{UUID}. Deduplicate on this.
          pattern: ^msg_
        webhook-signature:
          type: string
          description: >
            Standard Webhooks signature, formatted v1,{signature}. HMAC-SHA256 over
            "{webhook-timestamp}.{raw body}" keyed with the destination signing secret
            (whsec_...). Compare in constant time.
        webhook-timestamp:
          type: string
          description: Unix timestamp of event creation. Validate against a tolerance window.
        event-id:
          type: string
          description: The event identifier, evt_{UUID}.
        destination-id:
          type: string
          description: The event destination identifier, dst_{UUID}.
        attempt-number:
          type: integer
          description: Delivery attempt count, starting at 1.
        attempt-type:
          type: string
          enum: [AUTOMATIC, MANUAL]
          description: Whether this attempt is an automatic retry or an operator-triggered one.
      required: [webhook-id, webhook-signature, webhook-timestamp]
    V1EventPayload:
      type: object
      description: >
        Stedi's v1 THIN event envelope, copied from the V1EventPayload schema in
        openapi/stedi-events-api-openapi.yml. It signals a state change only; consumers fetch
        current state from the REST API using resource.id.
      properties:
        account:
          type: string
          description: Stedi account identifier (UUID).
        created:
          type: string
          format: date-time
          description: ISO 8601 timestamp of event creation.
        environment:
          type: string
          enum: [TEST, PRODUCTION]
          description: The environment in which the event was produced.
        id:
          type: string
          description: Event identifier, formatted evt_{UUID}.
        object:
          type: string
          enum: [v1.event]
          description: Object-type discriminator identifying the payload schema version.
        resource:
          $ref: '#/components/schemas/EventPayloadResourceRef'
        relatedResources:
          type: array
          description: Other related resources. Only present when there are related resources.
          items:
            $ref: '#/components/schemas/EventPayloadResourceRef'
        type:
          type: string
          description: The event type name, such as enrollment.activated.
      required: [account, created, environment, id, object, resource, type]
    EventPayloadResourceRef:
      type: object
      description: A reference to a resource affected by an event.
      properties:
        id:
          type: string
          description: The resource identifier.
        type:
          type: string
          description: >
            The resource type, dot-notated for nesting — e.g. enrollment.document indicates a
            document associated with a transaction enrollment request.
      required: [id, type]
x-delivery:
  transport: https-post
  success_criteria: 2xx only
  retry_intervals: [5m, 30m, 2h, 8h, 24h, 48h]
  retry_exhaustion: Stedi disables the event destination after 48 hours of failed attempts.
  failure_notifications: Notifications are sent after 2 hours and after 24 hours of repeated failures.
  deduplication: Track the webhook-id (msg_{UUID}); manual and automatic retries can redeliver.
  ordering: Not guaranteed. Stedi's guidance is to re-read resource state rather than assume order.
  signing:
    spec: https://www.standardwebhooks.com/
    algorithm: HMAC-SHA256
    signed_content: '{webhook-timestamp}.{raw request body}'
    secret_format: ^whsec_[A-Za-z0-9+/=]+$
    secret_operations: [EventDestinationsGetDestinationSecret, EventDestinationsRotateDestinationSecret]
  concurrency:
    default_per_destination: 5
    account_maximum: 20
    note: Exceeding the account maximum on create/update returns 400. Contact Stedi to change limits.
  retention: 30 days by default
x-management-api:
  spec: openapi/stedi-event-destinations-api-openapi.yml
  operations:
  - EventDestinationsCreateDestination
  - EventDestinationsListDestinations
  - EventDestinationsGetDestination
  - EventDestinationsUpdateDestination
  - EventDestinationsDeleteDestination
  - EventDestinationsGetDestinationSecret
  - EventDestinationsRotateDestinationSecret
  events_spec: openapi/stedi-events-api-openapi.yml
  events_operations: [ListEvents, GetEvent, RetryEvent]
x-coverage-note: >
  The published event catalog covers transaction ENROLLMENT only, plus a ping. Claims,
  eligibility, remittance and claim-status results are NOT delivered as events on this surface;
  integrators poll the REST APIs (or the EDI-platform transaction.processed.v2 EventBridge
  events on the core platform) for those. That is the gap an agent needs to know about.