seminaraHelp

seminara.online Outbound Webhooks Specification

Authoritative reference for seminara.online outbound webhooks, CRM sync (HubSpot, Salesforce, Zapier), HMAC signature verification, and retry schedules.

Seminara provides enterprise-grade, real-time outbound webhooks adhering to the standard Webhooks specification. Connect HubSpot, Salesforce, Zapier, Make, custom backends, or internal CRM data pipelines to receive live presentation events and qualify leads automatically.

Supported Event Types

  • session.created: Fired when a new presentation session is created.
  • session.started: Fired when an attendee joins and Aura begins presenting.
  • session.completed: Fired when Aura concludes the presentation and delivers closing remarks.
  • attendee.joined: Fired when an attendee connects to the room.
  • attendee.left: Fired when an attendee disconnects.
  • lead.captured: Fired when an attendee provides contact information or shows high intent.
  • cta.clicked: Fired when an attendee clicks an in-session CTA button.

Subscription Management (API)

Manage webhook endpoints programmatically via the API:

  • Create Webhook: POST /api/v1/webhooks
    json
    {
      "url": "https://api.yourdomain.com/webhooks/seminara",
      "event_types": ["session.completed", "lead.captured", "cta.clicked"]
    }
    
  • List Subscriptions: GET /api/v1/webhooks
  • Delete Subscription: DELETE /api/v1/webhooks?id={subscription_id}

Webhook Headers & HMAC Signature Verification

Every outbound webhook delivery includes the standard 3-header specification:

http
webhook-id: msg_20260816_a1b2c3
webhook-timestamp: 1723800000
webhook-signature: v1,3k9Z...base64_hmac_sha256...==
Content-Type: application/json

Verifying Signatures in Node.js

ts
import crypto from 'crypto'

function verifySeminaraWebhook(
  rawBody: string,
  webhookId: string,
  webhookTimestamp: string,
  signatureHeader: string,
  secretKey: string
): boolean {
  const signedPayload = `${webhookId}.${webhookTimestamp}.${rawBody}`
  const expectedSig = crypto
    .createHmac('sha256', secretKey)
    .update(signedPayload)
    .digest('base64')

  const receivedSig = signatureHeader.replace(/^v1,/, '')
  return crypto.timingSafeEqual(
    Buffer.from(receivedSig),
    Buffer.from(expectedSig)
  )
}

Delivery Retries & Resilience

  • Attempt 1 Failure: Immediate retry scheduled at now() + 2 minutes.
  • Attempt 2 Failure: Retry scheduled at now() + 30 minutes.
  • Attempt 3 Failure: Event transitions to failed (dead-lettered) with zero further retries.
  • SSRF Protection: All destination hostnames are resolved against a real-time DNS blocklist at dispatch time.
  • Test Mode Suppression: Webhooks are strictly suppressed during private rehearsal test sessions to prevent polluting production data pipelines.