Skip to content

API

Webinars

The webinars, a launch's sessions, and registrations made from outside.

A webinar is a shared root with one arm, told apart by scheduleMethod, made when it is created and never changed:

scheduleMethod Its arm What it is
launch webinarLaunch Fixed dates, each a session. webinarLaunch.method is live, transmitted on those dates, or recorded, a video of its own on each.
evergreen webinarEvergreen One video on a recurring schedule, always recorded.

On a launch, the sessions exist from the moment it is published, and a registration is in all of them, with nothing to pick. An evergreen has no sessions: the registrant picks a time of its schedule, kept as startsAt on their registration, and watches what is published at that moment.

GET/public/v1/webinars
Filter Narrows to
name Webinars whose dashboard name contains it.
scheduleMethod launch or evergreen.
launchMethod A launch’s live or recorded.
published true or false.
createdAtFrom, createdAtTo Made in the span.
GET/public/v1/webinars/:webinarId

The webinar whole, as the dashboard reads it. The fields worth knowing from outside:

Field What it is
id, name, title name is the dashboard’s label; title is what the pages show.
scheduleMethod launch or evergreen, which says which arm comes with it. Never changes.
webinarEvergreen An evergreen’s arm (below). Absent on a launch.
webinarLaunch A launch’s arm (below). Absent on an evergreen.
timezone The zone the schedule is written in, and read in unless an evergreen’s useWebinarRegistrationTimezone is on.
organizationCustomDomainId The watch domain of your own its pages open on (see Custom domains); absent, https://dev.watch.sparkwebinar.io.
formFields What the registration form asks, each with whether it is on and required. A launch’s form shows no schedule, whatever its entry says.
enableTicket, ticket Whether entry is paid for, and through which integration.
webinarRegistrationsCount How many have registered.
enableReplay, replayExpirationSeconds Whether a replay is offered after a session, and for how long.
published Turned off from the dashboard: it stops nothing, and only a webinar with its registrations closed and everything over is. While off, its registrations stay closed.
lastPublishedAt, createdAt, updatedAt Its instants.
registrationsClosed No new registration comes in, and the existing sessions go on. Set from the dashboard or by registrationsCloseAt. Always true on an unpublished webinar, and it stays so when the webinar is published again.
enableRegistrationsCloseAt, registrationsCloseAt Registrations close by themselves at this instant: registrationsClosed turns true and enableRegistrationsCloseAt turns false, once. Without it, only the dashboard closes them, so a launch keeps taking registrations past its last date.
Field What it is
id, webinarId Its own number, not the webinar’s.
standardCrons Its times, each a time of day on some days (0 15 * * *). Empty on one with just-in-time times alone.
justInTimeCron Its just-in-time times: one every 15, 30 or 60 minutes, or on the hour, through a span of hours, every day (*/15 9-21 * * *, 0 9-21 * * *). Registrants are offered only the next one. null for none.
useWebinarRegistrationTimezone The schedule’s hours are read in each registrant’s own timezone instead of the webinar’s: 15:00 wherever they are.
organizationRecordingId, organizationRecording The video it plays, on every time and every replay. Swapping it keeps the offers, the imported chat and the views.
viewsCount, originalStreamingViewsCount The plays counted, and the views of the live it was recorded from, as you informed them.
ctas Its offers.
enableRedirect, redirect Where the page goes as the video ends.
hideViewsCounter, dynamicViewsCounter The views badge under the player.

A time taken off the schedule only stops new registrations: those already in still watch. An evergreen can’t cancel a time.

Field What it is
id, webinarId Its own number, not the webinar’s.
method live: someone transmits each session. recorded: a video plays at each session’s time. Never changes.
sessions Its dates are its sessions: only the 100 starting latest, canceled ones among them, latest first: id, startsAt, status (open, canceled, closed), closedAt, organizationRecordingId and the rest. Don’t count from this: Sessions lists them all, a page at a time, by status and date.
sessionsCount How many sessions it has in all, canceled ones too.
enableRedirect, redirect A live launch’s: where the page goes as a session ends. Always off on a recorded launch.
hideViewsCounter, dynamicViewsCounter A live launch’s views badge. Always off on a recorded launch.

A session’s organizationRecordingId names the video it plays, and its ctas are its offers. The chat is not read through this API.

  • On a recorded launch, each session has its own from the moment it is published: its own video, offers and chat. Its enableRedirect, redirect, hideViewsCounter and dynamicViewsCounter are read on the session in sessions, not on the launch.
  • On a live launch, a session’s video is created as it starts, and those four fields are read on the launch.
GET/public/v1/webinars/:webinarId/launch-sessions

A launch’s sessions, in the order they start: these are its dates. Each is created when a date is published, and everyone already registered is in it. A session canceled before it started stays, canceled, and that exact date can’t be published again. A session’s date never changes, and one that has started can’t be changed or canceled.

An evergreen has no sessions, and is answered with none: its times are its schedule, and each registration’s is on the registration.

Filter Narrows to
status open, canceled or closed. Canceled ones are listed with the rest unless you filter.
startsAtFrom, startsAtTo Starting in the span: startsAtFrom on or after it, startsAtTo before it.
GET/public/v1/webinars/12/launch-sessions?status=open&startsAtFrom=2026-11-02T00:00:00Z
{
"data": [
{ "id": 412, "webinarLaunchId": 7, "startsAt": "2026-11-10T22:00:00.000Z", "status": "open", "createdAt": "2026-10-20T14:02:11.000Z" }
],
"metadata": { "list": { "pagination": { "page": 1, "size": 20 }, "total": 1 } }
}
Field What it is
id, webinarLaunchId id is the webinarLaunchSessionId in a registration’s webinarLaunchSessionRegistrations. webinarLaunchId is the launch’s own number, webinarLaunch.id, not the webinar’s. What it plays is on the webinar’s read, not here.
startsAt When it starts.
status open until it ends, closed once over, canceled where it was called off. An open session is on from startsAt: nothing stored says so.
canceledAt, closedAt When it was canceled or closed; absent until then.
createdAt When it was created, as its date was published.
POST/public/v1/webinars/:webinarId/registrations

A registration made from your own system, the same as one made through the form: it is written with an access token of its own, and whatever its creation sets off, your automations and your webhooks, follows.

Where it sits depends on the webinar’s scheduleMethod.

On a launch, every session that is not canceled, the ones already over included, since their replays are the registrant’s too, and any date added later. There is nothing to pick: send no startsAt. A launch takes registrations past its last date, until they are closed.

On an evergreen, the time at startsAt, which has to be a time of the schedule: read it from standardCrons and justInTimeCron, in the webinar’s timezone or, with useWebinarRegistrationTimezone on, the registrant’s. A time already running takes a place in it, late. Sparkwebinar works out which entry of the schedule names the time and keeps it as the registration’s selectedSchedule. The just-in-time cron names only its next time, counted from when the request comes in; its later times are not times of the schedule, unless a timed cron names them.

Field What it is
firstName required
email required
lastName Empty where not sent.
phoneCc, phoneNumber The calling code with its plus, +55, and the digits after it, 11987654321. Both or neither.
timezone An IANA zone, America/Sao_Paulo: the clock their sessions are read in. The webinar’s own where not sent. Required on an evergreen with useWebinarRegistrationTimezone on, since startsAt is read in it.
source, medium, campaign, content, term UTM tags: whatever brought them. Empty where not sent.
startsAt required on an evergreen An instant, a time of the schedule, no more than 90 days from now. A launch sends none.

On an evergreen:

{ "firstName": "Ana", "lastName": "Silva", "email": "ana@example.com", "startsAt": "2026-11-04T18:00:00.000Z" }

On a launch:

{ "firstName": "Ana", "lastName": "Silva", "email": "ana@example.com" }

The answer is the registration, with its accessToken and where it sits. A second registration with the same e-mail is not refused: a registration is not a person. A webinar that charges for entry is not charged here.

Status infoCode Why
400 WEBINAR_SESSION_NOT_FOUND Evergreen: no startsAt, or the schedule does not name it (a later time of the just-in-time cron than its next, say). Launch: every session is canceled, so there is nothing to be in.
400 WEBINAR_SESSION_STARTED Evergreen: a time of the schedule already over.
400 WEBINAR_REGISTRATION_TOO_FAR_AHEAD Evergreen: a time more than 90 days from now.
400 VALIDATION_FAILED A field that does not fit: an invalid e-mail, half a phone, an unknown zone. Also no timezone on an evergreen that reads its schedule in each registrant’s own.
409 WEBINAR_REGISTRATIONS_CLOSED The webinar’s registrations are closed (registrationsClosed), whatever the time sent.
© 2026 Sparkwebinar. All rights reserved.