Vidyard · AsyncAPI Specification
Vidyard Webhooks
Version
View Spec
View on GitHub
VideoVideo PlatformVideo AnalyticsVideo SharingSales VideoCRM IntegrationMarketingAI VideoWebhookAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-13'
method: searched
source: https://knowledge.vidyard.com/hc/en-us/articles/360009879654-How-to-use-the-analytics-subscription-webhook
spec_type: null
spec_note: >
Vidyard publishes NO AsyncAPI document. /asyncapi.yaml and /asyncapi.json 404
on every host and the GitHub org carries no event schema. What Vidyard does
publish is a complete, well-specified webhook catalog with verbatim payload
examples and a field glossary — captured here as a Webhooks surface rather
than fabricating an AsyncAPI from it.
description: >
Vidyard has two distinct event surfaces. The Analytics Webhook is a
subscription-managed push of viewer engagement data (three event types),
administered either from the Vidyard UI or through a small REST API on
analytics-api.vidyard.com. Separately, individual videos and players accept a
per-object webhook_url callback for asset-lifecycle notifications, and the
Video Agent API accepts a webhook_url for generation-complete callbacks.
surfaces:
- name: Analytics Webhook
kind: subscription
transport: HTTP POST
content_type: application/json
base_url: https://analytics-api.vidyard.com/v1
docs: https://knowledge.vidyard.com/hc/en-us/articles/360009879654-How-to-use-the-analytics-subscription-webhook
postman: https://vy-docs.s3.amazonaws.com/postman/VidyardAnalyticsWebhooks.postman_collection.json
scoping: >
A subscription is bound to the folder implied by the API token used to
create it. Subfolders inherit the webhook from their immediate parent, so
one subscription can cover a whole branch of the folder tree.
permissions:
ui: Edit Integrations
api: Edit API Tokens
verification:
mechanism: shared secret
field: security_key
description: >
A caller-supplied shared secret echoed on delivery so the receiver can
confirm the request originated from Vidyard. NOTE — this is a plaintext
echoed secret, not an HMAC request signature; there is no published
signing algorithm, timestamp, or replay defense.
source_ips:
- 54.164.55.156
- 54.165.206.34
- 54.164.57.33
- 52.206.52.245
- 35.153.110.215
- 50.17.20.255
management_operations:
- method: POST
path: /v1/integrations/webhooks
summary: Create a subscription
request_fields: [url, security_key, event_subscriptions]
response: '{ "webhook_id": 123456 }'
- method: GET
path: /v1/integrations/webhooks
summary: List all subscriptions for the API token
response_fields: [id, url, security_key, is_valid, event_subscriptions]
- method: PUT
path: /v1/integrations/webhooks/{webhook_id}
summary: Update url, security_key or event_subscriptions
- method: DELETE
path: /v1/integrations/webhooks/{webhook_id}
summary: Delete a subscription
events:
- type: view
label: Percent watched
description: >
Percentage-milestone progress. Fires at 0, 25, 50, 75 and 100 — a full
watch therefore delivers five separate payloads. Milestones are
cumulative-amount based, not position based: watching the first 10%
then skipping ahead to watch another 15% triggers the 0 and 25 events.
cardinality: up to 5 per view
fields:
- {name: type, type: string}
- {name: timestamp, type: string, format: iso8601}
- {name: request_id, type: string}
- {name: visitor_vidyard_uuid, type: string}
- {name: organization_id, type: string, description: ID of the folder where the webhook is set up}
- {name: organization_name, type: string}
- {name: player_uuid, type: string}
- {name: player_name, type: string}
- {name: video_id, type: string}
- {name: video_name, type: string}
- {name: percent_watched, type: integer}
- {name: player_load_id, type: string, description: Unique per player load; a change indicates a new session or page refresh}
- {name: player_load_metadata, type: object, description: Custom data passed through via the vydata parameter}
- {name: account_id, type: string, description: Unique ID of the top-level folder in the account}
- {name: embed_url, type: string, description: Where the video was watched; UTM values preserved, other query strings stripped}
- {name: player_organization_id, type: string, description: Folder where the video itself lives}
- type: attention_span
label: Attention span
description: >
How many times a unique viewer watched each second of a video on a
given day. Delivered as an array of up to 200 buckets; videos longer
than 200 seconds are divided into 200 equal segments instead.
cardinality: one per viewer per day
fields:
- {name: type, type: string}
- {name: attention_span, type: object, description: Map of segment index to watch count, up to 200 entries}
- {name: day, type: string, format: iso8601, description: Date the attention_span set was calculated}
- {name: timestamp, type: string, format: iso8601}
- {name: request_id, type: string}
- {name: visitor_vidyard_uuid, type: string}
- {name: organization_id, type: string}
- {name: organization_name, type: string}
- {name: player_uuid, type: string}
- {name: player_name, type: string}
- {name: video_id, type: string}
- {name: video_name, type: string}
- {name: player_load_id, type: integer}
- {name: player_load_metadata, type: object}
- {name: account_id, type: string}
- type: identified_view
label: Identified view
description: >
A view resolved to a viewer email address. Queued when playback
starts and delivered only after a wall-clock duration equal to the
video length has elapsed, so percent_watched reflects the real
proportion watched. Fires exactly once — it does not re-fire on
resume or on later views within the same session.
cardinality: once per identified view
fields:
- {name: type, type: string}
- {name: timestamp, type: string, format: iso8601}
- {name: request_id, type: string}
- {name: visitor_vidyard_uuid, type: string}
- {name: organization_id, type: string}
- {name: organization_name, type: string}
- {name: account_id, type: string}
- {name: player_uuid, type: string}
- {name: player_name, type: string}
- {name: video_id, type: string}
- {name: video_name, type: string}
- {name: embed_url, type: string}
- {name: percent_watched, type: number}
- {name: player_load_id, type: string}
- {name: player_load_metadata, type: object}
- {name: player_organization_id, type: string}
- {name: email, type: string, description: Resolved viewer email address}
- name: Video Agent generation callback
kind: per-request callback
transport: HTTP POST
docs: https://knowledge.vidyard.com/hc/en-us/articles/42909331296411-Using-the-Vidyard-Video-Agent-API
trigger: >
Supplied as the optional webhook_url field on a Video Agent API call;
Vidyard POSTs to it once the personalized video has finished generating.
payload_fields:
- {name: lead_owner_email, type: string}
- {name: email, type: string}
- {name: campaign_id, type: string}
- {name: approval_status, type: string, description: e.g. approved — present when the optional approval workflow is enabled}
- {name: video_uuid, type: string}
- {name: vy_custom_id, type: string, description: URL-encoded string echoed back from the request}
- {name: thumbnail_url, type: string}
note: >
When the optional approval process is enabled (must be turned on by
Vidyard Support/CSM), the callback is withheld until the avatar owner
approves; a rejected video is deleted and nothing is ever delivered.
- name: Asset webhooks (per-object)
kind: per-object callback
transport: HTTP POST
docs: https://developer.vidyard.com/
description: >
The Dashboard API accepts a webhook_url attribute when creating a video,
and exposes dedicated operations for registering analytics and player
webhooks against an organization.
operations:
- method: POST
path: "/dashboard/v1/organizations/:organization_id/webhooks/analytics"
summary: Registers an analytics webhook
- method: DELETE
path: "/dashboard/v1/organizations/:organization_id/webhooks/analytics/:id"
summary: Deletes an analytics webhook
- method: POST
path: "/dashboard/v1/organizations/:organization_id/webhooks/players"
summary: Registers a webhook that listens to changes on players
- method: DELETE
path: "/dashboard/v1/organizations/:organization_id/webhooks/players/:id"
summary: Delete a webhook that listens to changes on players
operations_note: >
Paths transcribed verbatim from the four api_webhooks entries in the
Dashboard API reference at developer.vidyard.com. Vidyard uses Rails
`:param` path syntax throughout its published reference.
A per-video `webhook_url` attribute is additionally accepted on
POST /dashboard/v1/videos.
summary:
asyncapi_published: false
webhook_surfaces: 3
subscription_event_types: 3
signed_payloads: false
shared_secret: true
retry_policy: undocumented
delivery_guarantees: undocumented
gaps:
- No AsyncAPI document, so the event surface is not machine-readable.
- No HMAC request signing — verification relies on a plaintext echoed security_key.
- No published retry policy, backoff schedule, or delivery-failure semantics.
- is_valid appears on the subscription record but its failure semantics are not documented.