Walnut · AsyncAPI Specification

Walnut Webhooks

Version

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

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.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/walnut-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.