Inbound direction: your system (Make, Zapier, CRM, custom backend) sends a POST to Webivio and creates a registration for a chosen session - same side effects as the registration form (notifications, CRM, and optional outbound webinar.registration.created).
This is not the same as outbound webhooks (Webivio -> your URL).
For webinar series, see Series registration below.
Where to get the URL
- Webinar creator -> Finish step -> registration webhook section, or
- Settings -> Integrations -> Webhooks -> registration API / documentation section.
URL shape:
https://webivio.com/api/public/registration-webhook?webinarId={webinar-uuid}&token={secret}
webinarId- webinar UUIDtoken- per-webinar secret in the query string (no account Bearer / API key)
Interactive docs in the panel: /auth/settings/integrations/registration-api (you can paste your URL with token).
Endpoint
| Method | POST (also OPTIONS for CORS) |
| Path | /api/public/registration-webhook |
| Auth | Query: webinarId + token |
| Content-Type | application/json |
| CORS | Access-Control-Allow-Origin: * |
Body - single participant
Required: email and exactly one way to pick the session time.
| Field | Required | Aliases | Description |
|---|---|---|---|
email | Yes | buyer_email, customer_email, e-mail, mail | Participant email |
name | No | first_name, firstName, imie | First name |
surname | No | last_name, lastName, nazwisko | Last name |
phone | No | phone_number, phoneNumber, telefon | Phone |
selectedDate | Yes* | selected_date, webinarDate, date | ISO datetime with offset (preferred) |
instanceId | Yes* | instance_id | Existing instance UUID |
instanceDate + instanceTime | Yes* | instance_date, instance_time | YYYY-MM-DD + HH:mm |
userTimezone | No | user_timezone, timezone, timeZone | e.g. Europe/Warsaw |
utm_source etc. | No | camelCase (utmSource…) | Campaign UTMs |
urlParameters, referrer | No | snake_case | Extra context |
*Pick one session variant.
Example (single)
{
"email": "jane@example.com",
"name": "Jane",
"surname": "Doe",
"phone": "+48123456789",
"selectedDate": "2026-07-10T18:00:00+02:00",
"userTimezone": "Europe/Warsaw",
"utm_source": "make",
"utm_campaign": "july-campaign"
}
Body - bulk
{
"participants": [
{
"email": "anna@example.com",
"name": "Anna",
"selectedDate": "2026-07-10T18:00:00+02:00"
},
{
"email": "bob@example.com",
"name": "Bob",
"instanceId": "existing-instance-uuid"
}
]
}
Limit: max 50 participants per request.
Success response (single, HTTP 200)
{
"success": true,
"participantId": "550e8400-e29b-41d4-a716-446655440000",
"accessCode": "a1b2c3d4",
"instanceId": "660e8400-e29b-41d4-a716-446655440001",
"playerUrl": "https://player.webivio.com/start/?code=a1b2c3d4"
}
Bulk response (HTTP 200 when the request itself is valid)
{
"success": true,
"summary": { "success": 1, "failed": 1 },
"results": [
{
"email": "anna@example.com",
"success": true,
"participantId": "…",
"accessCode": "…",
"instanceId": "…",
"playerUrl": "…"
},
{
"email": "bad@example.com",
"success": false,
"error": "INVALID_EMAIL"
}
]
}
Root success is true when at least one registration succeeded.
Error codes
| HTTP | Meaning |
|---|---|
| 400 | Missing email, bad JSON, missing session, empty / too large participants |
| 403 | Bad token or inactive webinar |
| 404 | Webinar / instance not found |
| 409 | Email already registered for that session |
| 429 | Rate limit: RATE_LIMIT_EXCEEDED (+ Retry-After header) |
| 500 | Server error |
Default limits (per webinar): 50 requests / minute, 500 / hour.
Call examples
curl
curl -X POST \
"https://webivio.com/api/public/registration-webhook?webinarId=YOUR_WEBINAR_ID&token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"jane@example.com","name":"Jane","selectedDate":"2026-07-10T18:00:00+02:00"}'
PowerShell
$body = @{
email = "jane@example.com"
name = "Jane"
selectedDate = "2026-07-10T18:00:00+02:00"
} | ConvertTo-Json
Invoke-RestMethod `
-Method Post `
-Uri "https://webivio.com/api/public/registration-webhook?webinarId=YOUR_WEBINAR_ID&token=YOUR_TOKEN" `
-ContentType "application/json" `
-Body $body
Zapier (Zapier -> Webivio)
- Copy the registration webhook URL from the Webivio panel (with
webinarIdandtoken). - In Zapier: action Webhooks by Zapier -> POST (or Code if you build JSON manually).
- URL = the Webivio URL.
- Payload Type: JSON.
- Map fields from the previous step (Typeform / Sheets ->
email,name,selectedDate).
Make: HTTP -> Make a request -> POST to the same URL with a JSON body.
On success Webivio behaves like a form signup (email / SMS / CRM per webinar settings) and may emit outbound webinar.registration.created.
Security
- Treat
tokenlike a password - do not commit it to public repos. - A URL with token is enough to register on that webinar; do not expose it on a public front-end without controls.
- Token rotation in the UI may be limited - if you suspect a leak, contact support or regenerate per current panel options.
Series registration
Same pattern (token in URL, single/bulk, rate limit), but no date selection — Webivio computes sessions from the series schedule (FIXED / ROLLING).
Where to get the URL
- Series creator → Finish step → registration webhook section, or
- Series dashboard → Links → registration webhook section.
https://webivio.com/api/public/series-registration-webhook?seriesId={series-uuid}&token={secret}
seriesId— series UUIDtoken— per-series secret (registrationWebhookToken)
Endpoint
| Method | POST (also OPTIONS for CORS) |
| Path | /api/public/series-registration-webhook |
| Auth | Query: seriesId + token |
| Content-Type | application/json |
Body — single participant
Required: email. Date (selectedDate / instanceId) is not required.
{
"email": "john@example.com",
"name": "John",
"surname": "Smith",
"phone": "+15551234567",
"userTimezone": "America/New_York",
"utm_source": "make",
"utm_campaign": "series-launch"
}
Body — bulk
{
"participants": [
{ "email": "anna@example.com", "name": "Anna" },
{ "email": "bartek@example.com", "name": "Bartek", "userTimezone": "Europe/Warsaw" }
]
}
Limit: max 50 participants per request. Rate limit same as webinars: 50/min, 500/h (per series).
Success response (single)
{
"success": true,
"seriesRegistrationId": "550e8400-e29b-41d4-a716-446655440000",
"redirectUrl": "https://webivio.com/series-thankyou-page/…",
"sessions": [
{
"sortOrder": 1,
"participantId": "…",
"startTime": "2026-07-10T16:00:00.000Z",
"accessCode": "a1b2c3d4",
"playerUrl": "https://player.webivio.com/start/?code=a1b2c3d4"
}
]
}
On success Webivio behaves like a series form signup (series confirmation email, day-1 CRM integrations, outbound webinar.registration.created for day 1 with series_id / series_registration_id).
See also
- Outbound webhooks
- Panel:
/auth/settings/integrations/registration-api
Future ideas (non-production)
Today the API covers creating a participant / series registration (single/bulk). Ideas under consideration (no dates):
- account-level API key (Bearer) instead of query token only
- token rotation in the UI
- GET participants list / status
- cancel or update participant data
Idempotency-Keyheader
These are not product promises - only directions we collect from integration users.
Idempotency, time zones and 409
The endpoint does not support an Idempotency-Key header. Do not assume a retry after timeout is safe: store the result on your side and avoid automatic parallel retries.
A 409 (DUPLICATE_REGISTRATION) means that the same email is already registered for the same webinar instance. It does not mean the email is globally blocked across the webinar or series. The API does not update the existing record.
selectedDate and userTimezone do not simply override each other: the new time-zone system uses them together. If selectedDate has an offset, the code converts its time into userTimezone; without an offset, it treats the date and time as local in userTimezone. Send consistent values, preferably an offset-qualified ISO value and its matching IANA zone.