WebinarGeek
Welcome to our API reference!
Overview
The WebinarGeek API allows you to exchange information between your own tools and platforms and WebinarGeek. This documentation targets version 2 of our API. Version 1 of the API is deprecated and should not be used anymore.
To view the documentation for version 1 of our API please see here.
Base URL
The API is accessed under the following base URL:
https://app.webinargeek.com/api/v2
Authentication
All requests to the API are authenticated by providing your API key.
You will find your API key in your WebinarGeek application in the Advanced section of your account settings (https://app.webinargeek.com/admin/integrations/api)
The API key should be provided as an HTTP header named Api-Token:
Api-Token: your-token
The key gives access to critical parts of your account, Please follow security best practices with your keys:
-
Don’t share them with 3rd parties
-
Don’t expose them publicly (e.g. in a code repository)
-
Rotate them periodically
HTTP methods
The API uses standard HTTP methods for indicating the action to take.
| Method | Description |
|---|---|
| GET | Retrieve a resource. |
| POST | Create a new resource. |
| PUT | Update a resource. |
| DELETE | Remove a resource. |
Request headers
All requests sending JSON data need to use HTTP header Content-Type:
Content-Type: application/json
Response codes
The API uses HTTP status codes to indicate how a response was processed. These are the main ones we use:
| Code | Description |
|---|---|
| 200 | Everything is in order, request processed correctly. |
| 201 | The resource was successfully created. |
| 400 | Bad request, most likely due to sending an incorrect format or syntax. |
| 401 | Unauthorized, usually when sending an incorrect or invalid API token. |
| 403 | Forbidden, you are authenticated, but you don’t have the right permissions for this request. |
| 404 | The resource could not be found. It either does not exists or you are trying to access something which does not belong to your scope. |
| 409 | Conflict, the request is semantically & syntactically correct but it conflicts with the current system or resource state. |
| 422 | Unprocessable Entity, the request is technically correct but the server cannot process the provided request entity. |
| 429 | Too many requests, this happens if you exceed your rate limits. Try again later. |
| 500 | Internal server error, something has gone wrong on our side. |
| 503 | The API is temporarily not available, try again later. |
We always return a JSON formatted response, which in the case of an error looks like this:
{
"code": "not_found",
"message": "The user could not be found."
}
Rate limiting
Requests to the API are rate limited. The default rate limits apply per time window and impose a maximum of:
-
300 requests per minute.
-
5000 requests per hour.
-
25,000 requests per day.
If you hit any limit, the API will return a HTTP 429 status code. You can try again later. Free trials have an API limit of 10 requests per minute, 100 per hour or 500 per day.
Pagination
All list requests accept a per_page and page param to iterate over a larger result set. Depending on the resource some list requests also accept an order and sort parameter to control the order of resources.
| Parameter | Type | Description |
|---|---|---|
| page | integer | The page number, always starts with 1. |
| per_page | integer | Number of resources to return per page, with a maximum of 1000. Default is 50. |
| order | string | The field to order on, defaults and possible options differ per resource. |
| sort | string | The order of sorting, can be asc (ascending) or desc (descending). |
While the default per page size is 50, we highly encourage you to use the highest possible page limit, especially if you happen to have larger result sets. This will reduce the number of requests you need to make to retrieve all resources.
Each list request returns a pages object with information about the pagination:
| Parameter | Type | Description |
|---|---|---|
| next | string | If set, this is the link to the next page in the result set. |
| page | integer | The current page. |
| per_page | integer | The number of resources displayed per page. |
| total_pages | integer | The total number of pages available in the result set. |
Dates and times
For convenience all dates and times for input and output are Unix time (Unix timestamp) in UTC.
Subscribers have a timezone which can be set upon subscribing and retrieved as part of the subscriptions call.
Include nested resources
Sometimes it may come in handy to have extra resources in the response to not
have to made additional requests to get the information you need. For this you
can use the nested_resources parameter. For instance if you request a list
of broadcasts for your account you can set nested_resources to
episode,webinar to include both the episode and the webinar resource for
every broadcast in the result set. If you specify more than one extra resource,
make sure to separate resources with a comma.
Resources and resource relationships
The core of WebinarGeek is a webinar, which has a title and a registration page.
A webinar usually has one episode. An episode has its own title, and has all the webinar materials such as slides or interactions.
Some webinars have several episodes, which makes a webinar series.
An episode can have one or more broadcasts, which are the actual “webinars that take place”. These have a date, a time, and a status. The end-user ultimately subscribes to and views a broadcast. A broadcast can have different states like started, in progress or ended.
Resource validations & restrictions
Some resources have certain restrictions defined that get validated when
changing a resource. For example, as a default, every newly created webinar
starts with 2 general registration fields that are required: email and
firstname. Since those fields are considered crucial for the user registration
there will be an error when trying to register someone through the API without
those fields.
Other restrictions might be ignored by the API. For example, adding required extra registration fields or consent fields do not run through validations and are thus not enforced when someone is subscribed through the API. This is because the user cannot give their consent when being registered through the API, the registrant must get the consent beforehand from the user.
If you run into issues with validations and restrictions, you might need to change the webinar settings or get additional data for your operation at hand.
Changelog
| Date | Description |
|---|---|
| 19 Oct 2019 | Added support for timezones, which can be supplied as part of creating a subscriber and can also be retrieved as part of the subscription calls. Also, poll answers can now be multiple choice so are returned as array at all times. |
| 2 March 2020 | Added “discount_used” boolean to payments indicating whether a discount was used. Added “cancelled” boolean to all broadcasts indicating whether a broadcast is cancelled. |
| 22 April 2020 | Added an endpoint to list and filter payments. |
| 20 June 2020 | Chat message support: added “messages” as a part of a subscriber to extract chat messages or questions, as well as a separate endpoint for messages. |
| 12 July 2020 | Support for departments: added a “user_id” and “department_id” filter to the webinars API. Added a “department” block to the webinar object. |
| 12 July 2020 | Support for quizzes: added “quiz_answers” to the subscriber output call along with a “answered_correctly” boolean to indicate whether a subscriber has answered correctly. |
| 12 July 2020 | Assessment information: added “assessment” block to the subscriber output call with detailed assessment results and criteria if an assessment is enabled for the webinar. |
| 14 November 2020 | Added rate limiting info to the API documentation. |
| 1 November 2021 | Added email verification status to subscriber output. |
| 10 December 2021 | Added API endpoint to retrieve single webinar. Add flag to skip confirmation mail. Add broadcast_ended filter to subscriptions API. |
| 6 May 2022 | Added API endpoint to subscribe a contact to a webinar series. |
| 15 July 2022 | Added language filter and extra registration field information to webinars. |
| 29 July 2022 | Added broadcasts, episode, webinar and other nested information to subscriptions resource response in series subscribe endpoint aligning with the regular subscribe (POST broadcasts/:id/subscriptions). |
| 27 September 2022 | Added assessment_passed_at field to subscriptions resource response and added new URL parameter assessment_passed to filter on successful subscriptions. |
| 31 March 2023 | Added street, house_number, city, postcode and province fields to subscriptions. |
| 22 May 2023 | Increased per-page pagination maximum limit from 100 to 1000. Please use this when fetching from bigger data sets. |
| 30 May 2023 | Adjusted per minute rate limit rate to 300 requests to balance out a fair per second rate in all limit periods. |
| 9 June 2023 | Added email field to user data for webinar endpoints. |
| 03 July 2023 | Added confirmation_link field to subscriptions. |
| 03 July 2023 | Added yesterdays_replay_enabled to the episode resource and active_yesterdays_replay field to the broadcast resources so you can subscribe viewers to yesterday’s replay broadcasts specifically. |
| 16 August 2023 | Added include_past parameter for queries to /webinars/{id} endpoint. |
| 23 November 2023 | Added watched_true_set_at field to subscriptions. This is the datetime when a subscriber first started watching a webinar, e.g. when a viewer watches live and replay this is the datetime the first was watched. |
| 23 November 2023 | Added two new filters to subscriptions endpoint: watched_live and viewer_started_watching |
| 23 January 2024 | Added given_access_after_viewer_limit and viewer_limit_hit_reason fields to subscriptions. When given_access_after_viewer_limit is false the subscriber was unable to watch the webinar because a max viewer limit was reached. |
| 16 May 2024 | Added an optional nested_resources parameter to the subscription payments endpoint. Any nested resources will be included as part of the subscription resource. |
| 14 June 2024 | Added active_jit field to the broadcast and jit_enabled, jit_period_minutes, jit_closest_time, jit_broadcast_id fields to the episode resource response. Fixed bug when yesterday’s replay broadcast was present even if disabled. |
| 17 June 2024 | Added job_title field to subscriptions. |
| 13 Aug 2024 | Video information: added “video” block to the webinars output call with information about the video used for an episode |
| 13 Aug 2024 | Added archived, metadata_title, metadata_description and metadata_image fields to webinars. |
| 13 Aug 2024 | Added replay_available and replay_available_until fields to broadcasts. |
| 26 Aug 2024 | Added an optional nested_resources parameter to the webinars endpoint. |
| 25 Sep 2024 | Q&A support: added “questions” as a part of a subscriber to extract questions, as well as a separate endpoint for questions. |
| 25 Feb 2025 | Added evaluation_form_answers nested object containing questions and answers to the subscription resource endpoint. |
| 3 Mar 2025 | Added unsubscription_source field to the subscription object. |
| 24 Mar 2025 | Added enrichments object to the broadcast resource with a summaries field containing short and long AI-generated summaries, structured by language code (e.g., “en”, “fr”). |
| 9 Apr 2025 | Added captions_language field to the subscription object, showing if the user used captions or not, and if so, in which language. |
| 21 Jul 2025 | Added endpoint to create broadcasts for a specific episode. |
| 15 Aug 2025 | Added public_replay_link field to broadcasts. |
| 24 Oct 2025 | Added url field to subscription calls_to_action object when CTA is a URL. |
| 14 Nov 2025 | Added watch_end as an ordering option for subscriptions. |
Resource Group ¶
Webinars ¶
A webinar is the core of WebinarGeek, where it all begins. The Webinar resource holds metadata of the webinar and its related resources, like Episodes and Broadcasts. A webinar with multiple episodes is a “webinar series”.
List all webinarsGET/webinars
Request a list of webinars.
Example URI
- include_past
boolean(optional) Default: false Example: trueInclude broadcasts from the past
- series_only
boolean(optional) Default: false Example: trueOnly include webinars that form a series, i.e. webinars that consist of at least 2 episodes.
- language
string(optional) Example: enOnly include webinars of language
Choices:
nlendefifritesplsvdano- type
string(optional) Example: liveType of episodes to filter on. You can only filter by 1 type at a time
Choices:
liveautomatedondemand- user_id
integer(optional) Example: 1Filter on webinars created by a certain user
- department_id
integer(optional) Example: 1Filter on webinars created in a specific department
- nested_resources: team_member
string(optional)Include optional resources. You may chain multiple resources with a comma
Choices:
team_member- order
string(optional) Default: created_at Example: created_atOrder of webinars
Choices:
created_at- sort
string(optional) Default: desc Example: descSort order
Choices:
descasc
200Headers
Content-Type: application/jsonBody
{
"total_count": 1,
"webinars":
[
{
"id": 1,
"title": "My webinar",
"internal_title": null,
"language": "en",
"url": "https://webinars.webinargeek.com/my-webinar",
"view_without_registration_url": "https://webinars.webinargeek.com/my-webinar/join/asdfqwer",
"ondemand": false,
"maximum_number_of_subscribers": 100,
"maximum_number_of_viewers": 95,
"metdata_title": "My webinar",
"metadata_description": "You can view this webinar from your computer, tablet or mobile phone.",
"metadata_image": "https://webinars.webinargeek.com/uploads/seo_image/2/seo_image.png",
"archived": false,
"created_at": 1506250583,
"episodes": [
{
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1,
"published": false,
"ondemand_watch_start_at": 1518285600,
"ondemand_limited_availability": true,
"ondemand_ended_at": 1546258100,
"yesterdays_replay_enabled": false,
"jit_enabled": false,
"jit_period_minutes": nil,
"jit_closest_time": nil,
"jit_broadcast_id": nil,
"created_at": 1506250583,
"team_members": [
{
"id": 1,
"firstname": "Presenter",
"lastname": "Webinargeek",
"email": "user11@webinargeek.com",
"role": "Main presenter",
"live_invitation_url": "http://subdomain.webinargeek.com/manage/1TXse17x0XIeHitKRUouhQ-MybtJqDQcdFgkA8jisE0/",
"test_invitation_url": "http://subdomain.webinargeek.com/manage/1TXse17x0XIeHitKRUouhQ-MybtJqDQcdFgkA8jisE0/dry_run/",
"created_at": 1506250583
}
],
"video": {
"id": 1,
"title": "Video title",
"original_filename": "video.mp4",
"duration": 3600
},
"broadcasts": [
{
"id": 1,
"date": 1546250583,
"has_ended": true,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 1,
"live_viewers_count": 1,
"replay_available": true,
"replay_available_until": 1754031680,
"public_replay_link": "https://webinars.webinargeek.com/watch/replay/xyzxyzxyzxyz/",
"replay_viewers_count": 1,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {},
}
]
}
],
"registration_fields": [
{
"name": "firstname",
"label": "First name",
"input_type": "text_field",
"position": 1,
"mandatory": true,
"extra_field": false,
"field_options": []
},
{
"name": "email",
"label": "Email",
"input_type": "text_field",
"position": 2,
"mandatory": true,
"extra_field": false,
"field_options": []
},
{
"name": "extra_field_3",
"label": "First time?",
"input_type": "dropdown",
"position": 3,
"mandatory": false,
"extra_field": true,
"field_options": [
{
"label": "Yes"
},
{
"label": "No"
}
]
}
],
"department": {
"id": 1,
"name": "HR"
},
"user": {
"id": 1,
"firstname": "Webinar",
"surname": "Creator",
"email": "webinar.creator@webinargeek.com"
}
}
],
"pages":
{
"next": null,
"page": 1,
"per_page": 50,
"total_pages": 1
}
}Retrieve a webinarGET/webinars/
Retrieve a specific webinar.
Example URI
- include_past
boolean(optional) Default: false Example: trueInclude broadcasts from the past
200Headers
Content-Type: application/jsonBody
{
"id": 1,
"title": "My webinar",
"internal_title": null,
"language": "en",
"url": "https://webinars.webinargeek.com/my-webinar",
"view_without_registration_url": "https://webinars.webinargeek.com/my-webinar/join/asdfqwer",
"ondemand": false,
"maximum_number_of_subscribers": 100,
"maximum_number_of_viewers": 95,
"metdata_title": "My webinar",
"metadata_description": "You can view this webinar from your computer, tablet or mobile phone.",
"metadata_image": "https://webinars.webinargeek.com/uploads/seo_image/2/seo_image.png",
"archived": false,
"created_at": 1506250583,
"episodes": [
{
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1,
"published": false,
"ondemand_watch_start_at": 1518285600,
"ondemand_limited_availability": true,
"ondemand_ended_at": 1546258100,
"yesterdays_replay_enabled": false,
"jit_enabled": false,
"jit_period_minutes": nil,
"jit_closest_time": nil,
"jit_broadcast_id": nil,
"created_at": 1506250583,
"team_members": [
{
"id": 1,
"firstname": "Presenter",
"lastname": "Webinargeek",
"email": "user11@webinargeek.com",
"role": "Main presenter",
"live_invitation_url": "http://subdomain.webinargeek.com/manage/1TXse17x0XIeHitKRUouhQ-MybtJqDQcdFgkA8jisE0/",
"test_invitation_url": "http://subdomain.webinargeek.com/manage/1TXse17x0XIeHitKRUouhQ-MybtJqDQcdFgkA8jisE0/dry_run/",
"created_at": 1506250583
}
],
"video": {
"id": 1,
"title": "Video title",
"original_filename": "video.mp4",
"duration": 3600
},
"broadcasts": [
{
"id": 1,
"date": 1546250583,
"has_ended": true,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 1,
"live_viewers_count": 1,
"replay_available": true,
"replay_available_until": 1754031680,
"public_replay_link": "https://webinars.webinargeek.com/watch/replay/xyzxyzxyzxyz/",
"replay_viewers_count": 1,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {},
}
]
}
],
"registration_fields": [
{
"name": "firstname",
"label": "First name",
"input_type": "text_field",
"position": 1,
"mandatory": true,
"extra_field": false,
"field_options": []
},
{
"name": "email",
"label": "Email",
"input_type": "text_field",
"position": 2,
"mandatory": true,
"extra_field": false,
"field_options": []
},
{
"name": "extra_field_3",
"label": "First time?",
"input_type": "dropdown",
"position": 3,
"mandatory": false,
"extra_field": false,
"field_options": [
{
"label": "Yes"
},
{
"label": "No"
}
]
}
],
"department": {
"id": 1,
"name": "HR"
},
"user": {
"id": 1,
"firstname": "Webinar",
"surname": "Creator",
"email": "webinar.creator@webinargeek.com"
}
}Subscribe to a webinar seriesPOST/webinars/series_subscribe
Create subscriptions for exactly one broadcast of each episode of a given webinar. This is useful when you have webinar series, i.e. webinars with 2 or more episodes. Otherwise, subscribing to just 1 specific broadcast can easily be done via the Subscribe to a broadcast endpoint.
The creation of subscriptions will fail if there are no subscribable broadcasts for at least one of the episodes. Possible reasons could be:
-
all broadcasts for an episode are in the past
-
all of the broadcasts for at least 1 episode have reached the webinar’s maximum number of subscribers limit
In the above cases, or in the case of any other error, no subscriptions will be created. Also note just-in-time broadcasts are not supported by this endpoint.
Trying to create a subscription for a user to a broadcast which they are already subscribed to, will silently skip the subscription.
Subscriptions through the API don’t validate extra fields or consent fields, e.g. if those are configured as required in the webinar settings.
Responds with the created subscriptions in the order of their parent
broadcast_id.
Example URI
Headers
Content-Type: application/jsonBody
{
"firstname": "John",
"surname": "Smith",
"company": "Smith, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"time_zone": "Europe/Amsterdam",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "my_campaign_id",
"registration_ip": "192.158.1.38",
"skip_confirmation_mail": false,
"broadcasts": [
12,
15
]
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"firstname": {
"type": "string",
"description": "First name of the subscribing user"
},
"surname": {
"type": "string",
"description": "Surname of the user"
},
"company": {
"type": "string",
"description": "Company that the user belongs to"
},
"job_title": {
"type": "string",
"description": "Job title"
},
"email": {
"type": "string",
"description": "Email address"
},
"street": {
"type": "string",
"description": "Street address"
},
"house_number": {
"type": "string",
"description": "House number"
},
"city": {
"type": "string",
"description": "City"
},
"postcode": {
"type": "string",
"description": "Zipcode or postal code"
},
"province": {
"type": "string",
"description": "State or province"
},
"country": {
"type": "string",
"description": "ISO Country code of the user's residence"
},
"phone": {
"type": "string",
"description": "Phone number in any format"
},
"external_id": {
"type": "string",
"description": "ID used by end-user to identify themselves in their organization"
},
"time_zone": {
"type": "string",
"description": "Time zone",
"default": "Your webinar/account time zone as defined in the list of tz database time zones"
},
"extra_fields": {
"type": "object",
"properties": {
"extra_field_123": {
"type": "string",
"description": "An extra registration field to gather additional user data\n\nTo be able to pass extra fields, first a custom field in the registration fields tab needs to be added during the\nwebinar setup. Once the custom field is created, the `GET webinars/:id` endpoint needs to be queried\nfor the webinar at hand to note its `registration_fields` attribute. There the newly\ncreated custom field can be found. The \"name\" of the field is the one to use as the `extra_fields`. The name\nalways starts with `extra_field_` and ends with a number ID like `123`."
}
},
"description": "Additional webinar registration fields defined inside of the application"
},
"consent_fields": {
"type": "object",
"properties": {
"Privacy policy": {
"type": "string",
"description": "The key indicates the name of your privacy policy in your language\nexactly as it's written in your registration page (e.g. \"Privacy policy\" including the space character).\n\nThe value represents the consent sentence which the user agrees to."
}
},
"description": "Key value pairs of your privacy consent fields"
},
"custom_field": {
"type": "string",
"description": "Custom field to store additional information"
},
"registration_ip": {
"type": "string",
"description": "IP address of the client machine from where the subscription took place"
},
"skip_confirmation_mail": {
"type": "boolean",
"description": "Allows to skip confirmation email for a subscription. If not explicitly set\nto true, every subscription will trigger a confirmation email sending."
},
"broadcasts": {
"type": "array",
"description": "Optional unique broadcast identifiers to subscribe to. If provided,\nit must be exactly 1 broadcast per episode and match a broadcast in\nevery episode."
}
},
"required": [
"firstname",
"email"
]
}201Headers
Content-Type: application/jsonBody
{
"total_count": 2,
"subscriptions":
[
{
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smit, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583,
"assessment": [],
"poll_votes": [],
"quiz_answers": [],
"evaluation_form_answers": [],
"payments": [],
"broadcast": {
"id": 12,
"date": 1546250583,
"has_ended": false,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 2,
"viewers_count": 0,
"live_viewers_count": 0,
"replay_viewers_count": 0,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": "My webinar - part 1",
"type": "live",
"subscriptions_count": 2
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": "My webinar - series",
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
},
{
"id": 2,
"firstname": "John",
"surname": "Smith",
"company": "Smit, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": false,
"watched_true_set_at": null,
"watch_start": null,
"watch_end": null,
"watch_duration": 3600,
"watched_live": false,
"watched_replay": false,
"watch_start_replay": null,
"watch_end_replay": null,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": null,
"email_verified": true,
"email_verified_at": 1546250583,
"assessment": [],
"poll_votes": [],
"quiz_answers": [],
"evaluation_form_answers": [],
"payments": [],
"broadcast": {
"id": 15,
"date": 1546250987,
"has_ended": true,
"cancelled": false,
"started_at": null,
"ended_at": null,
"duration": 3600,
"subscriptions_count": 2,
"viewers_count": 0,
"live_viewers_count": 0,
"replay_viewers_count": 0,
"public_replay_viewers_count": 0,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": "My webinar - part 2",
"type": "live",
"subscriptions_count": 2
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": "My webinar - series",
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
}
]
}400Headers
Content-Type: application/jsonBody
{
"code": "bad_request",
"message": "Hello, world!"
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Bad request error code"
},
"message": {
"type": "string",
"description": "Message to indicate which invalid user input was provided in the request"
}
},
"required": [
"code",
"message"
]
}404Headers
Content-Type: application/jsonBody
{
"code": "not_found",
"message": "Hello, world!"
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Not found error code"
},
"message": {
"type": "string",
"description": "Message to indicate which requested resource is missing"
}
},
"required": [
"code",
"message"
]
}409Headers
Content-Type: application/jsonBody
{
"code": "conflict_error",
"message": "Hello, world!"
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Conflict error code"
},
"message": {
"type": "string",
"description": "Message to indicate what kind of conflict exists between the request and the system state"
}
},
"required": [
"code",
"message"
]
}422Headers
Content-Type: application/jsonBody
{
"code": "unprocessable_entity",
"message": "Hello, world!"
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Unprocessable entity error code"
},
"message": {
"type": "string",
"description": "Message to indicate why the request entity body could not be processed"
}
},
"required": [
"code",
"message"
]
}Broadcasts ¶
A broadcast is a specific broadcast of an episode within a webinar. For live broadcasts this happens at one specific date and time. For on demand webinars, the broadcast is something that is used across the whole lifespan of the webinar for all viewers.
List all broadcastsGET/broadcasts
Request a list of broadcasts for an account.
Example URI
- nested_resources
string(optional) Example: episodeInclude optional resources. You may chain multiple resources with a comma
Choices:
episodewebinar- order
string(optional) Default: date Example: created_atOrder of broadcasts
Choices:
created_atdate- sort
string(optional) Default: desc Example: descSort order
Choices:
descasc
200Headers
Content-Type: application/jsonBody
{
"total_count": 1,
"broadcasts":
[
{
"id": 1,
"date": 1546250583,
"has_ended": true,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 1,
"live_viewers_count": 1,
"replay_available": true,
"replay_available_until": 1754031680,
"public_replay_link": "https://webinars.webinargeek.com/watch/replay/xyzxyzxyzxyz/",
"replay_viewers_count": 1,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {},
}
],
"pages":
{
"next": null,
"page": 1,
"per_page": 50,
"total_pages": 1
}
}Retrieve a broadcastGET/broadcasts/
Retrieve a specific broadcast.
Example URI
200Headers
Content-Type: application/jsonBody
{
"id": 1,
"date": 1546250583,
"has_ended": true,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 1,
"live_viewers_count": 1,
"replay_available": true,
"replay_available_until": 1754031680,
"public_replay_link": "https://webinars.webinargeek.com/watch/replay/xyzxyzxyzxyz/",
"replay_viewers_count": 1,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
}Subscribe to a broadcastPOST/broadcasts/subscriptions
Subscribe an end-user to a broadcast.
Some POST body attributes are mandatory, others may depend on how the webinar
was set-up by the webinar host inside the app. For example some webinars require
the surname. You can see which general and extra fields are defined on a webinar
by looking at a webinar’s registration_fields array.
Subscriptions through the API don’t validate extra fields or consent fields, e.g. if those are configured as required in the webinar settings.
If you would like to subscribe a viewer to a whole webinar series at once, you can use the convenience endpoint Subscribe to a webinar series.
Returns the created subscription that subscribes the end-user to the broadcast.
A special use case is subscribing to just-in-time broadcasts active_jit: true:
such broadcast is a virtual one, it doesn’t have a fixed date, instead date
always contains the next available time (e.g. “each 10 minutes”). Passing this
broadcast ID when subscribing will automatically create a real broadcast for
this time and subscribe to it, so returned broadcast resource will contain
the just created broadcast ID and details. JIT is enabled on the episode level:
if JIT is available, the relevant episode’s jit_enabled field will be true,
jit_closest_time will contain the next date (equal to the broadcast date),
jit_period_minutes will contain the period in minutes, and jit_broadcast_id
will contain the ID of the virtual broadcast with active_jit: true.
Example URI
Headers
Content-Type: application/jsonBody
{
"firstname": "John",
"surname": "Smith",
"company": "Smith, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"time_zone": "Europe/Amsterdam",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "my_campaign_id",
"registration_ip": "192.158.1.38",
"skip_confirmation_mail": false
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"firstname": {
"type": "string",
"description": "First name of the subscribing user"
},
"surname": {
"type": "string",
"description": "Surname of the user"
},
"company": {
"type": "string",
"description": "Company that the user belongs to"
},
"job_title": {
"type": "string",
"description": "Job title"
},
"email": {
"type": "string",
"description": "Email address"
},
"street": {
"type": "string",
"description": "Street address"
},
"house_number": {
"type": "string",
"description": "House number"
},
"city": {
"type": "string",
"description": "City"
},
"postcode": {
"type": "string",
"description": "Zipcode or postal code"
},
"province": {
"type": "string",
"description": "State or province"
},
"country": {
"type": "string",
"description": "ISO Country code of the user's residence"
},
"phone": {
"type": "string",
"description": "Phone number in any format"
},
"external_id": {
"type": "string",
"description": "ID used by end-user to identify themselves in their organization"
},
"time_zone": {
"type": "string",
"description": "Time zone",
"default": "Your webinar/account time zone as defined in the list of tz database time zones"
},
"extra_fields": {
"type": "object",
"properties": {
"extra_field_123": {
"type": "string",
"description": "An extra registration field to gather additional user data\n\nTo be able to pass extra fields, first a custom field in the registration fields tab needs to be added during the\nwebinar setup. Once the custom field is created, the `GET webinars/:id` endpoint needs to be queried\nfor the webinar at hand to note its `registration_fields` attribute. There the newly\ncreated custom field can be found. The \"name\" of the field is the one to use as the `extra_fields`. The name\nalways starts with `extra_field_` and ends with a number ID like `123`."
}
},
"description": "Additional webinar registration fields defined inside of the application"
},
"consent_fields": {
"type": "object",
"properties": {
"Privacy policy": {
"type": "string",
"description": "The key indicates the name of your privacy policy in your language\nexactly as it's written in your registration page (e.g. \"Privacy policy\" including the space character).\n\nThe value represents the consent sentence which the user agrees to."
}
},
"description": "Key value pairs of your privacy consent fields"
},
"custom_field": {
"type": "string",
"description": "Custom field to store additional information"
},
"registration_ip": {
"type": "string",
"description": "IP address of the client machine from where the subscription took place"
},
"skip_confirmation_mail": {
"type": "boolean",
"description": "Allows to skip confirmation email for a subscription. If not explicitly set\nto true, every subscription will trigger a confirmation email sending."
}
},
"required": [
"firstname",
"email"
]
}201Headers
Content-Type: application/jsonBody
{
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smit, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"confirmation_link": "https://webinars.webinargeek.com/webinar/subscribed/xyzxyzxyzxyz/",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": false,
"watched_true_set_at": null,
"watch_start": null,
"watch_end": null,
"watch_duration": null,
"watched_live": false,
"watched_replay": false,
"watch_start_replay": null,
"watch_end_replay": null,
"watch_duration_replay": 0,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250000,
"email_updated_at": null,
"email_verified": true,
"email_verified_at": 1546250583,
"assessment": [],
"poll_votes": [],
"quiz_answers": [],
"evaluation_form_answers": [],
"payments": [],
"broadcast": {
"id": 1,
"date": 1546250583,
"has_ended": false,
"cancelled": false,
"started_at": null,
"ended_at": null,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 0,
"live_viewers_count": 0,
"replay_available": true,
"replay_available_until": 1754031680,
"public_replay_link": "https://webinars.webinargeek.com/watch/replay/xyzxyzxyzxyz/",
"replay_viewers_count": 0,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
}Create a Broadcast for an EpisodePOST/episodes/broadcasts
Create Broadcast for an Episode. Episode ids can be found in the Webinar dashboard UI or via the API when retrieving resources such as Webinar, Broadcast or Subscription with a nested Episode resource.
Broadcasts can only be created for Live and Automated webinars. The provided date and time must be in the future. The format for providing a date is ISO98601.
Returns the created broadcast, or an existing broadcast if the datetime provided matches an existing broadcast for the specified episode.
Example URI
Headers
Content-Type: application/jsonBody
{
"episode_id": 123,
"date": "2025-07-09T14:30:00+02:00"
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"episode_id": {
"type": "number"
},
"date": {
"type": "string"
}
},
"required": [
"episode_id",
"date"
]
}201Headers
Content-Type: application/jsonBody
{
"id": 1,
"date": 1752064200,
"has_ended": false,
"cancelled": false,
"started_at": null,
"ended_at": null,
"duration": null,
"subscriptions_count": 0,
"viewers_count": 0,
"live_viewers_count": 0,
"replay_available": true,
"replay_available_until": null,
"public_replay_link": "https://webinars.webinargeek.com/watch/replay/xyzxyzxyzxyz/",
"replay_viewers_count": 0,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
}Subscriptions ¶
Subscriptions are the subscribers to the webinars, or rather, to broadcasts.
List all subscriptionsGET/subscriptions
Request a list of subscribers for a specific broadcast, episode, webinar or for the whole account. This call does not return subscribers that still require email address verification, if this is enabled for the webinar.
Example URI
string(optional) Example: john@smith.comFilter subscribers on email address
- external_id
string(optional) Example: 1Filter subscribers on external_id
- watched_webinar
boolean(optional) Example: trueFilter by subscribers that watched the webinar
- watched_replay
boolean(optional) Example: trueFilter by subscribers that watched the replay
- watched_live
boolean(optional) Example: trueFilter by subscribers that watched the live webinar
- viewer_started_watching
boolean(optional) Example: trueFilter by subscribers that started watching a webinar
- broadcast_ended
boolean(optional) Example: trueFilter by ended broadcasts for live or automated webinars
- unsubscribed
boolean(optional) Example: trueReturn only unsubscribed subscribers
- assessment_passed
boolean(optional) Example: trueReturn only successfully assessed subscriptions
- episode_id
integer(optional) Example: 1Filter by episode
- broadcast_id
integer(optional) Example: 1Filter by broadcast
- webinar_id
integer(optional) Example: 1Filter by webinar
- watch_end_from
string(optional) Example: 2024-01-15T00:00:00ZFilter subscriptions where watch_end is on or after this timestamp. ISO8601 format in UTC. Must be used together with watch_end_to. Only returns subscriptions with a non-null watch_end.
- watch_end_to
string(optional) Example: 2024-01-31T23:59:59ZFilter subscriptions where watch_end is on or before this timestamp. ISO8601 format in UTC. Must be used together with watch_end_from. Only returns subscriptions with a non-null watch_end.
- nested_resources
string(optional) Example: broadcastInclude optional resources, you may chain multiple resources using a comma
Choices:
broadcastepisodewebinar- order
string(optional) Default: created_at Example: created_atOrder of subscriptions
Choices:
created_atunsubscribed_atwatched_true_set_atwatch_end- sort
string(optional) Default: desc Example: descSort order
Choices:
descasc
200Headers
Content-Type: application/jsonBody
{
"total_count": 1,
"subscriptions": [
{
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smit, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"confirmation_link": "https://webinars.webinargeek.com/webinar/subscribed/xyzxyzxyzxyz/",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583
}
],
"pages": {
"next": null,
"page": 1,
"per_page": 50,
"total_pages": 1
}
}Retrieve a subscriptionGET/subscriptions/
Retrieve details of a specific subscriber including some of the actions done during a webinar such as messages, poll votes or payments.
Messages and questions are limited to only messages/questions sent from the subscriber (rather than also to), and are limited to a maximum of 100. If you require more, use the dedicated endpoints for messages and questions.
Example URI
200Headers
Content-Type: application/jsonBody
{
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smith, Inc.",
"job_title": "Sales Manager",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"confirmation_link": "https://webinars.webinargeek.com/webinar/subscribed/xyzxyzxyzxyz/",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583,
"assessment": {
"result": false,
"criteria": [
{
"type": "viewing_time",
"value": 1179,
"result": false
},
{
"type": "polls_count",
"value": 2,
"result": true
},
{
"type": "evaluation_form",
"value": true,
"result": true
},
{
"type": "correct_quizzes_count",
"value": 2,
"result": true
}
]
},
"poll_votes": [
{
"question": "Have you ever worked with us before?",
"answers": [
"Yes"
]
}
],
"quiz_answers": [
{
"question": "Is this a REST API?",
"answered_correctly": true,
"answers": [
"Yes"
]
}
],
"evaluation_form_answers": [
{
"question": "How was the webinar?",
"answers": [
"I enjoyed it"
]
}
],
"calls_to_action": [
{
"title": "Visit my webpage",
"type": "url",
"url": "https://www.webinargeek.com",
"created_at": 1546250693
},
{
"title": "Click a button",
"type": "store",
"created_at": 1546250693
},
{
"title": "Fill in my form",
"type": "form",
"form": [
{
"key": "name",
"value": "Jane"
},
{
"key": "email",
"value": "jane@smith.com"
}
],
"created_at": 1546250793
}
],
"messages": [
{
"id": 1,
"type": "private",
"message": "Neque omnis et deserunt?",
"created_at": 1589483509
}
],
"questions": [
{
"id": 1,
"question": "First question",
"upvotes_count": 1,
"created_at": 1609498800
}
],
"payments": [
{
"payment_key": "xyzxyzxyzxyz",
"provider_payment_id": "tr_1234567890",
"provider_payment_state": "paid",
"payment_method": "ideal",
"amount": "10.00",
"amount_paid": "12.10",
"amount_includes_taxes": true,
"amount_tax_calculated_automatically": true,
"currency": "EUR",
"discount_used": false,
"application_fee": "0.50",
"created_at": 1546250583,
"payment_completed_at": 1546250509
}
],
"broadcast": {
"id": 1,
"date": 1546250583,
"has_ended": true,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 1,
"live_viewers_count": 1,
"replay_viewers_count": 1,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
}Unsubscribe a subscriberPOST/subscriptions/unsubscribe
Unsubscribe a specific subscriber from a broadcast, which means they can’t view the webinar anymore and won’t receive any more emails. If you re-subscribe someone it will create a new subscription.
Upon success you will receive a 200 OK and we will return the new updated subscription model
with unsubscribed set to true.
Example URI
200Headers
Content-Type: application/jsonBody
{
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smith, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"confirmation_link": "https://webinars.webinargeek.com/webinar/subscribed/xyzxyzxyzxyz/",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": true,
"unsubscription_source": "api",
"unsubscribed_at": 1546254183,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583,
"assessment": {
"result": false,
"criteria": [
{
"type": "viewing_time",
"value": 1179,
"result": false
},
{
"type": "polls_count",
"value": 2,
"result": true
},
{
"type": "evaluation_form",
"value": true,
"result": true
},
{
"type": "correct_quizzes_count",
"value": 1,
"result": true
}
]
},
"poll_votes": [
{
"question": "Have you ever worked with us before?",
"answers": [
"Yes"
]
}
],
"quiz_answers": [
{
"question": "Is this a REST API?",
"answered_correctly": true,
"answers": [
"Yes"
]
}
],
"evaluation_form_answers": [
{
"question": "How was the webinar?",
"answers": [
"I enjoyed it"
]
}
],
"calls_to_action": [
{
"title": "Visit my webpage",
"type": "url",
"url": "https://www.webinargeek.com",
"created_at": 1546250693
},
{
"title": "Click a button",
"type": "store",
"created_at": 1546250693
},
{
"title": "Fill in my form",
"type": "form",
"form": [
{
"key": "name",
"value": "Jane"
},
{
"key": "email",
"value": "jane@smith.com"
}
],
"created_at": 1546250793
}
],
"messages": [
{
"id": 1,
"type": "private",
"message": "Neque omnis et deserunt?",
"created_at": 1589483509
}
],
"payments": [
{
"payment_key": "xyzxyzxyzxyz",
"provider_payment_id": "tr_1234567890",
"provider_payment_state": "paid",
"payment_method": "ideal",
"amount": "10.00",
"amount_paid": "12.10",
"amount_includes_taxes": true,
"amount_tax_calculated_automatically": true,
"currency": "EUR",
"discount_used": false,
"application_fee": "0.50",
"created_at": 1546250583,
"payment_completed_at": 1546250509
}
],
"broadcast": {
"id": 1,
"date": 1546250583,
"has_ended": true,
"cancelled": false,
"started_at": 1546250583,
"ended_at": 1546254183,
"duration": 3600,
"subscriptions_count": 1,
"viewers_count": 1,
"live_viewers_count": 1,
"replay_viewers_count": 1,
"active_yesterdays_replay": false,
"active_jit": false,
"enrichments": {
"summaries": {
"short": {
"en": "A concise overview of the webinar."
},
"long": {
"en": "A detailed summary of the webinar covering all key points discussed."
}
}
},
},
"episode": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"type": "live",
"subscriptions_count": 1
},
"webinar": {
"id": 1,
"title": "My webinar",
"internal_title": null,
"url": "https://webinars.webinargeek.com/my-webinar",
"ondemand": false
}
}Subscription payments ¶
Subscription payments are payments completed or refunded from a subscriber within the context of paid webinars.
Possible provider_payment_states: paid, refunded
List all subscription paymentsGET/subscription_payments
Request a list of payments for a specific broadcast, episode, webinar or for the whole account.
Example URI
- episode_id
integer(optional) Example: 1Filter by episode
- broadcast_id
integer(optional) Example: 1Filter by broadcast
- webinar_id
integer(optional) Example: 1Filter by webinar
- nested_resources
string(optional) Example: broadcastInclude optional resources, you may chain multiple resources using a comma
Choices:
broadcastepisodewebinar- order
string(optional) Default: created_at Example: created_atOrder of subscription payments
Choices:
created_at- sort
string(optional) Default: desc Example: descSort order
Choices:
descasc
200Headers
Content-Type: application/jsonBody
{
"total_count": 1,
"subscription_payments": [
{
"payment_key": "xyzxyzxyzxyz",
"provider_payment_id": "tr_1234567890",
"provider_payment_state": "paid",
"payment_method": "ideal",
"amount": "10.00",
"amount_paid": "12.10",
"amount_includes_taxes": true,
"amount_tax_calculated_automatically": true,
"currency": "EUR",
"discount_used": false,
"application_fee": "0.50",
"created_at": 1546250583,
"payment_completed_at": 1546250509,
"subscription": {
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smit, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583
}
}
],
"pages": {
"next": null,
"page": 1,
"per_page": 50,
"total_pages": 1
}
}Messages ¶
Messages are chat messages or questions by viewers, moderators or presenters.
List all messagesGET/messages
There are three different message types: public (Public chat), private (Private chat) and question (Question box).
Messages can be retrieved from the account when no parameters are provided, or filtered by a specific broadcast, episode or webinar ID.
Part of the output is the recipient_id (subscription_id of recipient, as private messages are per subscriber) and whether a message is from a viewer (is_viewer) or not, if not it means that the message is either sent by a moderator or presenter.
Example URI
- episode_id
integer(optional) Example: 1Filter on episode
- broadcast_id
integer(optional) Example: 1Filter on broadcast
- webinar_id
integer(optional) Example: 1Filter on webinar
- type
string(optional) Example: publicMessage type
Choices:
publicprivatequestion- order
string(optional) Default: created_at Example: created_atOrder of messages. Recipient ID can be used to group messages by conversation.
Choices:
created_atrecipient_id- sort
string(optional) Default: desc Example: descSorting of order
Choices:
descasc
200Headers
Content-Type: application/jsonBody
{
"total_count": 1,
"messages": [
{
"id": 1,
"type": "private",
"message": "Quasi expedita praesentium blanditiis?",
"recipient_id": 1,
"is_viewer": true,
"is_reply": true,
"reply_to_id": 2,
"reply_to_name": "John",
"reply_to_message": "Duis aute irure dolor in reprehenderit in voluptate",
"created_at": 1589486710,
"subscription": {
"id": 1,
"firstname": "John",
"surname": "Smith",
"company": "Smit, Inc.",
"job_title": "Sales Manager",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"viewer_limit_hit_reason": "plan_limit",
"given_access_after_viewer_limit": true,
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583
}
}
],
"pages": {
"next": null,
"page": 1,
"per_page": 50,
"total_pages": 1
}
}Questions ¶
Questions are posted by viewers using the Q&A webinar feature.
List all questionsGET/questions
Questions can be retrieved from the account when no parameters are provided, or filtered by a specific broadcast, episode or webinar ID.
Questions can also include answers. There are two ways that questions can be answered in the QA feature. The first is with a text answer, and the second is a live answer in the webinar. Only text answers are available in the API.
Example URI
- episode_id
integer(optional) Example: 1Filter on episode
- broadcast_id
integer(optional) Example: 1Filter on broadcast
- webinar_id
integer(optional) Example: 1Filter on webinar
- order
string(optional) Default: created_at Example: created_atOrder of questions.
Choices:
created_at- sort
string(optional) Default: desc Example: descSorting of order
Choices:
descasc
200Headers
Content-Type: application/jsonBody
{
"total_count": 1,
"questions": [
{
"id": 1,
"broadcast_id": 1,
"question": "First question",
"upvotes_count": 1,
"subscription_name": "John Smith",
"subscription_email": "john@smith.com",
"subscription_level": "viewer",
"created_at": 1716372000,
"answers": [
{
"id": 1,
"answer": "First answer to first question",
"subscription_name": "John Doe",
"subscription_email": "john@doe.com",
"subscription_level": "presenter",
"created_at": 1716372000
},
{
"id": 2,
"answer": "Second answer to first question",
"subscription_name": "James Doe",
"subscription_email": "james@doe.com",
"subscription_level": "moderator",
"created_at": 1716372000
}
],
"subscription": {
"id": 1,
"firstname": "John",
"surname": "Smith",
"email": "john@smith.com",
"street": "Street",
"house_number": "123",
"city": "Zoetermeer",
"postcode": "1234AA",
"province": "Zuid Holland",
"country": "NL",
"phone": "1234567890",
"external_id": "my_internal_id",
"extra_fields": {
"extra_field_123": "I am an API user"
},
"consent_fields": {
"Privacy policy": "I consent to the privacy policy."
},
"custom_field": "e.g. campaign ID",
"registration_ip": "192.168.0.1",
"registration_source": "api",
"watch_link": "https://webinars.webinargeek.com/watch/xyzxyzxyzxyz/",
"watched": true,
"watched_true_set_at": 1546250582,
"watch_start": 1546250583,
"watch_end": 1546254183,
"watch_duration": 3600,
"watched_live": true,
"watched_replay": true,
"watch_start_replay": 1546250583,
"watch_end_replay": 1546254183,
"watch_duration_replay": 3600,
"captions_language": "en",
"payment_to_watch_completed": false,
"eligible_to_watch": true,
"unsubscribed": false,
"unsubscription_source": null,
"unsubscribed_at": null,
"time_zone": "Europe/Amsterdam",
"created_at": 1546250583,
"email_updated_at": 1546250583,
"email_verified": true,
"email_verified_at": 1546250583
}
}
],
"pages": {
"next": null,
"page": 1,
"per_page": 50,
"total_pages": 1
}
}Account ¶
Information on the account.
Retrieve account metadataGET/account
Request information about the account linked to the API. The information is derived from your API key.
Example URI
200Headers
Content-Type: application/jsonBody
{
"company": "My company",
"email": "my@email.com"
}