Wistia · AsyncAPI Specification

Wistia Webhooks

Version

View Spec View on GitHub Video HostingVideo MarketingVideo AnalyticsLead GenerationWebinarsB2B MarketingVideo CaptionsLocalizationMCPMedia ManagementAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-14'
method: searched
source: https://docs.wistia.com/docs/webhooks
docs: https://docs.wistia.com/docs/webhooks
description: >-
  Complete catalog of Wistia's documented webhook events, read from the provider's own event
  reference. Wistia publishes no AsyncAPI document — asyncapi/wistia-asyncapi.yml in this repo is an
  API Evangelist model of the media.* subset. This catalog is the authoritative list and covers all
  three event families: media lifecycle, per-viewer viewing-session behaviour, and live-event
  registration. The viewing_session family is the one most often missed and is the most
  interesting: it turns Wistia into a behavioural event source, not just a media-state notifier.
transport:
  protocol: https
  method: POST
  content_type: application/json
  delivery: at-least-once
  batching: >-
    The body always contains an `events` ARRAY, even for a single event. Multiple events can be
    delivered in one POST.
  deduplication: on the per-event `uuid`
  ordering: by `generated_at` (ISO-8601, UTC)
  user_agent: Wistia-Webhooks/{VERSION}
  configuration_ui: https://my.wistia.com/account/webhooks
security:
  signature_header: X-Wistia-Signature
  algorithm: HMAC-SHA256 hexdigest
  signed_content: the raw POST body
  secret: the `secret_key` configured per webhook in Account Settings
  verification_example: |
    payload_body = request.body.read
    secret_key = SECRET_KEY_AS_DEFINED_IN_WISTIA
    signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secret_key, payload_body)
envelope:
  hook:
    uuid: A UUID identifying the webhook message.
  events:
    uuid: Universally-unique ID for this instance of the event. Only the first instance matters.
    type: The event type, e.g. media.updated.
    generated_at: When the event occurred in Wistia. Always ISO-8601, always UTC.
    payload: The event-specific data and the object it happened to.
    metadata:
      account_id: The Wistia account the event belongs to.
event_count: 17
events:
- name: media.created
  family: media
  description: A media is created.
  payload: [media, project]
- name: media.processing
  family: media
  description: Processing has started on a media.
  payload: [media, project]
- name: media.ready
  family: media
  description: >-
    Processing is complete and all dependent video and image assets have been successfully encoded.
    The media is ready for playback. This is the event to wait on before publishing an embed.
  payload: [media, project]
- name: media.failed
  family: media
  description: Processing of a media failed.
  payload: [media, project]
- name: media.updated
  family: media
  description: A media's attributes changed.
  payload: [media, project]
- name: media.deleted
  family: media
  description: A media was deleted.
  payload: [media, project]
- name: media.transcript_updated
  family: media
  description: >-
    A media's transcript changed. Carries the transcript ID, which is how a consumer keeps local
    caption records in sync. Also the completion signal for a captions purchase.
- name: media.transcript_failed
  family: media
  description: Transcript generation failed.
- name: media.translation_created
  family: media
  description: >-
    A transcript translation ordered via POST /medias/{mediaHashedId}/translate has completed.
- name: media.localization_created
  family: media
  description: >-
    A dubbed localization ordered via POST /medias/{mediaHashedId}/localizations has completed.
- name: media.localization_failed
  family: media
  description: A localization order failed.
- name: viewing_session.play
  family: viewing_session
  description: A viewer started playback in a viewing session.
- name: viewing_session.percent_watched
  family: viewing_session
  description: A viewing session crossed a watched-percentage threshold.
- name: viewing_session.turnstile.converted
  family: viewing_session
  description: A viewer converted on a Turnstile email-capture gate.
- name: viewing_session.call_to_action.converted
  family: viewing_session
  description: A viewer converted on a call-to-action.
- name: viewing_session.annotation.converted
  family: viewing_session
  description: A viewer converted on an annotation link.
- name: live_event.registration
  family: live_event
  description: >-
    Someone registered for a live event / webinar. Note the event name still uses the pre-2026-01
    "live_event" noun even though the REST resource was renamed to webinars.
families:
  media: 11
  viewing_session: 5
  live_event: 1
coverage_gap:
  asyncapi_models: 11
  catalog_documents: 17
  note: >-
    asyncapi/wistia-asyncapi.yml models the 11 media.* events only. The 5 viewing_session events and
    live_event.registration are documented by Wistia but not yet modeled there.
no_provider_asyncapi:
  checked: true
  note: >-
    No /asyncapi.yaml, /asyncapi.json or event catalog was found on wistia.com, api.wistia.com or
    docs.wistia.com, and none is referenced from the RFC 9727 api-catalog linkset — which lists only
    the OpenAPI service-desc and the MCP server card. Wistia's event surface is documented in prose
    and in the account UI, not in a machine-readable event description.
completion_signalling:
  note: >-
    Webhooks are the ONLY completion signal for paid asynchronous orders (captions purchase,
    translation, localization) — there is no polling endpoint for those. Bulk media operations
    (archive, restore, move, copy, swap, import) go the other way: they return a
    background_job_status object to poll and emit no completion webhook.
integrations:
  zapier: https://docs.wistia.com/docs/webhooks#connecting-to-zapier-example