SavvyCal Events API

Manage scheduled events and bookings.

OpenAPI Specification

savvycal-events-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: SavvyCal Meetings Current User Events API
  description: 'The SavvyCal Meetings REST API enables developers to manage scheduling links, events, webhooks, workflows, and time zones programmatically. It uses OAuth 2.0 and personal access tokens for authentication and communicates in JSON format.

    '
  version: '1.0'
  contact:
    name: SavvyCal Developer Support
    url: https://developers.savvycal.com/
  termsOfService: https://savvycal.com/legal/terms
  license:
    name: Proprietary
    url: https://savvycal.com/
servers:
- url: https://api.savvycal.com/v1
  description: SavvyCal API v1
security:
- BearerAuth: []
tags:
- name: Events
  description: Manage scheduled events and bookings.
paths:
  /events:
    get:
      operationId: listEvents
      summary: List events
      description: List your events scheduled via SavvyCal.
      tags:
      - Events
      parameters:
      - name: page
        in: query
        description: Page number for pagination.
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: per_page
        in: query
        description: Number of results per page.
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 20
      responses:
        '200':
          description: Paginated list of events.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EventList'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /events/{event_id}:
    get:
      operationId: getEvent
      summary: Get event
      description: Fetch a single event by its ID.
      tags:
      - Events
      parameters:
      - $ref: '#/components/parameters/EventId'
      responses:
        '200':
          description: Event details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /events/{event_id}/cancel:
    post:
      operationId: cancelEvent
      summary: Cancel event
      description: Cancel an event by its ID.
      tags:
      - Events
      parameters:
      - $ref: '#/components/parameters/EventId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelEventRequest'
      responses:
        '200':
          description: Event successfully canceled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /links/{link_id}/events:
    post:
      operationId: createEvent
      summary: Create event
      description: 'Create a new event via a scheduling link. You can only create events that match an available time slot for the underlying scheduling link. Use the List Available Slots endpoint to find suitable times.

        '
      tags:
      - Events
      parameters:
      - $ref: '#/components/parameters/LinkId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEventRequest'
      responses:
        '200':
          description: Event successfully created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Event'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
components:
  schemas:
    CreateEventRequest:
      type: object
      description: Request body for creating a new event via a scheduling link.
      required:
      - start_time
      - attendee
      properties:
        start_time:
          type: string
          format: date-time
          description: 'The start time for the event. Must match an available slot for the scheduling link.

            '
        attendee:
          type: object
          description: Primary attendee information.
          required:
          - name
          - email
          properties:
            name:
              type: string
              description: Attendee's full name.
            email:
              type: string
              format: email
              description: Attendee's email address.
            time_zone:
              type: string
              description: Attendee's time zone.
              example: America/Chicago
        duration:
          type: integer
          description: Desired duration in minutes (must be one of the link's allowed durations).
        fields:
          type: object
          description: Custom form field responses keyed by field ID.
          additionalProperties: true
    EventAttendee:
      type: object
      description: An attendee of a scheduled event.
      properties:
        id:
          type: string
          description: Unique attendee identifier.
        name:
          type: string
          description: Attendee's name.
        email:
          type: string
          format: email
          description: Attendee's email address.
        time_zone:
          type: string
          description: Attendee's time zone.
        status:
          type: string
          description: Attendee's response status.
          enum:
          - accepted
          - declined
          - tentative
          - awaiting
    Error:
      type: object
      description: Standard error response.
      properties:
        error:
          type: string
          description: Human-readable error message.
        errors:
          type: object
          description: Field-level validation errors.
          additionalProperties:
            type: array
            items:
              type: string
    Conferencing:
      type: object
      description: Video conferencing details for an event.
      properties:
        join_url:
          type: string
          format: uri
          nullable: true
          description: URL to join the video call.
        meeting_id:
          type: string
          nullable: true
          description: Meeting ID for the video call.
        integration_type:
          type: string
          description: The conferencing integration type (e.g., zoom, google_meet).
          example: zoom
    PaginationMeta:
      type: object
      description: Pagination metadata for list responses.
      properties:
        current_page:
          type: integer
          description: Current page number.
        per_page:
          type: integer
          description: Number of items per page.
        total_count:
          type: integer
          description: Total number of items.
        total_pages:
          type: integer
          description: Total number of pages.
    CancelEventRequest:
      type: object
      description: Request body for canceling an event.
      properties:
        reason:
          type: string
          description: Optional reason for canceling the event.
    Event:
      type: object
      description: A scheduled event/booking on SavvyCal.
      properties:
        id:
          type: string
          description: Unique event identifier.
        status:
          type: string
          description: Current status of the event.
          enum:
          - confirmed
          - canceled
          - awaiting_reschedule
          - awaiting_checkout
          - awaiting_approval
        start_time:
          type: string
          format: date-time
          description: Event start time (ISO 8601).
        end_time:
          type: string
          format: date-time
          description: Event end time (ISO 8601).
        duration:
          type: integer
          description: Event duration in minutes.
        buffer_before:
          type: integer
          description: Buffer time before the event in minutes.
          nullable: true
        buffer_after:
          type: integer
          description: Buffer time after the event in minutes.
          nullable: true
        original_start_time:
          type: string
          format: date-time
          nullable: true
          description: Original start time if the event was rescheduled.
        attendees:
          type: array
          description: All event attendees.
          items:
            $ref: '#/components/schemas/EventAttendee'
        conferencing:
          $ref: '#/components/schemas/Conferencing'
        payment:
          $ref: '#/components/schemas/Payment'
          nullable: true
        scope:
          $ref: '#/components/schemas/Scope'
          nullable: true
        created_at:
          type: string
          format: date-time
          description: When the event was created.
        updated_at:
          type: string
          format: date-time
          description: When the event was last updated.
    EventList:
      type: object
      description: Paginated list of events.
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Event'
        meta:
          $ref: '#/components/schemas/PaginationMeta'
    Payment:
      type: object
      description: Payment information associated with an event.
      properties:
        amount:
          type: number
          description: Payment amount.
        state:
          type: string
          description: Payment state.
          enum:
          - awaiting_checkout
          - paid
        stripe_dashboard_url:
          type: string
          format: uri
          nullable: true
          description: Link to the Stripe dashboard record.
    Scope:
      type: object
      description: A team or organizational scope.
      properties:
        id:
          type: string
          description: Unique scope identifier.
        name:
          type: string
          description: Scope name.
        slug:
          type: string
          description: URL slug for the scope.
  responses:
    Unauthorized:
      description: Authentication credentials missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnprocessableEntity:
      description: Validation errors.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    EventId:
      name: event_id
      in: path
      required: true
      description: The unique identifier of the event.
      schema:
        type: string
    LinkId:
      name: link_id
      in: path
      required: true
      description: The unique identifier of the scheduling link.
      schema:
        type: string
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: 'Personal access tokens (prefixed with `pt_secret_`) or OAuth 2.0 access tokens. Include in the Authorization header as: `Authorization: Bearer <token>`

        '