# Recurring event - session level registration Create and manage recurring events step by step using Webinars Plus & Events open API endpoints. ## Getting started 1. Set up your recurring events. 2. Create a registration link and configure the link depending on the registration type. 3. Once the event setup is completed, use the ticket API to register users for the event for one or more sessions, depending on the event registration type configured at the event setup time. ## Create recurring event 1. Call the [List Hubs open APIs](/docs/api/rest/reference/event/methods/#operation/getHubList) to get all available hubs. To create the event, you need a hub ID. **Request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/hubs?role_type=host' \ --header 'Authorization: ••••••' \ ``` **Reponse** ```json { "total_records": 1, "hubs": [ { ... "hub_id": "4uzfv3JwTeyR5QpC3PXwMg", ... } ] } ``` 2. Create a recurring event API using the [Create Event API](/docs/api/events/#tag/events/POST/zoom_events/events) command. Provide the correct hub ID retrieved from the above step. **Request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data '{ "hub_id": "{{hubId}}", "name": "Product planing", "description": "Product planing event", "timezone": "America/Indianapolis", "event_type": "RECURRING", "access_level": "PRIVATE_RESTRICTED", "meeting_type": "MEETING", "calendar": [ { "start_time": "2025-12-12T13:00:00Z" } ], "start_time": "2025-12-12T13:00:00Z", "recurrence": { "end_times": 7, "monthly_week": 1, "monthly_week_day": 4, "repeat_interval": 1, "type": 3, "duration": 15 } } ``` **Reponse** ```json { ... "event_id": "234kj2h34kljgh23lkhj3", ... } ``` Users can extract the `event_id` from the response when the event is successfully created. 3. Navigate to Webinars Plus & Events UI or [Get Event API](/docs/api/rest/reference/event/methods/#operation/getEventInfo) to validate all the content. Call the publish event using the [Event Actions API](/docs/api/rest/reference/event/methods/#operation/EventActions) if everything looks good. **Event publish request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events/{{eventId}}/event_actions' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data '{ "operation" : "publish" }' ``` If the event is successfully published, the API will return with HTTP status `200` OK. ## Create registration link Once the event setup is complete, the event host can configure the event registration link depending on the registration type: - One registration for all the sessions in the event - Separate registration for each session - One registration for one or more selected sessions 1. Ticket type ID is required to create the registration link. Call the list [Ticket Type API](/docs/api/rest/reference/event/methods/#operation/getEventTicketTypes) to get the Ticket type ID. **Ticket type request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events/{{evnntId}}ticket_types' \ --header 'Authorization: ••••••' ``` **Ticket type response** ```json "total_records": 1, "ticket_types": [ { ... "ticket_type_id": "234kjhg23kl4jhlaksjdh3", ... } ] ``` 1. Create a registration link with one of the registration type options with [Create Registration API](/docs/api/events/#tag/event-access/POST/zoom_events/events/{eventId}/access_links). [Recurring_registration_option](/docs/api/events/#tag/event-access/POST/zoom_events/events/{eventId}/access_links) supports three types of enum values: - All sessions - One registration for all the sessions - single_session - Registration only for one session at a time - Multiple sessions - Registration allows one or more sessions **Create a registration link request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events/{{eventId}}/access_links' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data '{ "name": "All session registration link", "type": "registration", "is_default": true, "authentication_method": "bypass_auth", "security_at_join": { "requires_authentication": false, "security_code_verification": false }, "ticket_type_id": "{{ticket_type_id}}", "recurring_registration_option": "all_sessions" }' ``` After the registration link is successfully created, the API returns HTTP `201` with the response body. ## Ticket creation 1. Ticket type ID is required to create the ticket. Get the most updated version of the ticket type ID. Call the list [Ticket Type API](/docs/api/rest/reference/event/methods/#operation/getEventTicketTypes) to get the Ticket type ID. **Ticket type request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events/{{evnntId}}ticket_types' \ --header 'Authorization: ••••••' ``` **Ticket type response** ```json "total_records": 1, "ticket_types": [ { ... "ticket_type_id": "234kjet23el4nhlbksjih4", ... } ] ``` 2. Get all the recurring session details using the [List Sessions API](/docs/api/rest/reference/event/methods/#operation/getEventSessionList). Session IDs are required to register the ticket for the session level. **List sessions request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events/{eventId}/sessions' --header 'Authorization: ••••••' \ ``` **List sessions response** ```json "total_records": 1, "sessions": [ { .... "session_id": "4uzfv3JwTeyR5QpC3PXwMg", ... }, { .... "session_id": "6uzfv3JwTeyR5QpC3MBy5g", ... } ... ] ``` 3. Call the [Create Ticket API](/docs/api/rest/reference/event/methods/#operation/createTickets) to register the attendees for the event. If the registration link supports one ticket for all the sessions, we do not need to provide the session IDs in the payload. For the remaining two cases, the API requires the session IDs. **Create ticket request** ```shell curl --location 'https://api.zoom.us/v2/zoom_events/events/{{eventId}}/tickets' \ --header 'Content-Type: application/json' \ --header 'Authorization: ••••••' \ --data-raw '{ "tickets": [ { "email": "user1@example.com", "ticket_type_id": "{{ticketTypeID}}", "external_ticket_id": "refid", "send_notification": false, "fast_join": true, "first_name": "Apitesting", "last_name": "Postman", "session_ids":["aVSyJswkTGC4o1gqVogTaA","SPbxN1VwSrygHG0N6T2YtQ"] } ] }' ``` If `link_registration_type` is set to `single_session`, a unique ticket is generated for each individual session. If `link_registration_type` is `multiple_session`, a single ticket is issued for the selected sessions. If `link_registration_type` is `all_sessions`, one ticket is created, granting access to all available sessions.