Back to top

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 webinars
GET/webinars

Request a list of webinars.

Example URI

GET https://app.webinargeek.com/api/v2/webinars
URI Parameters
HideShow
include_past
boolean (optional) Default: false Example: true

Include broadcasts from the past

series_only
boolean (optional) Default: false Example: true

Only include webinars that form a series, i.e. webinars that consist of at least 2 episodes.

language
string (optional) Example: en

Only include webinars of language

Choices: nl en de fi fr it es pl sv da no

type
string (optional) Example: live

Type of episodes to filter on. You can only filter by 1 type at a time

Choices: live automated ondemand

user_id
integer (optional) Example: 1

Filter on webinars created by a certain user

department_id
integer (optional) Example: 1

Filter 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_at

Order of webinars

Choices: created_at

sort
string (optional) Default: desc Example: desc

Sort order

Choices: desc asc

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
    "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 webinar
GET/webinars/

Retrieve a specific webinar.

Example URI

GET https://app.webinargeek.com/api/v2/webinars/
URI Parameters
HideShow
include_past
boolean (optional) Default: false Example: true

Include broadcasts from the past

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
    "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 series
POST/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

POST https://app.webinargeek.com/api/v2/webinars/series_subscribe
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "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"
  ]
}
Response  201
HideShow
Headers
Content-Type: application/json
Body
{
    "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
                }
            }
        ]
}
Response  400
HideShow
Headers
Content-Type: application/json
Body
{
  "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"
  ]
}
Response  404
HideShow
Headers
Content-Type: application/json
Body
{
  "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"
  ]
}
Response  409
HideShow
Headers
Content-Type: application/json
Body
{
  "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"
  ]
}
Response  422
HideShow
Headers
Content-Type: application/json
Body
{
  "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 broadcasts
GET/broadcasts

Request a list of broadcasts for an account.

Example URI

GET https://app.webinargeek.com/api/v2/broadcasts
URI Parameters
HideShow
nested_resources
string (optional) Example: episode

Include optional resources. You may chain multiple resources with a comma

Choices: episode webinar

order
string (optional) Default: date Example: created_at

Order of broadcasts

Choices: created_at date

sort
string (optional) Default: desc Example: desc

Sort order

Choices: desc asc

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
    "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 broadcast
GET/broadcasts/

Retrieve a specific broadcast.

Example URI

GET https://app.webinargeek.com/api/v2/broadcasts/
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "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 broadcast
POST/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

POST https://app.webinargeek.com/api/v2/broadcasts/subscriptions
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "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"
  ]
}
Response  201
HideShow
Headers
Content-Type: application/json
Body
{
    "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 Episode
POST/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

POST https://app.webinargeek.com/api/v2/episodes/broadcasts
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "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"
  ]
}
Response  201
HideShow
Headers
Content-Type: application/json
Body
{
  "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 subscriptions
GET/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

GET https://app.webinargeek.com/api/v2/subscriptions
URI Parameters
HideShow
email
string (optional) Example: john@smith.com

Filter subscribers on email address

external_id
string (optional) Example: 1

Filter subscribers on external_id

watched_webinar
boolean (optional) Example: true

Filter by subscribers that watched the webinar

watched_replay
boolean (optional) Example: true

Filter by subscribers that watched the replay

watched_live
boolean (optional) Example: true

Filter by subscribers that watched the live webinar

viewer_started_watching
boolean (optional) Example: true

Filter by subscribers that started watching a webinar

broadcast_ended
boolean (optional) Example: true

Filter by ended broadcasts for live or automated webinars

unsubscribed
boolean (optional) Example: true

Return only unsubscribed subscribers

assessment_passed
boolean (optional) Example: true

Return only successfully assessed subscriptions

episode_id
integer (optional) Example: 1

Filter by episode

broadcast_id
integer (optional) Example: 1

Filter by broadcast

webinar_id
integer (optional) Example: 1

Filter by webinar

watch_end_from
string (optional) Example: 2024-01-15T00:00:00Z

Filter 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:59Z

Filter 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: broadcast

Include optional resources, you may chain multiple resources using a comma

Choices: broadcast episode webinar

order
string (optional) Default: created_at Example: created_at

Order of subscriptions

Choices: created_at unsubscribed_at watched_true_set_at watch_end

sort
string (optional) Default: desc Example: desc

Sort order

Choices: desc asc

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "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 subscription
GET/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

GET https://app.webinargeek.com/api/v2/subscriptions/
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
    "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 subscriber
POST/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

POST https://app.webinargeek.com/api/v2/subscriptions/unsubscribe
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
    "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 payments
GET/subscription_payments

Request a list of payments for a specific broadcast, episode, webinar or for the whole account.

Example URI

GET https://app.webinargeek.com/api/v2/subscription_payments
URI Parameters
HideShow
episode_id
integer (optional) Example: 1

Filter by episode

broadcast_id
integer (optional) Example: 1

Filter by broadcast

webinar_id
integer (optional) Example: 1

Filter by webinar

nested_resources
string (optional) Example: broadcast

Include optional resources, you may chain multiple resources using a comma

Choices: broadcast episode webinar

order
string (optional) Default: created_at Example: created_at

Order of subscription payments

Choices: created_at

sort
string (optional) Default: desc Example: desc

Sort order

Choices: desc asc

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "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 messages
GET/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

GET https://app.webinargeek.com/api/v2/messages
URI Parameters
HideShow
episode_id
integer (optional) Example: 1

Filter on episode

broadcast_id
integer (optional) Example: 1

Filter on broadcast

webinar_id
integer (optional) Example: 1

Filter on webinar

type
string (optional) Example: public

Message type

Choices: public private question

order
string (optional) Default: created_at Example: created_at

Order of messages. Recipient ID can be used to group messages by conversation.

Choices: created_at recipient_id

sort
string (optional) Default: desc Example: desc

Sorting of order

Choices: desc asc

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "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 questions
GET/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

GET https://app.webinargeek.com/api/v2/questions
URI Parameters
HideShow
episode_id
integer (optional) Example: 1

Filter on episode

broadcast_id
integer (optional) Example: 1

Filter on broadcast

webinar_id
integer (optional) Example: 1

Filter on webinar

order
string (optional) Default: created_at Example: created_at

Order of questions.

Choices: created_at

sort
string (optional) Default: desc Example: desc

Sorting of order

Choices: desc asc

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "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 metadata
GET/account

Request information about the account linked to the API. The information is derived from your API key.

Example URI

GET https://app.webinargeek.com/api/v2/account
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "company": "My company",
  "email": "my@email.com"
}

Generated by aglio on 03 Feb 2026