Sessions

Docs API reference

Sessions

A session is one dated presenter slot in a room: a remote speaker joins through a personal link and appears on every screen of the room (or the screens chosen, or one stage). Plan sessions from your agenda tool, hand out presenter links and schedule rehearsals. Going live and finishing stay with the operator in the app.

List sessions

GET /sessions sessions:read

Sorted by start time. The list shows presenter_ids; get one session for its presenters' link state.

Parameters

  • from string query

    Only sessions starting at or after this time (epoch ms or ISO 8601).

  • to string query

    Only sessions starting before this time (epoch ms or ISO 8601).

  • stage_id string query

    Only sessions that drive this stage: their first screen or any screen of their room they play on (stage_ids).

  • status string query

    One status, or several separated by commas, e.g. scheduled,backstage,ready.

  • ref string query

    Only the session with this ref.

  • limit integer query

    Page size, 1–200.

    1–200. Default 50

  • cursor string query

    The next_cursor of the previous page.

Responses

  • 200 A page of sessions.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
Response fields (200)
  • items object[] required
    31 fields in items
    • id string required read-only
    • ref string or null

      Your own id for the session. Unique in the workspace.

      Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

    • title string required

      Up to 200 characters

    • status string required read-only

      scheduled → backstage (a presenter joined) → ready → live → finished, or cancelled. Changed by presenters and operators, not through the API.

      One of scheduled, backstage, ready, live, finished, cancelled

    • room_id string or null

      The room the session happens in. A session in a room drives every screen of the room (the front and the side screens show the same), unless screen_ids narrows it. null for a session placed on a stage in no room.

    • screen_ids string[] or null

      The screens of the room it was narrowed to, as chosen. null = every screen of the room, including screens added to the room later.

    • stage_ids string[] required read-only

      Every stage (screen) the session drives right now, from its room and screen_ids. Follows the room when screens join or leave it.

    • stage_id string required

      The first of stage_ids — the one stage, for clients written before rooms. A session on several screens has more in stage_ids.

    • scene_id string or null

      The scene that frames the presenter on screen.

    • intro_scene_id string or null

      The speaker intro: a scene played once when the session goes live, before the presenter scene.

    • show_id string or null

      The show this session belongs to, if any.

    • starts_at integer required

      Epoch ms.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer read-only

      Planned end: starts_at + duration_min. Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • duration_min integer required

      1–1440

    • join_opens_min integer

      How many minutes before the start presenters can join backstage.

      0–1440

    • go_live string required

      WHEN the session is due: on_ready as soon as a presenter is ready, at_start at starts_at once someone is ready.

      One of on_ready, at_start

    • go_live_by string required

      WHO commits it once due: automatic — the stage switches by itself; operator — the desk is asked and the stage waits for Take. A live show’s controller is asked either way.

      One of automatic, operator

    • after_finish string required

      What the stage does after the session: advance the show, return to its schedule, or play after_source.

      One of next_cue, release, source

    • after_source object or any or null
    • presenter_ids string[] required

      In slot order.

    • ready_presenter_ids string[] read-only
    • live_presenter_id string or null read-only
    • rehearsals object[] required read-only
      6 fields in rehearsals
      • id string required
      • starts_at integer required

        Epoch ms. Presenter links open 15 minutes earlier.

      • starts_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

      • ends_at integer required

        Epoch ms.

      • ends_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

      • note string

        Up to 200 characters

    • went_live_at integer or null

      Epoch ms, once live.

    • went_live_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • finished_at integer or null

      Epoch ms, once finished.

    • finished_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • created_at integer read-only
    • updated_at integer read-only
  • next_cursor string or null required

    Pass as cursor for the next page; null on the last page.

curl "https://www.wunderframe.com/api/v1/sessions?limit=50" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "items": [
    {
      "id": "Zp4dW1qR8sN2mK7vB3xYc",
      "ref": "agenda/b-14",
      "title": "The AI-Native Startup",
      "status": "scheduled",
      "room_id": "room_hallB",
      "screen_ids": null,
      "stage_ids": [
        "st_hallB",
        "st_hallB_side"
      ],
      "stage_id": "st_hallB",
      "scene_id": "sc_presenter",
      "intro_scene_id": "sc_speaker_intro",
      "show_id": null,
      "starts_at": 1791468000000,
      "starts_at_iso": "2026-10-08T14:00:00.000Z",
      "ends_at": 1791469800000,
      "ends_at_iso": "2026-10-08T14:30:00.000Z",
      "duration_min": 30,
      "join_opens_min": 30,
      "go_live": "on_ready",
      "go_live_by": "automatic",
      "after_finish": "next_cue",
      "after_source": null,
      "presenter_ids": [
        "wkFRBzMq6POZ_qYJHvgQf"
      ],
      "ready_presenter_ids": [],
      "live_presenter_id": null,
      "rehearsals": [],
      "went_live_at": null,
      "went_live_at_iso": null,
      "finished_at": null,
      "finished_at_iso": null,
      "created_at": 1789372800000,
      "updated_at": 1789372800000
    }
  ],
  "next_cursor": null
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Get a session

GET /sessions/{id} sessions:read

With its presenters and whether each has a working link.

Parameters

  • id string required path

    The session id.

Responses

  • 200 The session.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • id string required read-only
  • ref string or null

    Your own id for the session. Unique in the workspace.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string required

    Up to 200 characters

  • status string required read-only

    scheduled → backstage (a presenter joined) → ready → live → finished, or cancelled. Changed by presenters and operators, not through the API.

    One of scheduled, backstage, ready, live, finished, cancelled

  • room_id string or null

    The room the session happens in. A session in a room drives every screen of the room (the front and the side screens show the same), unless screen_ids narrows it. null for a session placed on a stage in no room.

  • screen_ids string[] or null

    The screens of the room it was narrowed to, as chosen. null = every screen of the room, including screens added to the room later.

  • stage_ids string[] required read-only

    Every stage (screen) the session drives right now, from its room and screen_ids. Follows the room when screens join or leave it.

  • stage_id string required

    The first of stage_ids — the one stage, for clients written before rooms. A session on several screens has more in stage_ids.

  • scene_id string or null

    The scene that frames the presenter on screen.

  • intro_scene_id string or null

    The speaker intro: a scene played once when the session goes live, before the presenter scene.

  • show_id string or null

    The show this session belongs to, if any.

  • starts_at integer required

    Epoch ms.

  • starts_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • ends_at integer read-only

    Planned end: starts_at + duration_min. Epoch ms.

  • ends_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • duration_min integer required

    1–1440

  • join_opens_min integer

    How many minutes before the start presenters can join backstage.

    0–1440

  • go_live string required

    WHEN the session is due: on_ready as soon as a presenter is ready, at_start at starts_at once someone is ready.

    One of on_ready, at_start

  • go_live_by string required

    WHO commits it once due: automatic — the stage switches by itself; operator — the desk is asked and the stage waits for Take. A live show’s controller is asked either way.

    One of automatic, operator

  • after_finish string required

    What the stage does after the session: advance the show, return to its schedule, or play after_source.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[] required

    In slot order.

  • ready_presenter_ids string[] read-only
  • live_presenter_id string or null read-only
  • rehearsals object[] required read-only
    6 fields in rehearsals
    • id string required
    • starts_at integer required

      Epoch ms. Presenter links open 15 minutes earlier.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer required

      Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • note string

      Up to 200 characters

  • went_live_at integer or null

    Epoch ms, once live.

  • went_live_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • finished_at integer or null

    Epoch ms, once finished.

  • finished_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • created_at integer read-only
  • updated_at integer read-only
  • presenters object[] required

    The session's presenters in slot order, with the state of their link. Links themselves are never returned here.

    4 fields in presenters
    • id string required
    • ref string or null
    • name string required
    • invite object required
      3 fields in invite
      • status string required

        none: no link yet. active: a link works. revoked: the link was ended.

        One of none, active, revoked

      • last_seen_at integer or null

        When the presenter last opened the link. Epoch ms.

      • last_seen_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

curl "https://www.wunderframe.com/api/v1/sessions/Zp4dW1qR8sN2mK7vB3xYc" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "id": "Zp4dW1qR8sN2mK7vB3xYc",
  "ref": "agenda/b-14",
  "title": "The AI-Native Startup",
  "status": "scheduled",
  "room_id": "room_hallB",
  "screen_ids": null,
  "stage_ids": [
    "st_hallB",
    "st_hallB_side"
  ],
  "stage_id": "st_hallB",
  "scene_id": "sc_presenter",
  "intro_scene_id": "sc_speaker_intro",
  "show_id": null,
  "starts_at": 1791468000000,
  "starts_at_iso": "2026-10-08T14:00:00.000Z",
  "ends_at": 1791469800000,
  "ends_at_iso": "2026-10-08T14:30:00.000Z",
  "duration_min": 30,
  "join_opens_min": 30,
  "go_live": "on_ready",
  "go_live_by": "automatic",
  "after_finish": "next_cue",
  "after_source": null,
  "presenter_ids": [
    "wkFRBzMq6POZ_qYJHvgQf"
  ],
  "ready_presenter_ids": [],
  "live_presenter_id": null,
  "rehearsals": [],
  "went_live_at": null,
  "went_live_at_iso": null,
  "finished_at": null,
  "finished_at_iso": null,
  "created_at": 1789372800000,
  "updated_at": 1789372800000,
  "presenters": [
    {
      "id": "wkFRBzMq6POZ_qYJHvgQf",
      "ref": "speakerportal/1234",
      "name": "Ada Lovelace",
      "invite": {
        "status": "active",
        "last_seen_at": null,
        "last_seen_at_iso": null
      }
    }
  ]
}
Error example
Response 401
{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key."
  }
}

Update a session

PATCH /sessions/{id} sessions

Only the fields you send change. The room and screens cannot change while the session is live (409). Every id you send must exist in the workspace (400, with details.unknown for presenters).

Parameters

  • id string required path

    The session id.

Request body required

  • ref string or null

    Ignored by the upsert, which takes the ref from the path.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string

    Defaults to "Untitled session".

    Up to 200 characters

  • room_id string or null

    The room it happens in: the session drives every screen of the room, the same on each, unless screen_ids narrows it. Creating needs room_id or stage_id. With stage_id too, only that screen of the room. Cannot change while the session is live.

  • screen_ids string[] or null

    Only these screens (stage ids) of the room; null or [] = all of them. Alone, it keeps the session in its room and changes the screens. A screen not in the room is refused (400).

    Up to 50 items

  • stage_id string

    One screen: the session drives exactly this stage (in its room, if it has one). Kept for clients written before rooms; send room_id to drive the whole room. Creating needs room_id or stage_id. Cannot change while the session is live.

  • scene_id string or null
  • intro_scene_id string or null

    A scene played once when the session goes live. Its blanks get the speaker and the session.

  • show_id string or null
  • starts_at integer or string (date-time)

    Required when creating.

  • duration_min integer

    Minutes, 1–1440 (values outside are clamped). Default 30.

  • join_opens_min integer

    Minutes, 0–1440 (clamped). Default 30.

  • go_live string

    Default on_ready.

    One of on_ready, at_start

  • go_live_by string

    Default automatic.

    One of automatic, operator

  • after_finish string

    Default release.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[]

    Replaces the presenter list, in slot order. A presenter taken off the session loses their link.

    Up to 50 items

  • presenter_refs string[]

    The same, by your presenter refs. Send this or presenter_ids, not both.

    Up to 50 items

Responses

  • 200 Updated.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
  • 409 Conflicts with the current state.
Response fields (200)
  • id string required read-only
  • ref string or null

    Your own id for the session. Unique in the workspace.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string required

    Up to 200 characters

  • status string required read-only

    scheduled → backstage (a presenter joined) → ready → live → finished, or cancelled. Changed by presenters and operators, not through the API.

    One of scheduled, backstage, ready, live, finished, cancelled

  • room_id string or null

    The room the session happens in. A session in a room drives every screen of the room (the front and the side screens show the same), unless screen_ids narrows it. null for a session placed on a stage in no room.

  • screen_ids string[] or null

    The screens of the room it was narrowed to, as chosen. null = every screen of the room, including screens added to the room later.

  • stage_ids string[] required read-only

    Every stage (screen) the session drives right now, from its room and screen_ids. Follows the room when screens join or leave it.

  • stage_id string required

    The first of stage_ids — the one stage, for clients written before rooms. A session on several screens has more in stage_ids.

  • scene_id string or null

    The scene that frames the presenter on screen.

  • intro_scene_id string or null

    The speaker intro: a scene played once when the session goes live, before the presenter scene.

  • show_id string or null

    The show this session belongs to, if any.

  • starts_at integer required

    Epoch ms.

  • starts_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • ends_at integer read-only

    Planned end: starts_at + duration_min. Epoch ms.

  • ends_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • duration_min integer required

    1–1440

  • join_opens_min integer

    How many minutes before the start presenters can join backstage.

    0–1440

  • go_live string required

    WHEN the session is due: on_ready as soon as a presenter is ready, at_start at starts_at once someone is ready.

    One of on_ready, at_start

  • go_live_by string required

    WHO commits it once due: automatic — the stage switches by itself; operator — the desk is asked and the stage waits for Take. A live show’s controller is asked either way.

    One of automatic, operator

  • after_finish string required

    What the stage does after the session: advance the show, return to its schedule, or play after_source.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[] required

    In slot order.

  • ready_presenter_ids string[] read-only
  • live_presenter_id string or null read-only
  • rehearsals object[] required read-only
    6 fields in rehearsals
    • id string required
    • starts_at integer required

      Epoch ms. Presenter links open 15 minutes earlier.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer required

      Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • note string

      Up to 200 characters

  • went_live_at integer or null

    Epoch ms, once live.

  • went_live_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • finished_at integer or null

    Epoch ms, once finished.

  • finished_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • created_at integer read-only
  • updated_at integer read-only
  • presenters object[] required

    The session's presenters in slot order, with the state of their link. Links themselves are never returned here.

    4 fields in presenters
    • id string required
    • ref string or null
    • name string required
    • invite object required
      3 fields in invite
      • status string required

        none: no link yet. active: a link works. revoked: the link was ended.

        One of none, active, revoked

      • last_seen_at integer or null

        When the presenter last opened the link. Epoch ms.

      • last_seen_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

curl -X PATCH "https://www.wunderframe.com/api/v1/sessions/Zp4dW1qR8sN2mK7vB3xYc" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "starts_at": "2026-10-08T14:15:00Z",
  "duration_min": 45
}'
Response 200
{
  "id": "Zp4dW1qR8sN2mK7vB3xYc",
  "ref": "agenda/b-14",
  "title": "The AI-Native Startup",
  "status": "scheduled",
  "room_id": "room_hallB",
  "screen_ids": null,
  "stage_ids": [
    "st_hallB",
    "st_hallB_side"
  ],
  "stage_id": "st_hallB",
  "scene_id": "sc_presenter",
  "intro_scene_id": "sc_speaker_intro",
  "show_id": null,
  "starts_at": 1791468000000,
  "starts_at_iso": "2026-10-08T14:00:00.000Z",
  "ends_at": 1791469800000,
  "ends_at_iso": "2026-10-08T14:30:00.000Z",
  "duration_min": 30,
  "join_opens_min": 30,
  "go_live": "on_ready",
  "go_live_by": "automatic",
  "after_finish": "next_cue",
  "after_source": null,
  "presenter_ids": [
    "wkFRBzMq6POZ_qYJHvgQf"
  ],
  "ready_presenter_ids": [],
  "live_presenter_id": null,
  "rehearsals": [],
  "went_live_at": null,
  "went_live_at_iso": null,
  "finished_at": null,
  "finished_at_iso": null,
  "created_at": 1789372800000,
  "updated_at": 1789372800000,
  "presenters": [
    {
      "id": "wkFRBzMq6POZ_qYJHvgQf",
      "ref": "speakerportal/1234",
      "name": "Ada Lovelace",
      "invite": {
        "status": "active",
        "last_seen_at": null,
        "last_seen_at_iso": null
      }
    }
  ]
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Get a session by your ref

GET /sessions/by-ref/{ref} sessions:read

Parameters

  • ref string required path

    Your ref. May contain slashes: /sessions/by-ref/agenda/b-14.

Responses

  • 200 The session.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • id string required read-only
  • ref string or null

    Your own id for the session. Unique in the workspace.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string required

    Up to 200 characters

  • status string required read-only

    scheduled → backstage (a presenter joined) → ready → live → finished, or cancelled. Changed by presenters and operators, not through the API.

    One of scheduled, backstage, ready, live, finished, cancelled

  • room_id string or null

    The room the session happens in. A session in a room drives every screen of the room (the front and the side screens show the same), unless screen_ids narrows it. null for a session placed on a stage in no room.

  • screen_ids string[] or null

    The screens of the room it was narrowed to, as chosen. null = every screen of the room, including screens added to the room later.

  • stage_ids string[] required read-only

    Every stage (screen) the session drives right now, from its room and screen_ids. Follows the room when screens join or leave it.

  • stage_id string required

    The first of stage_ids — the one stage, for clients written before rooms. A session on several screens has more in stage_ids.

  • scene_id string or null

    The scene that frames the presenter on screen.

  • intro_scene_id string or null

    The speaker intro: a scene played once when the session goes live, before the presenter scene.

  • show_id string or null

    The show this session belongs to, if any.

  • starts_at integer required

    Epoch ms.

  • starts_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • ends_at integer read-only

    Planned end: starts_at + duration_min. Epoch ms.

  • ends_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • duration_min integer required

    1–1440

  • join_opens_min integer

    How many minutes before the start presenters can join backstage.

    0–1440

  • go_live string required

    WHEN the session is due: on_ready as soon as a presenter is ready, at_start at starts_at once someone is ready.

    One of on_ready, at_start

  • go_live_by string required

    WHO commits it once due: automatic — the stage switches by itself; operator — the desk is asked and the stage waits for Take. A live show’s controller is asked either way.

    One of automatic, operator

  • after_finish string required

    What the stage does after the session: advance the show, return to its schedule, or play after_source.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[] required

    In slot order.

  • ready_presenter_ids string[] read-only
  • live_presenter_id string or null read-only
  • rehearsals object[] required read-only
    6 fields in rehearsals
    • id string required
    • starts_at integer required

      Epoch ms. Presenter links open 15 minutes earlier.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer required

      Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • note string

      Up to 200 characters

  • went_live_at integer or null

    Epoch ms, once live.

  • went_live_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • finished_at integer or null

    Epoch ms, once finished.

  • finished_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • created_at integer read-only
  • updated_at integer read-only
  • presenters object[] required

    The session's presenters in slot order, with the state of their link. Links themselves are never returned here.

    4 fields in presenters
    • id string required
    • ref string or null
    • name string required
    • invite object required
      3 fields in invite
      • status string required

        none: no link yet. active: a link works. revoked: the link was ended.

        One of none, active, revoked

      • last_seen_at integer or null

        When the presenter last opened the link. Epoch ms.

      • last_seen_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

curl "https://www.wunderframe.com/api/v1/sessions/by-ref/agenda/b-14" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "id": "Zp4dW1qR8sN2mK7vB3xYc",
  "ref": "agenda/b-14",
  "title": "The AI-Native Startup",
  "status": "scheduled",
  "room_id": "room_hallB",
  "screen_ids": null,
  "stage_ids": [
    "st_hallB",
    "st_hallB_side"
  ],
  "stage_id": "st_hallB",
  "scene_id": "sc_presenter",
  "intro_scene_id": "sc_speaker_intro",
  "show_id": null,
  "starts_at": 1791468000000,
  "starts_at_iso": "2026-10-08T14:00:00.000Z",
  "ends_at": 1791469800000,
  "ends_at_iso": "2026-10-08T14:30:00.000Z",
  "duration_min": 30,
  "join_opens_min": 30,
  "go_live": "on_ready",
  "go_live_by": "automatic",
  "after_finish": "next_cue",
  "after_source": null,
  "presenter_ids": [
    "wkFRBzMq6POZ_qYJHvgQf"
  ],
  "ready_presenter_ids": [],
  "live_presenter_id": null,
  "rehearsals": [],
  "went_live_at": null,
  "went_live_at_iso": null,
  "finished_at": null,
  "finished_at_iso": null,
  "created_at": 1789372800000,
  "updated_at": 1789372800000,
  "presenters": [
    {
      "id": "wkFRBzMq6POZ_qYJHvgQf",
      "ref": "speakerportal/1234",
      "name": "Ada Lovelace",
      "invite": {
        "status": "active",
        "last_seen_at": null,
        "last_seen_at_iso": null
      }
    }
  ]
}
Error example
Response 401
{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key."
  }
}

Create or update a session by your ref

PUT /sessions/by-ref/{ref} sessions

The sync endpoint. Creates the session when none has this ref (then room_id or stage_id, and starts_at, are required), otherwise updates the fields you send. Safe to repeat. Presenters can be named by your presenter refs.

Parameters

  • ref string required path

    Your ref. May contain slashes.

Request body required

  • ref string or null

    Ignored by the upsert, which takes the ref from the path.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string

    Defaults to "Untitled session".

    Up to 200 characters

  • room_id string or null

    The room it happens in: the session drives every screen of the room, the same on each, unless screen_ids narrows it. Creating needs room_id or stage_id. With stage_id too, only that screen of the room. Cannot change while the session is live.

  • screen_ids string[] or null

    Only these screens (stage ids) of the room; null or [] = all of them. Alone, it keeps the session in its room and changes the screens. A screen not in the room is refused (400).

    Up to 50 items

  • stage_id string

    One screen: the session drives exactly this stage (in its room, if it has one). Kept for clients written before rooms; send room_id to drive the whole room. Creating needs room_id or stage_id. Cannot change while the session is live.

  • scene_id string or null
  • intro_scene_id string or null

    A scene played once when the session goes live. Its blanks get the speaker and the session.

  • show_id string or null
  • starts_at integer or string (date-time)

    Required when creating.

  • duration_min integer

    Minutes, 1–1440 (values outside are clamped). Default 30.

  • join_opens_min integer

    Minutes, 0–1440 (clamped). Default 30.

  • go_live string

    Default on_ready.

    One of on_ready, at_start

  • go_live_by string

    Default automatic.

    One of automatic, operator

  • after_finish string

    Default release.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[]

    Replaces the presenter list, in slot order. A presenter taken off the session loses their link.

    Up to 50 items

  • presenter_refs string[]

    The same, by your presenter refs. Send this or presenter_ids, not both.

    Up to 50 items

Responses

  • 200 Updated.
  • 201 Created.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 409 Conflicts with the current state.
Response fields (200)
  • id string required read-only
  • ref string or null

    Your own id for the session. Unique in the workspace.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string required

    Up to 200 characters

  • status string required read-only

    scheduled → backstage (a presenter joined) → ready → live → finished, or cancelled. Changed by presenters and operators, not through the API.

    One of scheduled, backstage, ready, live, finished, cancelled

  • room_id string or null

    The room the session happens in. A session in a room drives every screen of the room (the front and the side screens show the same), unless screen_ids narrows it. null for a session placed on a stage in no room.

  • screen_ids string[] or null

    The screens of the room it was narrowed to, as chosen. null = every screen of the room, including screens added to the room later.

  • stage_ids string[] required read-only

    Every stage (screen) the session drives right now, from its room and screen_ids. Follows the room when screens join or leave it.

  • stage_id string required

    The first of stage_ids — the one stage, for clients written before rooms. A session on several screens has more in stage_ids.

  • scene_id string or null

    The scene that frames the presenter on screen.

  • intro_scene_id string or null

    The speaker intro: a scene played once when the session goes live, before the presenter scene.

  • show_id string or null

    The show this session belongs to, if any.

  • starts_at integer required

    Epoch ms.

  • starts_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • ends_at integer read-only

    Planned end: starts_at + duration_min. Epoch ms.

  • ends_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • duration_min integer required

    1–1440

  • join_opens_min integer

    How many minutes before the start presenters can join backstage.

    0–1440

  • go_live string required

    WHEN the session is due: on_ready as soon as a presenter is ready, at_start at starts_at once someone is ready.

    One of on_ready, at_start

  • go_live_by string required

    WHO commits it once due: automatic — the stage switches by itself; operator — the desk is asked and the stage waits for Take. A live show’s controller is asked either way.

    One of automatic, operator

  • after_finish string required

    What the stage does after the session: advance the show, return to its schedule, or play after_source.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[] required

    In slot order.

  • ready_presenter_ids string[] read-only
  • live_presenter_id string or null read-only
  • rehearsals object[] required read-only
    6 fields in rehearsals
    • id string required
    • starts_at integer required

      Epoch ms. Presenter links open 15 minutes earlier.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer required

      Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • note string

      Up to 200 characters

  • went_live_at integer or null

    Epoch ms, once live.

  • went_live_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • finished_at integer or null

    Epoch ms, once finished.

  • finished_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • created_at integer read-only
  • updated_at integer read-only
  • presenters object[] required

    The session's presenters in slot order, with the state of their link. Links themselves are never returned here.

    4 fields in presenters
    • id string required
    • ref string or null
    • name string required
    • invite object required
      3 fields in invite
      • status string required

        none: no link yet. active: a link works. revoked: the link was ended.

        One of none, active, revoked

      • last_seen_at integer or null

        When the presenter last opened the link. Epoch ms.

      • last_seen_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

Response fields (201)
  • id string required read-only
  • ref string or null

    Your own id for the session. Unique in the workspace.

    Pattern ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$

  • title string required

    Up to 200 characters

  • status string required read-only

    scheduled → backstage (a presenter joined) → ready → live → finished, or cancelled. Changed by presenters and operators, not through the API.

    One of scheduled, backstage, ready, live, finished, cancelled

  • room_id string or null

    The room the session happens in. A session in a room drives every screen of the room (the front and the side screens show the same), unless screen_ids narrows it. null for a session placed on a stage in no room.

  • screen_ids string[] or null

    The screens of the room it was narrowed to, as chosen. null = every screen of the room, including screens added to the room later.

  • stage_ids string[] required read-only

    Every stage (screen) the session drives right now, from its room and screen_ids. Follows the room when screens join or leave it.

  • stage_id string required

    The first of stage_ids — the one stage, for clients written before rooms. A session on several screens has more in stage_ids.

  • scene_id string or null

    The scene that frames the presenter on screen.

  • intro_scene_id string or null

    The speaker intro: a scene played once when the session goes live, before the presenter scene.

  • show_id string or null

    The show this session belongs to, if any.

  • starts_at integer required

    Epoch ms.

  • starts_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • ends_at integer read-only

    Planned end: starts_at + duration_min. Epoch ms.

  • ends_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • duration_min integer required

    1–1440

  • join_opens_min integer

    How many minutes before the start presenters can join backstage.

    0–1440

  • go_live string required

    WHEN the session is due: on_ready as soon as a presenter is ready, at_start at starts_at once someone is ready.

    One of on_ready, at_start

  • go_live_by string required

    WHO commits it once due: automatic — the stage switches by itself; operator — the desk is asked and the stage waits for Take. A live show’s controller is asked either way.

    One of automatic, operator

  • after_finish string required

    What the stage does after the session: advance the show, return to its schedule, or play after_source.

    One of next_cue, release, source

  • after_source object or any or null
  • presenter_ids string[] required

    In slot order.

  • ready_presenter_ids string[] read-only
  • live_presenter_id string or null read-only
  • rehearsals object[] required read-only
    6 fields in rehearsals
    • id string required
    • starts_at integer required

      Epoch ms. Presenter links open 15 minutes earlier.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer required

      Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • note string

      Up to 200 characters

  • went_live_at integer or null

    Epoch ms, once live.

  • went_live_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • finished_at integer or null

    Epoch ms, once finished.

  • finished_at_iso string (date-time) or null

    The same time in ISO 8601 (UTC).

  • created_at integer read-only
  • updated_at integer read-only
  • presenters object[] required

    The session's presenters in slot order, with the state of their link. Links themselves are never returned here.

    4 fields in presenters
    • id string required
    • ref string or null
    • name string required
    • invite object required
      3 fields in invite
      • status string required

        none: no link yet. active: a link works. revoked: the link was ended.

        One of none, active, revoked

      • last_seen_at integer or null

        When the presenter last opened the link. Epoch ms.

      • last_seen_at_iso string (date-time) or null

        The same time in ISO 8601 (UTC).

curl -X PUT "https://www.wunderframe.com/api/v1/sessions/by-ref/agenda/b-14" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "The AI-Native Startup",
  "room_id": "room_hallB",
  "starts_at": "2026-10-08T14:00:00Z",
  "duration_min": 30,
  "go_live": "on_ready",
  "go_live_by": "operator",
  "after_finish": "next_cue",
  "presenter_refs": [
    "speakerportal/1234",
    "speakerportal/1235"
  ]
}'
Response 200
{
  "id": "Zp4dW1qR8sN2mK7vB3xYc",
  "ref": "agenda/b-14",
  "title": "The AI-Native Startup",
  "status": "scheduled",
  "room_id": "room_hallB",
  "screen_ids": null,
  "stage_ids": [
    "st_hallB",
    "st_hallB_side"
  ],
  "stage_id": "st_hallB",
  "scene_id": "sc_presenter",
  "intro_scene_id": "sc_speaker_intro",
  "show_id": null,
  "starts_at": 1791468000000,
  "starts_at_iso": "2026-10-08T14:00:00.000Z",
  "ends_at": 1791469800000,
  "ends_at_iso": "2026-10-08T14:30:00.000Z",
  "duration_min": 30,
  "join_opens_min": 30,
  "go_live": "on_ready",
  "go_live_by": "automatic",
  "after_finish": "next_cue",
  "after_source": null,
  "presenter_ids": [
    "wkFRBzMq6POZ_qYJHvgQf"
  ],
  "ready_presenter_ids": [],
  "live_presenter_id": null,
  "rehearsals": [],
  "went_live_at": null,
  "went_live_at_iso": null,
  "finished_at": null,
  "finished_at_iso": null,
  "created_at": 1789372800000,
  "updated_at": 1789372800000,
  "presenters": [
    {
      "id": "wkFRBzMq6POZ_qYJHvgQf",
      "ref": "speakerportal/1234",
      "name": "Ada Lovelace",
      "invite": {
        "status": "active",
        "last_seen_at": null,
        "last_seen_at_iso": null
      }
    }
  ]
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Create a presenter link

POST /sessions/{id}/invites sessions

Makes the personal link a presenter joins with. The link is returned once — Wunderframe does not keep it — so pass it on straight away.

If the presenter already has a working link the call is refused with 409; send "regenerate": true to replace it (the old link stops working).

The presenter must be on the session. Presenter links need a one-time setup by the workspace owner: until the owner has created a first link in the app, this returns 409.

Parameters

  • id string required path

    The session id.

Request body required

  • presenter_id string required
  • regenerate boolean

    Replace a working link with a new one.

    Default false

Responses

  • 201 The link.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
  • 409 Conflicts with the current state.
  • 503 A service this call needs is not available right now.
Response fields (201)
  • presenter_id string required
  • link string (uri) required

    The presenter's personal link. It works as their login, so send it only to them. It is shown this once.

curl -X POST "https://www.wunderframe.com/api/v1/sessions/Zp4dW1qR8sN2mK7vB3xYc/invites" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "presenter_id": "wkFRBzMq6POZ_qYJHvgQf"
}'
Response 201
{
  "presenter_id": "wkFRBzMq6POZ_qYJHvgQf",
  "link": "https://www.wunderframe.com/p/wfp.…"
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Schedule a rehearsal

POST /sessions/{id}/rehearsals sessions

Adds a rehearsal slot in which presenters can join and test without going on air. Omit starts_at to rehearse now.

Returns a new link for every presenter on the session who has no working link yet. Refused with 409 once the session has finished or was canceled.

Parameters

  • id string required path

    The session id.

Request body required

  • starts_at integer or string (date-time)

    When it starts. Omit for now.

  • duration_min integer required

    Minutes: 5–480 for a scheduled rehearsal, 10–240 for one starting now (clamped).

  • note string

    Up to 200 characters

Responses

  • 201 The rehearsal and new links.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
  • 409 Conflicts with the current state.
  • 503 A service this call needs is not available right now.
Response fields (201)
  • rehearsal object required
    6 fields in rehearsal
    • id string required
    • starts_at integer required

      Epoch ms. Presenter links open 15 minutes earlier.

    • starts_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • ends_at integer required

      Epoch ms.

    • ends_at_iso string (date-time) or null

      The same time in ISO 8601 (UTC).

    • note string

      Up to 200 characters

  • links map of string (uri) required

    Presenter id → a new link, for each presenter who had no working link. Presenters who already have one keep it: it opens the rehearsal too.

curl -X POST "https://www.wunderframe.com/api/v1/sessions/Zp4dW1qR8sN2mK7vB3xYc/rehearsals" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "duration_min": 30,
  "note": "Tech check"
}'
Response 201
{
  "rehearsal": {
    "id": "a1b2c3d4",
    "starts_at": 1789372800000,
    "starts_at_iso": "2026-09-14T08:00:00.000Z",
    "ends_at": 1789376400000,
    "ends_at_iso": "2026-09-14T09:00:00.000Z",
    "note": "Ad-hoc rehearsal"
  },
  "links": {
    "wkFRBzMq6POZ_qYJHvgQf": "https://www.wunderframe.com/p/wfp.…"
  }
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Get a session’s feedback

GET /sessions/{id}/feedback sessions:read

What the guests answered in the session’s survey: each question’s result (averages and their spread, NPS, percentages), the text answers newest first — the ones the auto-check held back marked flagged — and the feedback link. ?format=csv answers every response as CSV. No participant ever appears.

Parameters

  • id string required path

    The session id.

  • format string query

    One of json, csv

Responses

  • 200 The results.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • session object
    5 fields in session
    • id string
    • title string
    • show_id string or null
    • starts_at integer
    • status string
  • speakers object[]
    2 fields in speakers
    • id string
    • name string
  • form object
    3 fields in form
    • from string

      One of session, show, workspace, stock

    • enabled boolean
    • share_with_speakers string
  • window object
    3 fields in window
    • phase string

      One of before, during, after, closed, off

    • open boolean
    • closes_at integer
  • results object
    2 fields in results
    • responses integer
    • questions object[]
      10 fields in questions
      • key string

        The question id, or <id>:<presenter id> per speaker.

      • kind string
      • text string
      • presenter_id string
      • answered integer
      • avg number or null
      • counts integer[]

        Per value, lowest first.

      • nps integer or null

        Promoters minus detractors, in percent.

      • options object[]
        4 fields in options
        • id string
        • label string
        • count integer
        • pct integer
      • texts object[]
        3 fields in texts
        • text string
        • at integer
        • flagged boolean
  • link string

    The feedback link guests open without joining.

curl "https://www.wunderframe.com/api/v1/sessions/Zp4dW1qR8sN2mK7vB3xYc/feedback" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "session": {
    "id": "Zp4dW1qR8sN2mK7vB3xYc",
    "title": "The AI-Native Startup",
    "show_id": null,
    "starts_at": 1791468000000,
    "status": "finished"
  },
  "speakers": [
    {
      "id": "wkFRBzMq6POZ_qYJHvgQf",
      "name": "Ada Lovelace"
    }
  ],
  "form": {
    "from": "workspace",
    "enabled": true,
    "share_with_speakers": "ratings"
  },
  "window": {
    "phase": "after",
    "open": true,
    "closes_at": 1792074600000
  },
  "results": {
    "responses": 84,
    "questions": [
      {
        "key": "overall",
        "kind": "rating",
        "text": "How was this session overall?",
        "answered": 84,
        "avg": 4.4,
        "counts": [
          1,
          2,
          6,
          25,
          50
        ]
      }
    ]
  },
  "link": "https://www.wunderframe.com/f/23456789abcd"
}
Error example
Response 401
{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key."
  }
}

Get an event’s feedback

GET /shows/{id}/feedback sessions:read

Every session of the event (show) with its answers, overall rating, speaker ratings and NPS — the comparison organizers sort.

Parameters

  • id string required path

    The show (event) id.

Responses

  • 200 The sessions compared.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • show object
    2 fields in show
    • id string
    • title string
  • sessions object[]
    9 fields in sessions
    • id string
    • title string
    • starts_at integer
    • status string
    • enabled boolean
    • responses integer
    • overall number or null
    • nps integer or null
    • speakers object[]
      3 fields in speakers
      • presenter_id string
      • name string
      • avg number or null
curl "https://www.wunderframe.com/api/v1/shows/wkFRBzMq6POZ_qYJHvgQf/feedback" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "show": {
    "id": "sh_day1",
    "title": "Day one"
  },
  "sessions": [
    {
      "id": "Zp4dW1qR8sN2mK7vB3xYc",
      "title": "The AI-Native Startup",
      "starts_at": 1791468000000,
      "status": "finished",
      "enabled": true,
      "responses": 84,
      "overall": 4.4,
      "nps": 41,
      "speakers": [
        {
          "presenter_id": "wkFRBzMq6POZ_qYJHvgQf",
          "name": "Ada Lovelace",
          "avg": 4.6
        }
      ]
    }
  ]
}
Error example
Response 401
{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key."
  }
}

Get a feedback form

GET /feedback/form sessions:read

The survey a scope asks: scope=workspace (the default every session gets), scope=show&id=… or scope=session&id=…. own is null when the scope inherits; inherited is what it gets then (session → event → workspace → the standard form).

Parameters

  • scope string query

    workspace, show or session.

    One of workspace, show, session

  • id string query

    The show or session id.

Responses

  • 200 The form.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • scope object
    2 fields in scope
    • kind string

      One of workspace, show, session

    • id string
  • own object or any or null

    Null: it inherits.

  • inherited object
    2 fields in inherited
    • from string

      One of show, workspace, stock

    • setup object

      What a feedback form asks and when.

      5 fields in setup
      • enabled boolean

        False: no feedback for this scope (and what inherits from it).

      • questions object[]

        Up to 8 items

        8 fields in questions
        • id string

          Short and stable (answers name it). Made for you when left out.

        • kind string required

          One of rating, nps, choice, yes_no, text

        • text string required

          {speaker} is the presenter’s name on a per_speaker question.

          Up to 200 characters

        • required boolean
        • options object[]

          choice: 2–8.

          2 fields in options
          • id string
          • label string
        • max_choices integer

          At least 1

        • style string

          rating only.

          One of stars, faces

        • per_speaker boolean

          rating: asked once per presenter of the session.

      • timing object
        4 fields in timing
        • at_end boolean

          Phones bring the Feedback tab forward when the session ends.

        • during boolean

          The tab is there while the session runs.

        • link boolean

          The feedback link /f/<key> works.

        • open_days integer

          1–60

      • anonymous boolean

        False: guests may add their name.

      • share_with_speakers string

        One of none, ratings, all

curl "https://www.wunderframe.com/api/v1/feedback/form" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "scope": {
    "kind": "session",
    "id": "Zp4dW1qR8sN2mK7vB3xYc"
  },
  "own": null,
  "inherited": {
    "from": "workspace",
    "setup": {
      "enabled": true,
      "questions": [
        {
          "id": "overall",
          "kind": "rating",
          "text": "How was this session overall?",
          "required": true,
          "style": "stars"
        }
      ],
      "timing": {
        "at_end": true,
        "during": false,
        "link": true,
        "open_days": 7
      },
      "anonymous": true,
      "share_with_speakers": "ratings"
    }
  }
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Set a feedback form

PUT /feedback/form sessions

Give the scope its own form. Only the fields you send change; the rest comes from what it has, else what it inherits. At most 8 questions; enabled: false switches feedback off for the scope.

Parameters

  • scope string query

    workspace, show or session.

    One of workspace, show, session

  • id string query

    The show or session id.

Request body required

  • enabled boolean

    False: no feedback for this scope (and what inherits from it).

  • questions object[]

    Up to 8 items

    8 fields in questions
    • id string

      Short and stable (answers name it). Made for you when left out.

    • kind string required

      One of rating, nps, choice, yes_no, text

    • text string required

      {speaker} is the presenter’s name on a per_speaker question.

      Up to 200 characters

    • required boolean
    • options object[]

      choice: 2–8.

      2 fields in options
      • id string
      • label string
    • max_choices integer

      At least 1

    • style string

      rating only.

      One of stars, faces

    • per_speaker boolean

      rating: asked once per presenter of the session.

  • timing object
    4 fields in timing
    • at_end boolean

      Phones bring the Feedback tab forward when the session ends.

    • during boolean

      The tab is there while the session runs.

    • link boolean

      The feedback link /f/<key> works.

    • open_days integer

      1–60

  • anonymous boolean

    False: guests may add their name.

  • share_with_speakers string

    One of none, ratings, all

Responses

  • 200 The form.
  • 400 The request is invalid — details.field names the field when there is one.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • scope object
    2 fields in scope
    • kind string

      One of workspace, show, session

    • id string
  • own object or any or null

    Null: it inherits.

  • inherited object
    2 fields in inherited
    • from string

      One of show, workspace, stock

    • setup object

      What a feedback form asks and when.

      5 fields in setup
      • enabled boolean

        False: no feedback for this scope (and what inherits from it).

      • questions object[]

        Up to 8 items

        8 fields in questions
        • id string

          Short and stable (answers name it). Made for you when left out.

        • kind string required

          One of rating, nps, choice, yes_no, text

        • text string required

          {speaker} is the presenter’s name on a per_speaker question.

          Up to 200 characters

        • required boolean
        • options object[]

          choice: 2–8.

          2 fields in options
          • id string
          • label string
        • max_choices integer

          At least 1

        • style string

          rating only.

          One of stars, faces

        • per_speaker boolean

          rating: asked once per presenter of the session.

      • timing object
        4 fields in timing
        • at_end boolean

          Phones bring the Feedback tab forward when the session ends.

        • during boolean

          The tab is there while the session runs.

        • link boolean

          The feedback link /f/<key> works.

        • open_days integer

          1–60

      • anonymous boolean

        False: guests may add their name.

      • share_with_speakers string

        One of none, ratings, all

curl -X PUT "https://www.wunderframe.com/api/v1/feedback/form" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "questions": [
    {
      "kind": "rating",
      "text": "How was this session overall?",
      "required": true
    },
    {
      "kind": "rating",
      "text": "How was {speaker}?",
      "per_speaker": true
    },
    {
      "kind": "text",
      "text": "What will you take away?"
    }
  ],
  "timing": {
    "at_end": true,
    "during": false,
    "link": true,
    "open_days": 7
  }
}'
Response 200
{
  "scope": {
    "kind": "session",
    "id": "Zp4dW1qR8sN2mK7vB3xYc"
  },
  "own": null,
  "inherited": {
    "from": "workspace",
    "setup": {
      "enabled": true,
      "questions": [
        {
          "id": "overall",
          "kind": "rating",
          "text": "How was this session overall?",
          "required": true,
          "style": "stars"
        }
      ],
      "timing": {
        "at_end": true,
        "during": false,
        "link": true,
        "open_days": 7
      },
      "anonymous": true,
      "share_with_speakers": "ratings"
    }
  }
}
Error example
Response 400
{
  "error": {
    "code": "invalid",
    "message": "The request is invalid — `details.field` names the field when there is one."
  }
}

Drop a feedback form

DELETE /feedback/form sessions

The scope inherits again (a session its event’s, an event the workspace’s, the workspace the standard form).

Parameters

  • scope string query

    workspace, show or session.

    One of workspace, show, session

  • id string query

    The show or session id.

Responses

  • 200 What it inherits now.
  • 401 Missing or invalid API key.
  • 403 The key lacks the scope, or the role is read-only.
  • 404 Not found in this workspace.
Response fields (200)
  • scope object
    2 fields in scope
    • kind string

      One of workspace, show, session

    • id string
  • own object or any or null

    Null: it inherits.

  • inherited object
    2 fields in inherited
    • from string

      One of show, workspace, stock

    • setup object

      What a feedback form asks and when.

      5 fields in setup
      • enabled boolean

        False: no feedback for this scope (and what inherits from it).

      • questions object[]

        Up to 8 items

        8 fields in questions
        • id string

          Short and stable (answers name it). Made for you when left out.

        • kind string required

          One of rating, nps, choice, yes_no, text

        • text string required

          {speaker} is the presenter’s name on a per_speaker question.

          Up to 200 characters

        • required boolean
        • options object[]

          choice: 2–8.

          2 fields in options
          • id string
          • label string
        • max_choices integer

          At least 1

        • style string

          rating only.

          One of stars, faces

        • per_speaker boolean

          rating: asked once per presenter of the session.

      • timing object
        4 fields in timing
        • at_end boolean

          Phones bring the Feedback tab forward when the session ends.

        • during boolean

          The tab is there while the session runs.

        • link boolean

          The feedback link /f/<key> works.

        • open_days integer

          1–60

      • anonymous boolean

        False: guests may add their name.

      • share_with_speakers string

        One of none, ratings, all

curl -X DELETE "https://www.wunderframe.com/api/v1/feedback/form" \
  -H "Authorization: Bearer $WUNDERFRAME_API_KEY"
Response 200
{
  "scope": {
    "kind": "session",
    "id": "Zp4dW1qR8sN2mK7vB3xYc"
  },
  "own": null,
  "inherited": {
    "from": "workspace",
    "setup": {
      "enabled": true,
      "questions": [
        {
          "id": "overall",
          "kind": "rating",
          "text": "How was this session overall?",
          "required": true,
          "style": "stars"
        }
      ],
      "timing": {
        "at_end": true,
        "during": false,
        "link": true,
        "open_days": 7
      },
      "anonymous": true,
      "share_with_speakers": "ratings"
    }
  }
}
Error example
Response 401
{
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key."
  }
}