GoToWebinar REST API

The GoToWebinar V2 REST API exposes webinars, organizers, registrants, attendees, sessions, co-organizers, panelists, polls, questions, and surveys for the GoToWebinar virtual event platform, with OAuth 2.0 authentication via the GoTo authentication service.

GoToWebinar REST API is one of 2 APIs that GoToWebinar publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 8 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Attendees, Co-Organizers, Organizers, Panelists, and Polls. The published artifact set on APIs.io includes an OpenAPI specification, API documentation, an API reference, a getting-started guide, authentication docs, and 8 Naftiko capability specs.

Documentation

Specifications

Other Resources

OpenAPI Specification

gotowebinar-rest-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: GoToWebinar REST API
  version: '2.0'
  description: |
    REST API for the GoTo (formerly Citrix / LogMeIn) GoToWebinar virtual event platform.
    Operations cover webinars, organizers, registrants, attendees, sessions, co-organizers,
    panelists, polls, questions, surveys, and recordings.

    Source documentation: https://developer.goto.com/GoToWebinarV2
  contact:
    name: GoTo Developer Support
    email: [email protected]
    url: https://developer.goto.com/support
  license:
    name: GoTo Developer Terms
    url: https://www.goto.com/company/legal
servers:
  - url: https://api.getgo.com/G2W/rest/v2
    description: GoToWebinar V2 production base URL
security:
  - oauth2: []
tags:
  - name: Organizers
    description: Authenticated organizer account operations.
  - name: Webinars
    description: Create, read, update, and delete webinars.
  - name: Registrants
    description: Manage registrants for upcoming webinars.
  - name: Attendees
    description: Read attendees for past webinar sessions.
  - name: Sessions
    description: Inspect past and live webinar sessions.
  - name: Co-Organizers
    description: Manage co-organizers on a webinar.
  - name: Panelists
    description: Manage panelists on a webinar.
  - name: Polls
    description: Retrieve poll results from past sessions.
  - name: Questions
    description: Retrieve Q&A from past sessions.
  - name: Surveys
    description: Retrieve survey results from past sessions.
  - name: Recordings
    description: Retrieve webinar recording assets.
paths:
  /organizers/{organizerKey}/webinars:
    get:
      tags: [Webinars]
      summary: Get Webinars For An Organizer
      operationId: getWebinars
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - name: fromTime
          in: query
          required: true
          schema: { type: string, format: date-time }
        - name: toTime
          in: query
          required: true
          schema: { type: string, format: date-time }
      responses:
        '200':
          description: List of webinars in the time range.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Webinar' }
    post:
      tags: [Webinars]
      summary: Create A Webinar
      operationId: createWebinar
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/WebinarCreate' }
      responses:
        '201':
          description: Webinar created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/WebinarKeyResponse' }
  /organizers/{organizerKey}/webinars/{webinarKey}:
    get:
      tags: [Webinars]
      summary: Get A Single Webinar
      operationId: getWebinar
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      responses:
        '200':
          description: Webinar details.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Webinar' }
    put:
      tags: [Webinars]
      summary: Update A Webinar
      operationId: updateWebinar
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/WebinarUpdate' }
      responses:
        '204': { description: Webinar updated. }
    delete:
      tags: [Webinars]
      summary: Cancel A Webinar
      operationId: cancelWebinar
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - name: deleteAll
          in: query
          description: When true, deletes all past sessions of a recurring webinar (added 2025-03-25).
          schema: { type: boolean }
      responses:
        '204': { description: Webinar canceled. }
  /organizers/{organizerKey}/webinars/{webinarKey}/registrants:
    get:
      tags: [Registrants]
      summary: List Registrants
      operationId: listRegistrants
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      responses:
        '200':
          description: Registrants.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Registrant' }
    post:
      tags: [Registrants]
      summary: Create A Registrant
      operationId: createRegistrant
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - name: resendConfirmation
          in: query
          schema: { type: boolean, default: false }
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/RegistrantCreate' }
      responses:
        '201':
          description: Registrant created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/RegistrantCreated' }
  /organizers/{organizerKey}/webinars/{webinarKey}/registrants/{registrantKey}:
    get:
      tags: [Registrants]
      summary: Get A Single Registrant
      operationId: getRegistrant
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/RegistrantKey'
      responses:
        '200':
          description: Registrant.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Registrant' }
    delete:
      tags: [Registrants]
      summary: Delete A Registrant
      operationId: deleteRegistrant
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/RegistrantKey'
      responses:
        '204': { description: Registrant deleted. }
  /organizers/{organizerKey}/webinars/{webinarKey}/attendees:
    get:
      tags: [Attendees]
      summary: List All Attendees For A Webinar
      operationId: listAllAttendees
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      responses:
        '200':
          description: Attendees across all sessions.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Attendee' }
  /organizers/{organizerKey}/webinars/{webinarKey}/sessions:
    get:
      tags: [Sessions]
      summary: List Sessions For A Webinar
      operationId: listSessions
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      responses:
        '200':
          description: Sessions for the webinar.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Session' }
  /organizers/{organizerKey}/webinars/{webinarKey}/sessions/{sessionKey}/attendees:
    get:
      tags: [Attendees]
      summary: List Session Attendees
      operationId: listSessionAttendees
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/SessionKey'
      responses:
        '200':
          description: Attendees for the session.
          content:
            application/json:
              schema:
                type: array
                items: { $ref: '#/components/schemas/Attendee' }
  /organizers/{organizerKey}/webinars/{webinarKey}/sessions/{sessionKey}/attendees/{registrantKey}:
    get:
      tags: [Attendees]
      summary: Get A Session Attendee
      operationId: getSessionAttendee
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/SessionKey'
        - $ref: '#/components/parameters/RegistrantKey'
      responses:
        '200':
          description: Attendee.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Attendee' }
  /organizers/{organizerKey}/webinars/{webinarKey}/sessions/{sessionKey}/polls:
    get:
      tags: [Polls]
      summary: Get Poll Results For A Session
      operationId: getSessionPolls
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/SessionKey'
      responses:
        '200':
          description: Poll results.
  /organizers/{organizerKey}/webinars/{webinarKey}/sessions/{sessionKey}/questions:
    get:
      tags: [Questions]
      summary: Get Questions And Answers For A Session
      operationId: getSessionQuestions
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/SessionKey'
      responses:
        '200':
          description: Q&A.
  /organizers/{organizerKey}/webinars/{webinarKey}/sessions/{sessionKey}/surveys:
    get:
      tags: [Surveys]
      summary: Get Survey Results For A Session
      operationId: getSessionSurveys
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
        - $ref: '#/components/parameters/SessionKey'
      responses:
        '200':
          description: Survey results.
  /organizers/{organizerKey}/webinars/{webinarKey}/coorganizers:
    get:
      tags: [Co-Organizers]
      summary: List Co-Organizers
      operationId: listCoorganizers
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      responses:
        '200':
          description: Co-organizers for the webinar.
    post:
      tags: [Co-Organizers]
      summary: Create Co-Organizers
      operationId: createCoorganizers
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items: { $ref: '#/components/schemas/Coorganizer' }
      responses:
        '201': { description: Co-organizers added. }
  /organizers/{organizerKey}/webinars/{webinarKey}/panelists:
    get:
      tags: [Panelists]
      summary: List Panelists
      operationId: listPanelists
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      responses:
        '200':
          description: Panelists for the webinar.
    post:
      tags: [Panelists]
      summary: Create Panelists
      operationId: createPanelists
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - $ref: '#/components/parameters/WebinarKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items: { $ref: '#/components/schemas/Panelist' }
      responses:
        '201': { description: Panelists added. }
  /organizers/{organizerKey}/recordingassets:
    get:
      tags: [Recordings]
      summary: List Recording Assets For An Organizer
      operationId: listRecordingAssets
      parameters:
        - $ref: '#/components/parameters/OrganizerKey'
        - name: fromTime
          in: query
          schema: { type: string, format: date-time }
        - name: toTime
          in: query
          schema: { type: string, format: date-time }
      responses:
        '200':
          description: Recording assets.
components:
  parameters:
    OrganizerKey:
      name: organizerKey
      in: path
      required: true
      schema: { type: string }
      description: Authenticated organizer's key.
    WebinarKey:
      name: webinarKey
      in: path
      required: true
      schema: { type: string }
      description: Unique key identifying a webinar.
    SessionKey:
      name: sessionKey
      in: path
      required: true
      schema: { type: string }
      description: Unique key identifying a past session.
    RegistrantKey:
      name: registrantKey
      in: path
      required: true
      schema: { type: string }
      description: Unique key identifying a registrant.
  securitySchemes:
    oauth2:
      type: oauth2
      description: OAuth 2.0 via the GoTo authentication service.
      flows:
        authorizationCode:
          authorizationUrl: https://authentication.logmeininc.com/oauth/authorize
          tokenUrl: https://authentication.logmeininc.com/oauth/token
          refreshUrl: https://authentication.logmeininc.com/oauth/token
          scopes:
            collab: Collaboration / GoToWebinar scope.
            identity:scim.me: Read the authenticated user's identity (SCIM /me).
  schemas:
    Webinar:
      type: object
      properties:
        webinarKey: { type: string }
        subject: { type: string }
        description: { type: string }
        organizerKey: { type: string }
        times:
          type: array
          items:
            type: object
            properties:
              startTime: { type: string, format: date-time }
              endTime: { type: string, format: date-time }
        timeZone: { type: string }
        registrationUrl: { type: string, format: uri }
        experienceType:
          type: string
          enum: [CLASSIC, BROADCAST, SIMULIVE]
        recurrenceType:
          type: string
          enum: [single_session, sequence, series]
        status:
          type: string
          enum: [NEW, UPDATED, DELETED]
    WebinarCreate:
      type: object
      required: [subject, times, timeZone]
      properties:
        subject: { type: string }
        description: { type: string }
        times:
          type: array
          items:
            type: object
            properties:
              startTime: { type: string, format: date-time }
              endTime: { type: string, format: date-time }
        timeZone: { type: string }
        type:
          type: string
          enum: [single_session, sequence, series]
        experienceType:
          type: string
          enum: [CLASSIC, BROADCAST, SIMULIVE]
        isPasswordProtected: { type: boolean }
    WebinarUpdate:
      type: object
      properties:
        subject: { type: string }
        description: { type: string }
        times:
          type: array
          items:
            type: object
            properties:
              startTime: { type: string, format: date-time }
              endTime: { type: string, format: date-time }
        timeZone: { type: string }
    WebinarKeyResponse:
      type: object
      properties:
        webinarKey: { type: string }
    Registrant:
      type: object
      properties:
        registrantKey: { type: string }
        firstName: { type: string }
        lastName: { type: string }
        email: { type: string, format: email }
        phone: { type: string }
        organization: { type: string }
        jobTitle: { type: string }
        registrationDate: { type: string, format: date-time }
        status:
          type: string
          enum: [APPROVED, DENIED, WAITING]
        joinUrl: { type: string, format: uri }
        responses:
          type: array
          items:
            type: object
            properties:
              question: { type: string }
              answer: { type: string }
    RegistrantCreate:
      type: object
      required: [firstName, lastName, email]
      properties:
        firstName: { type: string }
        lastName: { type: string }
        email: { type: string, format: email }
        phone: { type: string }
        organization: { type: string }
        jobTitle: { type: string }
        industry: { type: string }
        responses:
          type: array
          items:
            type: object
            properties:
              questionKey: { type: string }
              responseText: { type: string }
    RegistrantCreated:
      type: object
      properties:
        registrantKey: { type: string }
        joinUrl: { type: string, format: uri }
        status: { type: string }
    Attendee:
      type: object
      properties:
        registrantKey: { type: string }
        sessionKey: { type: string }
        firstName: { type: string }
        lastName: { type: string }
        email: { type: string, format: email }
        attendanceTimeInSeconds: { type: integer }
        joinTime: { type: string, format: date-time }
        leaveTime: { type: string, format: date-time }
    Session:
      type: object
      properties:
        sessionKey: { type: string }
        webinarKey: { type: string }
        webinarID: { type: string }
        subject: { type: string }
        startTime: { type: string, format: date-time }
        endTime: { type: string, format: date-time }
        registrantsAttended: { type: integer }
    Coorganizer:
      type: object
      required: [email, givenName, surname]
      properties:
        email: { type: string, format: email }
        givenName: { type: string }
        surname: { type: string }
        external: { type: boolean }
    Panelist:
      type: object
      required: [name, email]
      properties:
        name: { type: string }
        email: { type: string, format: email }