API
Registrations
Who registered, what they did, corrections, new links, and erasing someone's data.
A registration is somebody signing up for a webinar, through the form, a paid ticket order or the API, with what they typed and where they came from. The same person registering again is another registration. Creating one is the webinar’s route (see Create a registration).
Where it sits depends on the webinar. On an evergreen, the time it picked, its
webinarEvergreenRegistration. On a launch it can open every date not called off, and
each one it has opened, or whose replay it has, is an entry of its
webinarLaunchSessionRegistrations, empty until then. It carries one or the other, and
that is also where what they did is kept.
/public/v1/webinar-registrationsAcross every webinar of the organization, or one’s by webinarId.
| Filter | Narrows to |
|---|---|
webinarId |
One webinar’s. |
name, email |
Containing it. |
phone |
Digits contained in the whole number; phoneCc the calling code exactly. |
timezone |
Exactly. |
source, medium, campaign, content, term |
The UTM tag exactly. |
webinarLaunchSessionId |
Those who entered this session of a launch. |
watchedSeconds |
Who watched at least this long: the longest play of each session and of each replay, added. |
createdAtFrom, createdAtTo |
Registered in the span. |
startsAtFrom, startsAtTo |
Those whose seat starts in the span: an evergreen’s time, or a launch’s session. |
One registration
Section titled “One registration”/public/v1/webinar-registrations/:webinarRegistrationId| Field | What it is |
|---|---|
id, organizationId, webinarId |
|
firstName, lastName, name |
name is the two together. |
email, phoneCc, phoneNumber, phone |
phone is the two together, +5511987654321; all three empty where none was given. |
country |
Where they registered from, as read off their address; absent where it could not be. |
timezone |
The clock their sessions are read in. |
source, medium, campaign, content, term |
The page’s UTM tags when they registered. |
webinarEvergreenRegistration |
On an evergreen, the time they picked (below). Absent on a launch. |
webinarLaunchSessionRegistrations |
On a launch, the sessions they entered, soonest first (below). Absent on an evergreen. |
webinarTicketOrderId |
The ticket order they were created from, on a webinar that charges; absent where it is free. |
abTestId |
The A/B test that dealt the form they registered through — on a paid webinar, the form their ticket order was sent from. Absent where no test dealt it, and where they did not come through a form: the dashboard, this API, an order made without one. |
accessToken |
What opens their pages beside their id — below. Made anew with a new access token. |
conversionCode |
What a checkout link of your own carries to name them: ?sck=r{conversionCode} (with the r), so a Hotmart sale made through it is counted as theirs. In an automation, ?sck=r{{webinarRegistration.conversionCode}}. |
anonymized |
Whether what identified them was erased; firstName to phone are then empty. |
ticketRefunded |
Whether the ticket order that made it was refunded; its watch pages no longer open. |
createdAt |
When they registered. |
webinarEvergreenRegistration:
| Field | What it is |
|---|---|
id, webinarRegistrationId |
|
startsAt |
The time they picked. Waiting, running and over come from it and the length of the video published, nothing stored saying so. |
selectedSchedule |
The entry of the webinar’s schedule that names that time, worked out by Sparkwebinar: type, standardCron or justInTimeCron, and value, the cron as the webinar held it. The just-in-time cron names only its next time, and takes that time whatever else names it. Theirs, whatever the schedule becomes. |
webinarPlayerPageViews |
Each opening of the watch page or of the replay’s: kind session or replay, openToWatch whether it could be watched then, a gate ahead of the time being no, and when. |
webinarPlays |
Each play on those pages, session and replay alike, with watchedSeconds, and, on one registration’s read, the offers they clicked. |
createdAt |
When they registered. |
Each entry of webinarLaunchSessionRegistrations:
| Field | What it is |
|---|---|
id, webinarRegistrationId |
|
webinarLaunchSessionId |
The session. |
sessionStartsAt |
When that session starts. |
sessionStatus |
How that session stands: open, canceled or closed. An open one is on from sessionStartsAt. A session canceled stays in the list. |
webinarPlayerPageViews, webinarPlays |
What they did on that session’s pages, as above. |
createdAt |
When they joined that session, later than the registration for a date added after it. |
webinarPlayerPageViews and webinarPlays come on the list and on one
registration’s read. They are absent from the answer to a create or a correction,
and from a webhook’s body.
On a launch:
{ "id": 109, "webinarId": 12, "email": "ana@example.com", "webinarLaunchSessionRegistrations": [ { "id": 301, "webinarRegistrationId": 109, "webinarLaunchSessionId": 412, "sessionStartsAt": "2026-11-10T22:00:00.000Z", "sessionStatus": "open", "webinarPlayerPageViews": [], "webinarPlays": [], "createdAt": "2026-10-20T14:02:11.000Z" }, { "id": 302, "webinarRegistrationId": 109, "webinarLaunchSessionId": 413, "sessionStartsAt": "2026-11-12T22:00:00.000Z", "sessionStatus": "open", "webinarPlayerPageViews": [], "webinarPlays": [], "createdAt": "2026-10-20T14:02:11.000Z" } ], "...": "..."}On an evergreen:
{ "id": 110, "webinarId": 13, "email": "ana@example.com", "webinarEvergreenRegistration": { "id": 88, "webinarRegistrationId": 110, "startsAt": "2026-11-10T22:00:00.000Z", "selectedSchedule": { "type": "standardCron", "value": "0 19 * * *" }, "webinarPlayerPageViews": [], "webinarPlays": [], "createdAt": "2026-10-20T14:02:11.000Z" }, "...": "..."}Their pages open by their id and their access token, on the watch host,
https://dev.watch.sparkwebinar.io or the domain of your own the webinar is on:
/session/<id>?accessToken=<accessToken> and
/replay/<id>?accessToken=<accessToken>. There is one link per registration,
however many sessions it is in: on an evergreen, it opens their time; on a launch, the session link opens the session on
air, or else the next one, or else the last one over, and the replay link opens the
last one over. A survey opens at
/response/<surveyId>/<id>?accessToken=<accessToken> on the surveys host, the same
way. The token is theirs: a link with it opens their pages. The page takes it
off its address as it opens and keeps it in that browser tab, so reloading it
still works; the address left in the bar opens nothing anywhere else.
New access token
Section titled “New access token”/public/v1/webinar-registrations/:webinarRegistrationId/access-tokenMakes their accessToken anew, for a link that got out: every link with the
old one, watch pages and surveys, opens nothing from now on, pages already
open included. The answer is the registration with the new token, for the
links you send from here on. Nothing is sent to them.
| Status | infoCode |
Why |
|---|---|---|
| 409 | WEBINAR_REGISTRATION_ANONYMIZED |
The registration was anonymized: it has no pages to open. |
Correct
Section titled “Correct”/public/v1/webinar-registrations/:webinarRegistrationIdAny of firstName, lastName, email, phoneCc, phoneNumber,
timezone, the UTM tags, startsAt, whichever are sent. The phone is a
pair: a half sent is checked against the half that stays.
On an evergreen, sending another time of the webinar’s
schedule as startsAt moves them to that
time. It is read in the timezone sent, or the registration’s own, and checked
as a new registration’s is. What they did moves with them, and whatever was
counting from the old time, such as automations waiting for it, counts from the
new one.
| Status | infoCode |
Why |
|---|---|---|
| 400 | WEBINAR_SESSION_NOT_FOUND, WEBINAR_SESSION_STARTED |
As on a new registration. |
| 400 | WEBINAR_REGISTRATION_TOO_FAR_AHEAD |
A time more than 90 days from now. |
| 409 | WEBINAR_LAUNCH_SEAT_FIXED |
startsAt sent on a launch: a registration is in all of its sessions, and there is nothing to move. |
| 409 | WEBINAR_REGISTRATIONS_CLOSED |
The webinar’s registrations are closed, and nobody is seated at that time yet. |
| 409 | WEBINAR_REGISTRATION_ANONYMIZED |
The registration was anonymized. |
Anonymize
Section titled “Anonymize”/public/v1/webinar-registrations/:webinarRegistrationId/anonymizeWhat identified the person is erased for good, and nothing brings it back:
the name, e-mail and phone are blank — on the registration and on the
ticket order that made it —, the country and the avatar absent. Their chat
lines stay in no name, the comment beside their rating and their answers in
words to surveys are erased, what automations kept of them is erased and the
ones still under way are canceled, and the webhook deliveries that told of
them are gone. What was already sent to anyone else is theirs to erase.
The registration stays with anonymized: true, and counts as any other: in
the registrations quota, in its sessions and in every number, with its plays,
sales and rating, its UTM tags, and its time zone. Its watch and survey links open nothing.
Anonymizing one twice answers the same; correcting one is refused as
WEBINAR_REGISTRATION_ANONYMIZED (409).
A registration is never deleted.