Skip to content
Webinar · API reference

Webinar API documentation.

Drive Flaxxa Webinar from your own software: a REST API with workspace keys, signed webhooks and idempotency keys.

No credit card
Free plan
Cancel anytime
flaxxa.com / product / webinar / docs
cURLREST · JSON
# Flaxxa Webinar · first request
curl https://flaxxa.com/api/v1/webinar \
  -H "Authorization: Bearer $FLAXXA_KEY" \
  -H "Accept: application/json"

# webhooks: X-Flaxxa-Signature (HMAC-SHA256)
# retries: Idempotency-Key, 24 h
200 OKapplication/json
+ webhooks · HMAC-signed
REST
Requests per key by default
120/min
Idempotency window
24h
Quick start

How do I make my first API call?

Replace $FLAXXA_KEY with a key from your workspace. The first call returns a real id you can use for the next ones.

cURL
# 1. Create an evergreen (automated) webinar — returns a draft
curl -X POST https://flaxxa.com/api/v1/webinar/webinars \
  -H "Authorization: Bearer flx_live_YOUR_KEY" \
  -H "Accept: application/json" -H "Content-Type: application/json" \
  -d '{ "title": "Scaling with Flaxxa", "mode": "automated", "timezone": "Asia/Kolkata" }'

# 2. Set its premiere time, duration and just-in-time offset
curl -X PUT https://flaxxa.com/api/v1/webinar/webinars/42/schedule \
  -H "Authorization: Bearer flx_live_YOUR_KEY" \
  -H "Accept: application/json" -H "Content-Type: application/json" \
  -d '{ "starts_at": "2026-11-10T18:00", "duration_minutes": 45, "jit_offset_minutes": 5 }'

# 3. Read the audience and the live funnel
curl "https://flaxxa.com/api/v1/webinar/registrants?webinar_id=42&status=registered" \
  -H "Authorization: Bearer flx_live_YOUR_KEY" -H "Accept: application/json"
PHP
$webinar = Http::withToken(env('FLAXXA_WEBINAR_KEY'))->acceptJson()
    ->post('https://flaxxa.com/api/v1/webinar/webinars', [
        'title'    => "{$course->name} — live cohort",
        'mode'     => 'live',
        'timezone' => $tenant->timezone,
    ])->throw()->json('data');   // $webinar['id'], ['slug'], ['status']

$course->update(['flaxxa_webinar_id' => $webinar['id']]);
Python
import requests
r = requests.post("https://flaxxa.com/api/v1/webinar/webinars",
    headers={"Authorization": f"Bearer {KEY}", "Accept": "application/json"},
    json={"title": "Scaling with Flaxxa", "mode": "automated", "timezone": "Asia/Kolkata"})
r.raise_for_status()
webinar = r.json()["data"]
print(webinar["id"], webinar["status"])  # -> 42 draft
Request
POST /api/v1/webinar/webinars HTTP/1.1
Host: flaxxa.com
Authorization: Bearer flx_live_·············
Content-Type: application/json

{
  "title":    "Scaling with Flaxxa — October masterclass",
  "mode":     "automated",
  "timezone": "Asia/Kolkata"
}
Response · 201
HTTP/1.1 201 Created
Content-Type: application/json

{
  "data": {
    "id": 42, "slug": "scaling-with-flaxxa-october-masterclass",
    "title": "Scaling with Flaxxa — October masterclass",
    "mode": "automated", "status": "draft",
    "timezone": "Asia/Kolkata", "is_paid": false,
    "created_at": "2026-10-28T10:00:00+00:00"
  }
}
Authentication

How do I authenticate?

Every call requires Authorization: Bearer <key>. Rotate from workspace settings — old keys are revoked instantly. Server-side only; never ship a live key to the browser.

Base URLhttps://flaxxa.com/api/v1/webinar
Webinars

Webinars API

Create a webinar in any mode — `live`, `automated` (evergreen as-if-live), `jit` (just-in-time), `on_demand`, `hybrid` or `series` — then configure and publish it. A new webinar starts as a `draft`.

GET/webinars

List webinars

Paginated {data, …}. Orders by newest first.

POST/webinars

Create webinar

{ title, mode, description?, timezone?, scheduled_at?, settings? }. Returns the draft with id, slug, status.

GET/webinars/{id}

Retrieve webinar

The webinar with its settings.

PUT/webinars/{id}

Update webinar

title, mode, description, timezone, status. Moving status out of draft publishes it.

DELETE/webinars/{id}

Delete webinar

Soft-deletes (reversible).

Sessions & schedule

Sessions & schedule API

Live / hybrid / series webinars materialise one or more sessions; evergreen modes spawn a per-registrant session at sign-up. Set the premiere time and the just-in-time start offset here.

GET/webinars/{id}/sessions

List sessions

Scheduled occurrences with status, starts_at, ends_at.

POST/webinars/{id}/sessions

Add a session

{ starts_at, ends_at }.

PUT/webinars/{id}/schedule

Set schedule

{ starts_at, duration_minutes, jit_offset_minutes, automated_start_mode }. starts_at is a wall-clock in the webinar timezone.

DELETE/webinars/{id}/sessions/{session}

Cancel session

Cancels one occurrence.

Registrants

Registrants API

Your audience. People register on the public page (fires app.webinar.registrant.registered); you can also import, export and run GDPR operations.

GET/registrants

List registrants

Filter: webinar_id, status, q, date_from, date_to; paginated {data, meta}.

GET/registrants/export · /registrants/{id}/export

Export

CSV of the audience / full GDPR access payload for one registrant.

POST/webinars/{id}/registrants/import

Import CSV

Bulk-add registrants from parsed rows; duplicates skipped, capped by plan.

POST/registrants/bulk

Bulk action

{ action: unsubscribe|resubscribe|erase, ids[] }.

DELETE/registrants/{id}

Erase (GDPR)

Anonymise + soft-delete a registrant.

Engagement & Q&A

Engagement & Q&A API

Review and answer questions across every session, and moderate a live session's chat and Q&A as host.

GET/webinars/{id}/questions

Q&A inbox

Every session's questions aggregated for the host.

POST/webinars/{id}/questions/{question}/answer

Answer

Answer from the inbox; optionally emails the attendee.

GET/webinars/{id}/sessions/{session}/engagement

Session room

A session's chat + Q&A for live monitoring.

POST/webinars/{id}/sessions/{session}/chat · …/chat/{message}/moderate

Host chat / moderate

Post as host; hide / pin a message.

Polls, CTAs & handouts

Polls, CTAs & handouts API

Host-defined interactions, timed by playback offset for evergreen viewers or pushed live during a broadcast.

POST/webinars/{id}/polls

Polls

GET to list, POST to create; POST /polls/{poll}/close, /launch to push live.

POST/webinars/{id}/ctas

CTAs

GET to list, POST to create; /ctas/{cta}/trigger, /stop during the broadcast.

POST/webinars/{id}/handouts

Handouts

GET to list, POST to create; /handouts/{handout}/release, /hide.

Analytics

Analytics API

Read-only funnel, drop-off and live dashboards. Analytics is core (not entitlement-gated).

GET/webinars/{id}/funnel

Funnel

Registration → attendance → engagement counts.

GET/webinars/{id}/sessions/{session}/dropoff · /live

Drop-off / live

Minute-by-minute retention curve; the live dashboard.

GET/analytics/cohort-retention

Cohort

Tenant-wide cohort retention.

Commerce, growth & surveys

Commerce, growth & surveys API

Paid-webinar pricing and orders, affiliates and short links, and surveys / quizzes.

GET/orders · /coupons

Orders & coupons

Paid-webinar merchant revenue.

PUT/webinars/{id}/pricing

Set pricing

Price a webinar (scope webinar.commerce.manage).

GET/affiliates · /short-links

Growth

Affiliates (+ tracking links) and vanity short links.

GET/surveys

Surveys

Surveys & quizzes with results.

Live broadcasting

Live broadcasting API

Drive a live or hybrid broadcast: readiness, go live, recording and RTMP simulcast. Live minutes, attendees per session and simulcast follow your plan.

GET/webinars/{id}/live-status

Readiness

Whether the room can go live + the current state.

POST/webinars/{id}/go-live · /end-broadcast

Go live / end

Start the broadcast (fires app.webinar.session.started) / end it (fires app.webinar.session.ended).

POST/webinars/{id}/recording/start · /stop · /pause · /resume

Recording

Control the room-composite recording.

PUT/webinars/{id}/rtmp-destinations

Simulcast destinations

{ destinations[] } — full RTMP URLs including the stream key.

POST/webinars/{id}/simulcast

Start / stop simulcast

POST to start streaming to the destinations, DELETE to stop. 402 when the plan doesn't include it.

Meetings

Meetings API

Interactive rooms where everyone can talk. Participants join at /m/{code}.

GET/meetings

List meetings

Scheduled and instant rooms.

POST/meetings · /meetings/instant

Create meeting

Schedule a room, or open one now.

POST/meetings/{id}/start · /end

Start / end

Open or close the room.

POST/meetings/{id}/breakouts

Breakout rooms

Open breakouts (participants spread round-robin); GET to list, DELETE to close.

POST/meetings/{id}/recording/start · /pause · /resume · /stop

Recording

Control the meeting recording.

Webhooks

Webhooks API

POST /api/v1/webhooks { url, subscribed_events[] } — deliveries carry X-Flaxxa-Event and X-Flaxxa-Signature (HMAC-SHA256 of the raw body with your endpoint secret).

POST/../webhooks

Subscribe

Scope workspace.webhooks.manage. The secret is returned once.

DELETE/../webhooks/{id}

Unsubscribe

Stops delivery.

Webhook events

Which webhook events can I subscribe to?

Subscribe via POST /webhooks. Verify X-Flaxxa-Signature on every payload.

  • app.webinar.webinar.created

    A webinar was created (as a draft).

  • app.webinar.webinar.published

    A webinar left draft — scheduled or live.

  • app.webinar.webinar.updated

    A webinar's details changed.

  • app.webinar.registrant.registered

    Someone registered on the public registration page.

  • app.webinar.session.started

    A live / premiere session went on air.

  • app.webinar.session.ended

    A session ended (its recording finalizes shortly after).

Errors

What errors can the API return?

All errors return a JSON envelope: { error: { code, message, details } }. Retry idempotent calls on 5xx with exponential backoff.

CodeNameWhen it fires
401unauthenticatedAPI key missing, expired or revoked.
403insufficient_scopeKey valid but lacks the scope — webinar.webinar.create to create, webinar.webinar.manage to change, webinar.webinar.view to read.
404not_foundNo webinar / session / registrant with that id in this workspace.
422validation_failed{ message, errors } — e.g. mode must be one of live, automated, jit, on_demand, hybrid, series.
429rate_limited120 requests/minute per key by default.
Conventions

Which rules apply to every request?

Every Flaxxa app's API follows the same authentication, rate limits, idempotency and webhook signing.

Bearer auth

Every API call uses a Bearer token. Keys belong to a workspace and are scoped per app. Create and revoke them from workspace API settings.

Rate limits

Each key can make 120 requests a minute unless the app sets its own limit. Going over returns 429 with a Retry-After header.

Idempotency

Send an Idempotency-Key header on a POST and a retry with the same key within 24 hours returns the first response instead of running again.

Signed webhooks

Every webhook payload carries an X-Flaxxa-Signature HMAC-SHA256 header made with the secret you get when you subscribe. Verify it before processing.

API FAQ

Flaxxa Webinar API: common questions

Frequently asked questions

Create an API key in your workspace and send it as a Bearer token. Each key carries scopes, such as webinar.webinar.create to create webinars or webinar.registrant.view to read registrants.

Get started in minutes

Ship faster with Flaxxa Webinar.

Create a workspace, make an API key in its settings, and send your first request.

Free plan · No credit card · Cancel anytime