Walnut · AsyncAPI Specification

Walnut Webhooks

Version

View Spec View on GitHub Sales DemoInteractive DemosProduct DemosSales EnablementDemo AnalyticsGo-To-MarketAI-PoweredWebhookMCPAnalyticsAsyncAPIWebhooksEvents

AsyncAPI Specification

walnut-webhooks.yml Raw ↑
name: Walnut Webhooks
description: >-
  Walnut's outbound event surface. Two session-completion events are published with complete
  field tables and full example payloads: demo_session_finished and playlist_session_finished.
  Deliveries are HTTP POST with application/json, optionally signed with HMAC-SHA256 in an
  X-Walnut-Signature header, retried up to three times with exponential backoff, and can arrive
  out of order. Walnut publishes NO AsyncAPI document, no event catalog endpoint and no
  subscription API — webhooks are configured by an Admin in the application UI at
  Settings > Webhooks. This file is the webhook catalog, captured from the provider's own
  documentation; no AsyncAPI spec has been authored on Walnut's behalf.
generated: '2026-08-13'
method: searched
source: https://help.walnut.io/help/api/webhooks
docs: https://help.walnut.io/help/api/webhooks

asyncapi_published: false
asyncapi_probe:
  - url: https://help.walnut.io/openapi.yaml
    status: 404
  - url: https://customer-api.teamwalnut.com/openapi.json
    status: 403
  - url: https://app.teamwalnut.com/openapi.json
    status: 404
asyncapi_note: >-
  No AsyncAPI, event-catalog or CloudEvents document is served on any Walnut host. The event
  surface below is transcribed from Walnut's published payload tables and example bodies.

configuration:
  where: Walnut application, Settings > Webhooks
  api_managed: false
  required_role: Admin
  actions:
    - Create a webhook (endpoint URL)
    - Add signature verification (shared signing key)
    - Send a test event
    - Test connection
    - Edit
    - Reset key
    - Disable (toggle off)
    - Delete
  note: >-
    There is no API for creating, listing or rotating webhook subscriptions. Every operation is
    a click in the application UI.

delivery:
  transport: HTTP POST
  content_type: application/json
  expected_response: HTTP 200 or 201
  timeout_seconds: 30
  retries: 3
  retry_strategy: exponential backoff
  ordering_guaranteed: false
  ordering_note: >-
    Each event retries independently, so deliveries can arrive out of order. Walnut instructs
    consumers to build idempotent handlers and deduplicate on session_id + event.
  latency: >-
    Demo session events can take up to two hours, because some demo metrics are calculated after
    the session ends and Walnut only sends once the full payload is available.
  endpoint_requirements:
    - Must be publicly accessible.
    - Must accept application/json POST bodies.

security:
  signature_header: X-Walnut-Signature
  algorithm: HMAC-SHA256
  encoding: lowercase hexadecimal
  signed_content: the raw request body exactly as received
  key_management: >-
    Shared key per webhook, generated by Walnut. "Reset key" issues a new one and immediately
    invalidates the old one, so the receiving endpoint must be updated at the same moment.
  optional: true
  optional_note: >-
    Signature verification is opt-in. Walnut recommends it because a public endpoint can be
    reached by anyone, but a webhook created without it accepts unsigned deliveries.
  replay_protection: false
  replay_note: No timestamp header, nonce or tolerance window is documented, so signed replays are not prevented.

events:
  - name: demo_session_finished
    summary: Engagement data for a single completed interactive demo session.
    envelope:
      event: demo_session_finished
      timestamp: ISO 8601 datetime the event was logged and sent
      data: the demo session object
    payload_fields:
      - name: demo.id
        type: string (UUID)
        description: Unique identifier for the demo instance.
      - name: demo.name
        type: string
        description: Name of the demo.
      - name: demo.template_id
        type: string (UUID)
        description: ID of the template used to create the demo.
      - name: demo.template_name
        type: string
        description: Name of the source template.
      - name: demo.url
        type: string (URL)
        description: Direct URL to the demo on app.teamwalnut.com/player/.
      - name: demo_engagement.fab_clicks
        type: integer
        description: Floating action button clicks during the session.
      - name: demo_engagement.guides_completion_rate
        type: integer (percentage)
        description: Percentage of guides completed in the session.
      - name: demo_engagement.last_guide_shown
        type: string or null
        description: Last guide shown during the session.
      - name: demo_engagement.last_section_viewed
        type: string or null
        description: Last section or screen viewed.
      - name: demo_engagement.screen_completion_rate
        type: integer (percentage)
        description: Percentage of demo screens completed by the viewer.
      - name: demo_engagement.session_duration
        type: integer (seconds)
        description: Total demo session duration.
      - name: session_id
        type: string (UUID)
        description: Unique identifier for the session. Use with `event` for deduplication.
      - name: session_started
        type: datetime (ISO 8601)
        description: When the session began.
      - name: user.email
        type: string (email)
        description: Viewer email address, when available.
      - name: user.user_agent
        type: string
        description: Browser and device user agent string.
    field_count: 15
    pii: true
    pii_note: Carries viewer email address and user agent.
  - name: playlist_session_finished
    summary: >-
      Session data for a playlist experience, which may bundle demos, videos, PDFs and other
      assets. Carries playlist-level information plus an array of the individual items available
      in the experience.
    envelope:
      event: playlist_session_finished
      timestamp: ISO 8601 datetime the event was logged and sent
      is_test: boolean, true when sent as a test payload
      data: the playlist session object
    payload_fields:
      - name: playlist.id
        type: string (UUID)
        description: Unique identifier for the playlist.
      - name: playlist.name
        type: string
        description: Name of the playlist.
      - name: playlist.description
        type: string
        description: Description of the playlist.
      - name: playlist.url
        type: string (URL)
        description: Direct link to the playlist.
      - name: items[].id
        type: string
        description: Unique identifier for an item inside the playlist.
      - name: items[].name
        type: string
        description: Name of the playlist item.
      - name: items[].description
        type: string
        description: Description of the playlist item.
      - name: items[].type
        type: string
        description: Asset type — video, pdf, demo, and similar.
      - name: items[].duration_secs
        type: integer
        description: Duration of the item in seconds, when applicable.
      - name: items[].number_of_views
        type: integer
        description: Total views recorded for the item.
      - name: items[].position
        type: integer
        description: Order of the item within the playlist.
      - name: items[].selected
        type: boolean
        description: Whether the item was selected in the session context.
      - name: items[].visited
        type: boolean
        description: Whether the item was visited during the session.
      - name: items[].demo_id
        type: string or null
        description: Demo ID for the item, when the item is tied to a demo.
      - name: items[].file_url
        type: string (URL)
        description: Source file URL for the item, when available.
      - name: items[].screenshot_uri
        type: string (URL)
        description: Screenshot or thumbnail URL for the item.
      - name: session_id
        type: string (UUID)
        description: Unique identifier for the playlist session.
      - name: session_started
        type: datetime (ISO 8601)
        description: When the session began.
      - name: session_ended
        type: datetime (ISO 8601)
        description: When the session ended.
      - name: session_duration_secs
        type: integer (seconds)
        description: Total playlist session duration.
      - name: user.email
        type: string (email)
        description: Viewer email address, when available.
      - name: user.domain
        type: string
        description: Viewer's organization domain.
      - name: user.identification_method
        type: string
        description: How Walnut identified the viewer, e.g. email_gate.
      - name: user.ip
        type: string
        description: Viewer IP address.
      - name: user.type
        type: string
        description: Viewer type classification, e.g. external.
      - name: user.user_agent
        type: string
        description: Browser and device user agent string.
    field_count: 26
    pii: true
    pii_note: Carries viewer email address, organization domain, IP address and user agent.

event_count: 2

testing:
  test_event: true
  test_event_control: '"Send a test event" button in Settings > Webhooks'
  test_flag: is_test
  test_flag_note: >-
    Documented on the playlist session payload. The demo session example does not show it.

gaps:
  - No AsyncAPI, CloudEvents or JSON Schema document for either payload.
  - No API to create, list, rotate or delete webhook subscriptions — UI only.
  - >-
    No event-type selection is documented. Both events appear to be sent to any configured
    endpoint; there is no subscribe-to-specific-events control in the published guide.
  - No delivery-log, replay or redrive facility is documented.
  - No timestamp/nonce header, so a captured signed delivery can be replayed.
  - >-
    The two payload shapes do not agree with each other or with the Customer Data API. Webhooks
    use nested objects (demo.id, user.email); the REST API uses flat snake_case (demo_id,
    user_email); the webhook demo payload has no company_id, geography or lead-form fields;
    the REST session object has no template_id, fab_clicks or guides_completion_rate.
    A consumer joining the two surfaces must map fields by hand.