Vidyst API
API referenceWebinars

Update a webinar

PATCH
/webinars/{webinarId}

Changes a webinar the API key's account owns. Needs the webinars:write scope. Only the fields you send change; null clears the ones that can be empty, and lists are replaced whole.

Send the ETag from when you read it as If-Match, so the edit can't overwrite someone else's change made in between (412 precondition_failed). The response carries the new ETag.

An ended webinar can't change (410 webinar_ended). While a session is live you can still edit its details, but not move it to another licence or change its status.

Authorization

apiKey
headerAuthorizationBearer <vk_live_<public id>_<secret>>

An API key from the Vidyst studio (Developer → API keys), sent as Authorization: Bearer vk_live_….

Path Parameters

webinarId*string

The webinar's id.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid

Header Parameters

If-Match?string

Makes the edit conditional: the ETag from when you read the webinar (* matches any version). If it has changed since (someone else edited it), or the value isn't one of its ETags, the edit is refused with 412 precondition_failed and nothing changes. Leave it out to edit whatever is there.

Lengthlength <= 200

Request Body

application/json
  1. body

Changes to a webinar: only the fields sent change.

title?string

The webinar's title (1–200 characters).

Length1 <= length <= 200
licenceKey?string

Moves the webinar to another licence (its key, VDL-…). You must be able to host on it, and it must be active. Not while a session is live (409 conflict).

Lengthlength <= 40
status?string

scheduled publishes a draft (it needs a scheduledAt, sent now or set before); draft unpublishes it. Ignored while a session is live.

Value in"draft""scheduled"
scheduledAt?|

When the (first) session starts, ISO 8601 with an offset. null removes the date, which makes a scheduled webinar a draft.

timezone?string

The IANA time zone it's shown in and its series repeats by.

Lengthlength <= 64
durationMinutes?integer

Planned length of each session, in minutes (1–1440).

Range1 <= value <= 1440
description?|

Plain text for the public page (up to 5,000 characters); null removes it.

access?string

open or registration.

Value in"open""registration"
registrationLimit?|

The most registrations it takes; null removes its own limit (the licence's still applies).

passcode?|

A new passcode (4–64 characters); null removes it. Never returned.

reminders?array<>

The emails registrants get, replacing the current list ([] for none).

Itemsitems <= 8
repeat?string

How it repeats. Changing it lays out the sessions again from scheduledAt.

Value in"none""daily""weekly""monthly""custom"
repeatCount?integer

How many sessions a series has (2–52).

Range2 <= value <= 52
repeatDays?array<>

The weekdays of a custom series (0 = Sunday … 6 = Saturday), replacing the current ones.

Itemsitems <= 7
agenda?array<>

The agenda, replacing the current one ([] clears it).

Itemsitems <= 30
faqs?array<>

The questions and answers, replacing the current ones ([] clears them).

Itemsitems <= 20
questions?array<>

The registration form's questions, replacing the current ones ([] removes them).

Itemsitems <= 20

Response Body

A webinar.

application/json
  1. response

A webinar.

id*string

The webinar's id.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
title*string

Its title.

description*|

Its plain-text description, or null.

status*string

draft (private), scheduled (published, not live), live (a session is on) or ended (no sessions left).

Value in"draft""scheduled""live""ended"
access*string

open or registration.

Value in"open""registration"
licenceKey*|

The key of the licence it runs on.

scheduledAt*|

When the first session starts (UTC), or null for a draft without a date.

timezone*string

The IANA time zone it's shown in.

durationMinutes*integer

Planned length of each session, in minutes.

Range-9007199254740991 <= value <= 9007199254740991
repeat*string

How the series repeats (none for a single session).

Value in"none""daily""weekly""monthly""custom"
repeatCount*integer

How many sessions it has (1 for a single session).

Range-9007199254740991 <= value <= 9007199254740991
repeatDays*array<>

The weekdays of a custom series (0 = Sunday); empty otherwise.

occurrences*array<>

Every session, in order.

nextSessionAt*|

The session on now or the next one (UTC); null when none is left.

sessionsLeft*integer

Sessions not over yet, the one on now included.

Range-9007199254740991 <= value <= 9007199254740991
registrationLimit*|

The most registrations it takes, or null for no limit of its own.

registrationCount*integer

How many people have registered.

Range-9007199254740991 <= value <= 9007199254740991
passcodeProtected*boolean

Whether attendees need a passcode to join.

reminders*array<>

The emails registrants get.

agenda*array<>

The agenda shown on its page.

faqs*array<>

The questions and answers shown on its page.

questions*array<>

The registration form's questions.

pageUrl*string

Its public page, where people register and join. Share this link.

Formaturi
startedAt*|

When its current or last session went live (UTC), or null.

endedAt*|

When it ended for good (UTC), or null.

createdAt*string

When it was created (UTC).

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Formatdate-time
updatedAt*string

When it last changed (UTC).

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Formatdate-time
Example Request
curl -X PATCH 'https://vapi.vidyst.com/public/v1/webinars/01929c5e-8f3a-7b21-9d4e-5a6b7c8d9e0f' \  -H 'Authorization: Bearer vk_live_…' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "01929c5e-8f3a-7b21-9d4e-5a6b7c8d9e0f",  "title": "Product launch: what's new in Q4",  "description": "A tour of everything we shipped this quarter, with live Q&A.",  "status": "scheduled",  "access": "registration",  "licenceKey": "VDL-M4A05-TKY9Q-0A5V6-WMR8H",  "scheduledAt": "2026-12-01T15:30:00.000Z",  "timezone": "Asia/Kolkata",  "durationMinutes": 45,  "repeat": "weekly",  "repeatCount": 6,  "repeatDays": [],  "occurrences": [    {      "index": 0,      "startsAt": "2026-12-01T15:30:00.000Z",      "done": false    }  ],  "nextSessionAt": "2026-12-01T15:30:00.000Z",  "sessionsLeft": 6,  "registrationLimit": 500,  "registrationCount": 0,  "passcodeProtected": true,  "reminders": [    "confirmation",    "day_before",    "hour_before"  ],  "agenda": [    {      "time": "10:00",      "title": "Welcome and introductions"    }  ],  "faqs": [    {      "question": "Will there be a replay?",      "answer": "Yes, registrants get the replay by email."    }  ],  "questions": [    {      "label": "What's your role?",      "type": "multiple_choice",      "required": true,      "options": [        "Marketing",        "Engineering",        "Other"      ]    }  ],  "pageUrl": "https://vidyst.live/w/4fQ9zK2mXp",  "startedAt": null,  "endedAt": null,  "createdAt": "2026-11-03T09:30:00.000Z",  "updatedAt": "2026-11-03T09:30:00.000Z"}