Skip to content

Register attendees for a webinar

POST
/webinar-registrants
curl --request POST \
--url https://api.nexacloser.com/v1/webinar-registrants \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "webinar_id": "wbn_6RLC77yktP", "registrants": [ { "first_name": "Dana", "last_name": "Levi", "email": "[email protected]", "phone": "+972501234567", "utm_source": "facebook", "page_url": "https://www.example.com/webinar?utm_source=facebook", "consent": { "granted": true, "text_shown": "I agree to get webinar reminders by WhatsApp and SMS.", "source": "landing_page" } }, { "email": "[email protected]", "first_name": "Avi" } ] }'

Registers one attendee or a batch of up to 100 for one of your webinars, exactly as the hosted registration form would: the contact is created or updated in the CRM, the attendee gets a session and a personal watch link, and the webinar’s automations run.

Pick the webinar with webinar_id or slug (webinar_id wins when both are sent). It must belong to the key’s workspace and be active.

Consent. A registrant with a phone number must carry consent.granted: true, or that registrant is refused with consent_required (the rest of the batch still goes through). Email-only registrants need no consent object.

Repeats. Registering the same person for the same session again is a success that returns the existing registration and link, with duplicate: true.

Each item in results succeeds or fails on its own; the call itself returns 200 once the batch is processed.

Media typeapplication/json
object
webinar_id

The webinar id (wbn_…). Wins over slug.

string
slug

The webinar’s slug in your workspace.

string
registrants
required
One of:

Send an email, a phone, or both.

object
first_name
string
last_name
string
full_name
string
email
string format: email
phone

Any format; E.164 is best.

string
phone_country_code

Country calling code when you collect it separately, e.g. 972.

string
phone_national

The national number when you collect it separately.

string
country
string
page_url

The landing page URL. Its query string is kept as the registration’s URL parameters when url_parameters is not sent.

string
url_parameters

The raw query string of the landing page (utm_*, click ids).

string
custom_fields

Extra answers from your form, by field key.

object
key
additional properties
any
utm_source
string
utm_medium
string
utm_campaign
string
utm_content
string
utm_term
string
referrer
string
locale

Registrant language, e.g. he or en.

string
timezone

IANA time zone, e.g. Asia/Jerusalem.

string
consent

Required (granted: true) when the registrant has a phone.

object
granted
boolean
text_shown

The exact wording shown next to the checkbox.

string
source

Where the opt-in was collected, e.g. landing_page.

string
at

When it was given. Default is now.

string format: date-time

Example

{
"webinar_id": "wbn_6RLC77yktP",
"registrants": [
{
"first_name": "Dana",
"last_name": "Levi",
"email": "[email protected]",
"phone": "+972501234567",
"utm_source": "facebook",
"page_url": "https://www.example.com/webinar?utm_source=facebook",
"consent": {
"granted": true,
"text_shown": "I agree to get webinar reminders by WhatsApp and SMS.",
"source": "landing_page"
}
},
{
"email": "[email protected]",
"first_name": "Avi"
}
]
}

The batch was processed. Check results for each registrant.

Media typeapplication/json
object
results
required
Array<object>
object
index
required

Position in your registrants array.

integer
ok
required
boolean
registration_id
string
personal_link_url

The attendee’s personal watch link.

string | null
duplicate

true when this person was already registered for the session.

boolean
error

When ok is false: consent_required, invalid_registrant, email_or_phone_required, valid email required (the webinar’s form requires an email), validation_failed (the webinar’s form rules), webinar_full or internal.

string
created
required
integer
duplicates
required
integer
failed
required
integer

Example

{
"results": [
{
"index": 0,
"ok": true,
"registration_id": "wbr_5D2AkHpKwL",
"personal_link_url": "https://app.nexacloser.com/j/wbr_5D2AkHpKwL.6b146474.59934ce894cb",
"duplicate": false
},
{
"index": 1,
"ok": false,
"error": "consent_required"
}
],
"created": 1,
"duplicates": 0,
"failed": 1
}
X-RateLimit-Limit
integer

Requests allowed in the current short window.

X-RateLimit-Remaining
integer

Requests left in the current short window.

The request cannot be processed: invalid_json, no_registrants, batch_too_large (more than 100) or webinar_required (neither webinar_id nor slug).

Media typeapplication/json
object
error
required

A stable, machine-readable code.

string

Example

{
"error": "no_registrants"
}

Missing, wrong, revoked or rotated key, a key whose access level does not include this endpoint, or a key whose workspace cannot be resolved.

Media typeapplication/json
object
error
required

A stable, machine-readable code.

string

Example

{
"error": "unauthorized"
}

The webinar belongs to another workspace.

Media typeapplication/json
object
error
required

A stable, machine-readable code.

string

Example

{
"error": "forbidden"
}

No active webinar with that id or slug.

Media typeapplication/json
object
error
required

A stable, machine-readable code.

string

Example

{
"error": "webinar_not_found"
}

Only POST is accepted.

Media typeapplication/json
object
error
required

A stable, machine-readable code.

string

Example

{
"error": "method_not_allowed"
}

Too many requests. Wait Retry-After seconds.

Media typeapplication/json
object
error
string
Allowed value: rate_limited
message
string
retry_after

Seconds to wait.

integer

Example

{
"error": "rate_limited",
"message": "Too many requests",
"retry_after": 7
}
Retry-After
integer

Seconds to wait before retrying.

Something failed on our side. Safe to retry with backoff.

Media typeapplication/json
object
error
required

A stable, machine-readable code.

string

Example

{
"error": "internal"
}