Walnut · AsyncAPI Specification
Walnut Webhooks
Version
View Spec
View on GitHub
Sales DemoInteractive DemosProduct DemosSales EnablementDemo AnalyticsGo-To-MarketAI-PoweredWebhookMCPAnalyticsAsyncAPIEvents
AsyncAPI Specification
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.
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.