basePath: /
definitions:
  action_item.ActionItemResponse:
    properties:
      agenda_item_id:
        example: 019abc12-def3-7000-8000-000000000003
        type: string
      assigned_to_user_id:
        example: 019abc12-def3-7000-8000-000000000004
        type: string
      completed_at:
        example: "2026-01-15T10:00:00Z"
        type: string
      created_at:
        example: "2026-01-01T00:00:00Z"
        type: string
      description:
        example: Send proposal by Friday
        type: string
      due_date:
        example: "2026-01-15"
        type: string
      id:
        example: 019abc12-def3-7000-8000-000000000001
        type: string
      is_completed:
        example: false
        type: boolean
      meeting_id:
        example: 019abc12-def3-7000-8000-000000000002
        type: string
      status:
        example: accepted
        type: string
      title:
        example: Follow up with client
        type: string
      updated_at:
        example: "2026-01-01T00:00:00Z"
        type: string
    type: object
  action_item.CreateActionItemRequest:
    properties:
      description:
        example: Send proposal by Friday
        maxLength: 1000
        minLength: 1
        type: string
      due_date:
        example: "2026-01-15"
        type: string
      meeting_id:
        example: 019abc12-def3-7000-8000-000000000002
        type: string
      status:
        enum:
        - needs_review
        - accepted
        - in_progress
        - blocked
        - completed
        - cancelled
        example: needs_review
        type: string
      title:
        example: Follow up with client
        maxLength: 1000
        minLength: 1
        type: string
    required:
    - meeting_id
    - title
    type: object
  action_item.UpdateActionItemRequest:
    properties:
      description:
        example: Updated description
        maxLength: 1000
        minLength: 1
        type: string
      due_date:
        example: "2026-01-15"
        type: string
      is_completed:
        example: true
        type: boolean
      status:
        enum:
        - needs_review
        - accepted
        - in_progress
        - blocked
        - completed
        - cancelled
        example: accepted
        type: string
      title:
        example: Follow up with client
        maxLength: 1000
        minLength: 1
        type: string
    type: object
  agenda_item.AgendaItemResponse:
    properties:
      created_at:
        example: "2026-01-01T00:00:00Z"
        type: string
      deferred:
        example: false
        type: boolean
      id:
        example: 019abc12-def3-7000-8000-000000000001
        type: string
      item_type:
        example: DISCUSSION
        type: string
      meeting_id:
        example: 019abc12-def3-7000-8000-000000000002
        type: string
      status:
        example: PENDING
        type: string
      time_allocation_minutes:
        example: 15
        type: number
      title:
        example: Q3 roadmap review
        type: string
      updated_at:
        example: "2026-01-01T00:00:00Z"
        type: string
    type: object
  agenda_item.CreateAgendaItemRequest:
    properties:
      description:
        example: Review the Q3 roadmap
        type: string
      item_type:
        example: DISCUSSION
        type: string
      meeting_id:
        example: 019abc12-def3-7000-8000-000000000002
        type: string
      presenters:
        items:
          type: string
        type: array
      restricted_to_leads:
        example: false
        type: boolean
      sequence:
        example: a0
        type: string
      time_allocation_minutes:
        example: 15
        type: number
      title:
        example: Q3 roadmap review
        type: string
    required:
    - item_type
    - meeting_id
    - title
    type: object
  agenda_item.UpdateAgendaItemRequest:
    properties:
      description:
        example: Review the roadmap
        type: string
      item_type:
        example: DISCUSSION
        type: string
      presenters:
        items:
          type: string
        type: array
      restricted_to_leads:
        example: false
        type: boolean
      sequence:
        example: a0
        type: string
      status:
        example: ACTIVE
        type: string
      time_allocation_minutes:
        example: 15
        type: number
      title:
        example: Q3 roadmap review
        type: string
    type: object
  api_key.APIKeyResponse:
    properties:
      created_at:
        type: string
      expires_at:
        type: string
      id:
        type: string
      last_used_at:
        type: string
      name:
        type: string
      prefix:
        type: string
      scopes:
        items:
          type: string
        type: array
    type: object
  api_key.ListAPIKeysResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/api_key.APIKeyResponse'
        type: array
      limit:
        type: integer
      offset:
        type: integer
      total:
        type: integer
    type: object
  calendar.CalendarEventAttendeeResponse:
    properties:
      email:
        description: Email address of the attendee
        example: john.doe@example.com
        type: string
      name:
        description: Display name of the attendee
        example: John Doe
        type: string
      status:
        description: RSVP status (accepted, declined, tentative, needs_action)
        example: accepted
        type: string
      type:
        description: Attendee type (required, optional, resource)
        example: required
        type: string
    type: object
  calendar.CalendarEventResponse:
    properties:
      attendees:
        description: List of attendees for the calendar event
        items:
          $ref: '#/definitions/calendar.CalendarEventAttendeeResponse'
        type: array
      description:
        description: Description or body of the calendar event
        example: Discuss project updates
        type: string
      end_time:
        description: End time of the event in RFC3339 format
        example: "2023-01-01T11:00:00Z"
        type: string
      id:
        description: Unique identifier for the calendar event
        example: 123e4567-e89b-12d3-a456-426614174006
        type: string
      linked_meetings:
        description: IDs of all linked Contio meetings, sorted by creation date (oldest
          first)
        example:
        - '["123e4567-e89b-12d3-a456-426614174000"]'
        items:
          type: string
        type: array
      location:
        description: Location of the event (physical or virtual)
        example: Conference Room A
        type: string
      organizer:
        allOf:
        - $ref: '#/definitions/calendar.CalendarEventAttendeeResponse'
        description: Organizer of the calendar event
      start_time:
        description: Start time of the event in RFC3339 format
        example: "2023-01-01T10:00:00Z"
        type: string
      title:
        description: Title of the calendar event
        example: Weekly Team Sync
        type: string
    type: object
  calendar.ListCalendarEventsResponse:
    properties:
      items:
        description: Array of calendar events for the current page
        items:
          $ref: '#/definitions/calendar.CalendarEventResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 25
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  context.MeetingContextListResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/context.MeetingContextResponse'
        type: array
      limit:
        type: integer
      offset:
        type: integer
      total:
        type: integer
    type: object
  context.MeetingContextResponse:
    properties:
      context_type:
        type: string
      created_at:
        type: string
      created_by_user_id:
        type: string
      file_status:
        type: string
      id:
        type: string
      meeting_id:
        type: string
      model_id:
        type: string
      platform_name:
        type: string
      source_format:
        type: string
      title:
        type: string
      updated_at:
        type: string
      workspace_id:
        type: string
    type: object
  errors.PartnerErrorResponse:
    description: 'Standard error response format used across Contio''s versioned public
      API endpoints. This shape is shared by the Partner API and the first-party /v1
      User/Workspace API for consistency. DEPRECATION NOTICE (v2.0): The ''message''
      field will be removed in the next major release. Clients should migrate to using
      the ''error'' field instead.'
    properties:
      code:
        description: Unique identifier for the error type, useful for programmatic
          error handling
        example: invalid_request
        type: string
      error:
        description: User-friendly description of what went wrong
        example: Invalid request
        type: string
      message:
        description: 'Deprecated: Use ''error'' field instead. Will be removed in
          v2.0'
        example: Invalid request
        type: string
      request_id:
        description: Request identifier to correlate errors with logs
        example: abc123xyz
        type: string
    type: object
  meeting.CreateMeetingRequestV1:
    properties:
      detail_level:
        enum:
        - BULLET_POINTS
        - STANDARD
        - VERBATIM
        example: STANDARD
        type: string
      end_time:
        example: "2023-01-01T11:00:00Z"
        type: string
      is_instant:
        example: false
        type: boolean
      start_time:
        example: "2023-01-01T10:00:00Z"
        type: string
      template_id:
        example: 123e4567-e89b-12d3-a456-426614174004
        type: string
      title:
        example: Weekly Team Sync
        maxLength: 255
        minLength: 1
        type: string
    required:
    - title
    type: object
  meeting.UpdateMeetingRequestV1:
    properties:
      detail_level:
        enum:
        - BULLET_POINTS
        - STANDARD
        - VERBATIM
        example: STANDARD
        type: string
      end_time:
        example: "2023-01-01T11:00:00Z"
        type: string
        x-nullable: true
      start_time:
        example: "2023-01-01T10:00:00Z"
        type: string
        x-nullable: true
      template_id:
        example: 123e4567-e89b-12d3-a456-426614174004
        type: string
      title:
        example: Renamed Team Sync
        maxLength: 255
        type: string
    type: object
  meeting_template.MeetingTemplateResponse:
    properties:
      created_at:
        example: "2026-01-01T00:00:00Z"
        type: string
      description:
        example: Standard agenda for weekly team syncs
        type: string
      id:
        example: 019abc12-def3-7000-8000-000000000001
        type: string
      is_active:
        example: true
        type: boolean
      name:
        example: Weekly Team Sync
        type: string
      ownership_type:
        enum:
        - SYSTEM
        - VERTICAL
        - WORKSPACE
        - USER
        - PARTNER
        example: WORKSPACE
        type: string
      updated_at:
        example: "2026-01-01T00:00:00Z"
        type: string
    type: object
  middleware.FeatureNotAvailableResponse:
    properties:
      code:
        type: string
      current_plan:
        type: string
      feature:
        type: string
      message:
        type: string
      required_plan:
        type: string
    type: object
  oauth.OAuthErrorResponse:
    properties:
      error:
        type: string
      error_description:
        type: string
    type: object
  participant.V1AddParticipantsRequest:
    properties:
      participants:
        items:
          $ref: '#/definitions/participant.V1ParticipantAdd'
        minItems: 1
        type: array
    required:
    - participants
    type: object
  participant.V1AddParticipantsResponse:
    properties:
      participants:
        items:
          $ref: '#/definitions/participant.V1ParticipantResponse'
        type: array
    type: object
  participant.V1ContactResponse:
    properties:
      email:
        example: jane@acme.com
        type: string
      name:
        example: Jane Doe
        type: string
    type: object
  participant.V1ParticipantAdd:
    properties:
      guest_email:
        example: guest@example.com
        format: email
        maxLength: 255
        type: string
      role:
        enum:
        - EDITOR
        - VIEWER
        example: VIEWER
        type: string
      user_id:
        example: 123e4567-e89b-12d3-a456-426614174003
        format: uuid
        type: string
    required:
    - role
    type: object
  participant.V1ParticipantResponse:
    properties:
      created_at:
        example: "2023-01-01T00:00:00Z"
        type: string
      email:
        example: john.doe@example.com
        type: string
      id:
        example: 123e4567-e89b-12d3-a456-426614174004
        type: string
      is_attended:
        example: true
        type: boolean
      meeting_id:
        example: 123e4567-e89b-12d3-a456-426614174000
        type: string
      name:
        example: John Doe
        type: string
      role:
        example: EDITOR
        type: string
      updated_at:
        example: "2023-01-01T00:00:00Z"
        type: string
      user_id:
        example: 123e4567-e89b-12d3-a456-426614174003
        type: string
    type: object
  participant.V1UpdateParticipantRoleRequest:
    properties:
      role:
        enum:
        - EDITOR
        - VIEWER
        example: EDITOR
        type: string
    required:
    - role
    type: object
  profile.MeResponse:
    properties:
      created_at:
        example: "2023-01-01T00:00:00Z"
        type: string
      display_name:
        example: John Doe
        type: string
      email:
        example: john.doe@example.com
        type: string
      id:
        example: 123e4567-e89b-12d3-a456-426614174003
        type: string
      plan_type:
        example: FREE
        type: string
      workspace_id:
        example: 123e4567-e89b-12d3-a456-426614174002
        type: string
      workspace_name:
        example: Acme Corp
        type: string
      workspace_role:
        example: WORKSPACE_MEMBER
        type: string
    type: object
  rome_api_controllers_external_partner_user_shared.ListResponse-action_item_ActionItemResponse:
    properties:
      items:
        description: Array of items for the current page
        items:
          $ref: '#/definitions/action_item.ActionItemResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 50
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  rome_api_controllers_external_partner_user_shared.ListResponse-agenda_item_AgendaItemResponse:
    properties:
      items:
        description: Array of items for the current page
        items:
          $ref: '#/definitions/agenda_item.AgendaItemResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 50
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  rome_api_controllers_external_partner_user_shared.ListResponse-participant_V1ContactResponse:
    properties:
      items:
        description: Array of items for the current page
        items:
          $ref: '#/definitions/participant.V1ContactResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 50
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  rome_api_controllers_external_partner_user_shared.ListResponse-participant_V1ParticipantResponse:
    properties:
      items:
        description: Array of items for the current page
        items:
          $ref: '#/definitions/participant.V1ParticipantResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 50
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  rome_api_controllers_external_v1_oauth.DiscoveryDocument:
    properties:
      authorization_endpoint:
        type: string
      code_challenge_methods_supported:
        items:
          type: string
        type: array
      grant_types_supported:
        items:
          type: string
        type: array
      id_token_signing_alg_values_supported:
        items:
          type: string
        type: array
      issuer:
        type: string
      jwks_uri:
        type: string
      response_types_supported:
        items:
          type: string
        type: array
      revocation_endpoint:
        type: string
      scopes_supported:
        items:
          type: string
        type: array
      subject_types_supported:
        items:
          type: string
        type: array
      token_endpoint:
        type: string
      token_endpoint_auth_methods_supported:
        items:
          type: string
        type: array
    type: object
  rome_api_controllers_external_v1_oauth.JWK:
    properties:
      alg:
        type: string
      crv:
        type: string
      e:
        type: string
      kid:
        type: string
      kty:
        type: string
      "n":
        type: string
      use:
        type: string
      x:
        type: string
      "y":
        type: string
    type: object
  rome_api_controllers_external_v1_oauth.JWKSResponse:
    properties:
      keys:
        items:
          $ref: '#/definitions/rome_api_controllers_external_v1_oauth.JWK'
        type: array
    type: object
  rome_api_controllers_external_v1_oauth.TokenResponse:
    properties:
      access_token:
        example: cto_at_v1_...
        type: string
      expires_in:
        example: 3600
        type: integer
      refresh_token:
        example: cto_rt_v1_...
        type: string
      scope:
        example: meetings:read meetings:write action-items:read action-items:write
          calendar:read workspace:read workspace:write
        type: string
      token_type:
        example: Bearer
        type: string
    type: object
  rome_api_controllers_external_v1_shared.ListResponse-meeting_template_MeetingTemplateResponse:
    properties:
      items:
        description: Array of items for the current page
        items:
          $ref: '#/definitions/meeting_template.MeetingTemplateResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 20
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  rome_api_controllers_external_v1_shared.ListResponse-shared_MeetingResponse:
    properties:
      items:
        description: Array of items for the current page
        items:
          $ref: '#/definitions/shared.MeetingResponse'
        type: array
      limit:
        description: Maximum number of items per page
        example: 20
        type: integer
      offset:
        description: Number of items skipped from the beginning
        example: 0
        type: integer
      total:
        description: Total number of items across all pages
        example: 100
        type: integer
    type: object
  shared.MeetingResponse:
    properties:
      calendar_event_id:
        description: ID of the linked calendar event, if any
        example: 123e4567-e89b-12d3-a456-426614174006
        type: string
      created_at:
        description: Timestamp when the meeting was created
        example: "2023-01-01T00:00:00Z"
        type: string
      created_by_user_id:
        description: ID of the user who created the meeting
        example: 123e4567-e89b-12d3-a456-426614174003
        type: string
      end_time:
        description: Scheduled end time in RFC3339 format
        example: "2023-01-01T11:00:00-07:00"
        type: string
      id:
        description: Unique identifier for the meeting
        example: 123e4567-e89b-12d3-a456-426614174000
        type: string
      owned_by_user_id:
        description: ID of the user who owns the meeting
        example: 123e4567-e89b-12d3-a456-426614174003
        type: string
      redirect_to_meeting_id:
        description: ID of the meeting to redirect to if this meeting was merged
        example: 123e4567-e89b-12d3-a456-426614174007
        type: string
      start_time:
        description: Scheduled start time in RFC3339 format
        example: "2023-01-01T10:00:00-07:00"
        type: string
      status:
        description: Current status of the meeting
        enum:
        - draft
        - scheduled
        - in_progress
        - ended
        - completed
        example: completed
        type: string
      summary_notes:
        description: AI-generated summary notes from the meeting. Only populated on
          the single-meeting GET; PRO+ callers receive the full summary while FREE-tier
          callers receive a truncated preview (first 200 characters) followed by an
          upgrade note. Omitted in list/search/upcoming views.
        example: Post-Meeting Summarization ...
        type: string
      title:
        description: Title of the meeting
        example: Weekly Team Sync
        type: string
      updated_at:
        description: Timestamp when the meeting was last updated
        example: "2023-01-01T00:00:00Z"
        type: string
      workspace_id:
        description: ID of the workspace this meeting belongs to
        example: 123e4567-e89b-12d3-a456-426614174002
        type: string
    type: object
  token.IntrospectResponse:
    properties:
      active:
        type: boolean
      auth_surface:
        type: string
      plan_type:
        type: string
      scopes:
        items:
          type: string
        type: array
      token_type:
        type: string
      user_id:
        type: string
      workspace_id:
        type: string
      workspace_role:
        type: string
    type: object
  token.ListTokensResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/token.TokenResponse'
        type: array
      limit:
        type: integer
      offset:
        type: integer
      total:
        type: integer
    type: object
  token.TokenResponse:
    properties:
      created_at:
        type: string
      expires_at:
        type: string
      id:
        type: string
      last_used_at:
        type: string
      name:
        type: string
      prefix:
        type: string
      scopes:
        items:
          type: string
        type: array
    type: object
  webhook.CreateWebhookRequest:
    properties:
      subscribed_events:
        items:
          type: string
        minItems: 1
        type: array
      url:
        type: string
    required:
    - subscribed_events
    - url
    type: object
  webhook.CreateWebhookResponse:
    properties:
      signing_secret:
        type: string
      verification_token:
        type: string
      webhook:
        $ref: '#/definitions/webhook.WebhookResponse'
    type: object
  webhook.ListWebhooksResponse:
    properties:
      items:
        items:
          $ref: '#/definitions/webhook.WebhookResponse'
        type: array
      limit:
        type: integer
      offset:
        type: integer
      total:
        type: integer
    type: object
  webhook.RotateSecretResponse:
    properties:
      signing_secret:
        type: string
      webhook:
        $ref: '#/definitions/webhook.WebhookResponse'
    type: object
  webhook.WebhookResponse:
    properties:
      consecutive_failure_count:
        type: integer
      created_at:
        type: string
      id:
        type: string
      last_success_at:
        type: string
      status:
        type: string
      subscribed_events:
        items:
          type: string
        type: array
      updated_at:
        type: string
      url:
        type: string
      verified_at:
        type: string
      workspace_id:
        type: string
    type: object
  workspace.ErrorResponse:
    properties:
      code:
        type: string
      error:
        type: string
    type: object
  workspace.MemberResponse:
    description: Workspace member returned by the /v1 API
    properties:
      deactivated_at:
        type: string
      email:
        example: jane@acme.com
        type: string
      id:
        example: 123e4567-e89b-12d3-a456-426614174002
        type: string
      is_deactivated:
        example: false
        type: boolean
      is_pending:
        example: false
        type: boolean
      name:
        example: Jane Doe
        type: string
      role:
        example: WORKSPACE_ADMIN
        type: string
    type: object
  workspace.MembersListResponse:
    description: Paginated list of workspace members
    properties:
      items:
        items:
          $ref: '#/definitions/workspace.MemberResponse'
        type: array
      limit:
        example: 25
        type: integer
      offset:
        example: 0
        type: integer
      total:
        example: 42
        type: integer
    type: object
  workspace.PatchWorkspaceBody:
    properties:
      company_size:
        example: 11-50
        type: string
      name:
        example: Acme Corp
        type: string
      primary_industry_id:
        example: industry-1
        type: string
      remove_external_participants_from_meetings:
        example: true
        type: boolean
    type: object
  workspace.UpdateMemberRoleRequest:
    properties:
      role:
        example: WORKSPACE_ADMIN
        type: string
    required:
    - role
    type: object
  workspace.WorkspaceResponse:
    description: Workspace settings returned by the /v1 API
    properties:
      created_at:
        example: "2024-01-01T00:00:00Z"
        type: string
      id:
        example: 123e4567-e89b-12d3-a456-426614174000
        type: string
      name:
        example: Acme Corp
        type: string
      owner_id:
        example: 123e4567-e89b-12d3-a456-426614174001
        type: string
      plan_type:
        example: PRO
        type: string
      updated_at:
        example: "2024-06-15T12:30:00Z"
        type: string
    type: object
host: api.contio.ai
info:
  contact:
    email: support@contio.ai
    name: Contio MeetingOS Support
    url: https://contio.ai/contact
  description: First-party user/workspace API for Contio MeetingOS.
  license:
    name: MIT/Commercial
  termsOfService: https://contio.ai/tos
  title: Contio MeetingOS User API
  version: 1.1.0
paths:
  /v1/action-items:
    get:
      description: Retrieves action items assigned to the authenticated user within
        their workspace
      operationId: v1ListActionItems
      parameters:
      - default: 20
        description: Maximum items per page (1-100)
        in: query
        name: limit
        type: integer
      - default: 0
        description: Number of items to skip
        in: query
        name: offset
        type: integer
      - description: Filter by meeting ID
        format: uuid
        in: query
        name: meeting_id
        type: string
      - description: Filter by status
        enum:
        - needs_review
        - accepted
        - in_progress
        - blocked
        - completed
        - cancelled
        in: query
        name: status
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_partner_user_shared.ListResponse-action_item_ActionItemResponse'
        "400":
          description: Invalid query parameters
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - action-items:read
      summary: List action items
      tags:
      - Action Items
    post:
      consumes:
      - application/json
      description: Creates a new action item in a meeting the authenticated user can
        access
      operationId: v1CreateActionItem
      parameters:
      - description: Action item data
        in: body
        name: action_item
        required: true
        schema:
          $ref: '#/definitions/action_item.CreateActionItemRequest'
      - description: Optional client-generated idempotency key (max 255 printable
          ASCII). Repeat requests with the same key replay the original 2xx response.
        in: header
        name: Idempotency-Key
        type: string
      produces:
      - application/json
      responses:
        "201":
          description: Created
          headers:
            Idempotent-Replayed:
              description: Present only on replays; value is true
              type: string
          schema:
            $ref: '#/definitions/action_item.ActionItemResponse'
        "400":
          description: Invalid request body
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "409":
          description: An identical request is currently being processed (Idempotency-Key
            conflict)
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "422":
          description: Idempotency-Key has already been used with a different request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - action-items:write
      summary: Create action item
      tags:
      - Action Items
  /v1/action-items/{id}:
    delete:
      description: Deletes an action item the authenticated user can access
      operationId: v1DeleteActionItem
      parameters:
      - description: Action Item ID
        in: path
        name: id
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "400":
          description: Invalid action item ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Action item not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - action-items:write
      summary: Delete action item
      tags:
      - Action Items
    get:
      description: Retrieves a single action item by ID if it is accessible to the
        authenticated user
      operationId: v1GetActionItem
      parameters:
      - description: Action Item ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/action_item.ActionItemResponse'
        "400":
          description: Invalid action item ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Action item not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - action-items:read
      summary: Get action item
      tags:
      - Action Items
    patch:
      consumes:
      - application/json
      description: Partially updates an action item the authenticated user can access
      operationId: v1UpdateActionItem
      parameters:
      - description: Action Item ID
        in: path
        name: id
        required: true
        type: string
      - description: Action item update data
        in: body
        name: action_item
        required: true
        schema:
          $ref: '#/definitions/action_item.UpdateActionItemRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/action_item.ActionItemResponse'
        "400":
          description: Invalid request body
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Action item not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - action-items:write
      summary: Update action item
      tags:
      - Action Items
  /v1/agenda-items:
    get:
      description: Retrieves agenda items accessible to the authenticated user within
        their workspace
      operationId: v1ListAgendaItems
      parameters:
      - default: 20
        description: Maximum items per page (1-100)
        in: query
        name: limit
        type: integer
      - default: 0
        description: Number of items to skip
        in: query
        name: offset
        type: integer
      - description: Filter by meeting ID
        format: uuid
        in: query
        name: meeting_id
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_partner_user_shared.ListResponse-agenda_item_AgendaItemResponse'
        "400":
          description: Invalid query parameters
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: List agenda items
      tags:
      - Agenda Items
    post:
      consumes:
      - application/json
      description: Creates an agenda item attached to a meeting in the authenticated
        user's workspace.
      operationId: v1CreateAgendaItem
      parameters:
      - description: Agenda item creation parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/agenda_item.CreateAgendaItemRequest'
      - description: Optional client-generated idempotency key (max 255 printable
          ASCII). Repeat requests with the same key replay the original 2xx response.
        in: header
        name: Idempotency-Key
        type: string
      produces:
      - application/json
      responses:
        "201":
          description: Created
          headers:
            Idempotent-Replayed:
              description: Present only on replays; value is true
              type: string
          schema:
            $ref: '#/definitions/agenda_item.AgendaItemResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found or not accessible
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "409":
          description: Meeting has ended, or an identical request is currently being
            processed (Idempotency-Key conflict)
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "422":
          description: Idempotency-Key has already been used with a different request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Create an agenda item
      tags:
      - Agenda Items
  /v1/agenda-items/{id}:
    delete:
      description: Deletes an agenda item in the authenticated user's workspace.
      operationId: v1DeleteAgendaItem
      parameters:
      - description: Agenda item ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Agenda item deleted
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Agenda item not found or not accessible
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Delete an agenda item
      tags:
      - Agenda Items
    get:
      description: Retrieves a single agenda item by ID from the authenticated user's
        workspace.
      operationId: v1GetAgendaItem
      parameters:
      - description: Agenda item ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/agenda_item.AgendaItemResponse'
        "400":
          description: Invalid agenda item ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Agenda item not found or not accessible
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Get an agenda item
      tags:
      - Agenda Items
    patch:
      consumes:
      - application/json
      description: Updates fields on an agenda item in the authenticated user's workspace.
        Only provided fields are changed.
      operationId: v1UpdateAgendaItem
      parameters:
      - description: Agenda item ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Agenda item update parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/agenda_item.UpdateAgendaItemRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/agenda_item.AgendaItemResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Agenda item not found or not accessible
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Update an agenda item
      tags:
      - Agenda Items
  /v1/auth/introspect:
    get:
      description: Returns the authenticated Principal's metadata for the bearer token
        in the Authorization header. This is intended for first-party clients such
        as the MCP gateway.
      operationId: v1GetAuthIntrospect
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/token.IntrospectResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application: []
      summary: Introspect first-party token
      tags:
      - User Tokens
  /v1/calendar/events:
    get:
      consumes:
      - application/json
      description: Retrieve a paginated list of calendar events for the authenticated
        user within a specified time range
      operationId: v1ListCalendarEvents
      parameters:
      - description: Start time in RFC3339 format
        example: '"2023-01-01T00:00:00Z"'
        in: query
        name: start_date
        required: true
        type: string
      - description: End time in RFC3339 format
        example: '"2023-01-31T23:59:59Z"'
        in: query
        name: end_date
        required: true
        type: string
      - description: Number of results per page (default 25, max 100)
        in: query
        name: limit
        type: integer
      - description: Pagination offset (default 0)
        in: query
        name: offset
        type: integer
      - description: 'Sort direction: asc or desc (default: asc)'
        in: query
        name: direction
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/calendar.ListCalendarEventsResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - calendar:read
      summary: List calendar events
      tags:
      - Calendar
  /v1/calendar/events/{id}:
    get:
      consumes:
      - application/json
      description: Retrieve details of a specific calendar event for the authenticated
        user
      operationId: v1GetCalendarEvent
      parameters:
      - description: Calendar Event ID
        example: '"123e4567-e89b-12d3-a456-426614174006"'
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/calendar.CalendarEventResponse'
        "400":
          description: Invalid calendar event ID format
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Calendar event not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - calendar:read
      summary: Get calendar event by ID
      tags:
      - Calendar
  /v1/me:
    get:
      description: Returns the authenticated user's identity and workspace context.
      operationId: v1GetMe
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/profile.MeResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application: []
      summary: Get current user identity
      tags:
      - User Profile
  /v1/meeting-templates:
    get:
      description: Retrieves meeting templates accessible to the authenticated user
        (system, vertical, workspace, and user-owned templates). Returns paginated
        results. Use the returned id as the template_id when creating a meeting.
      operationId: v1ListMeetingTemplates
      parameters:
      - default: 20
        description: Maximum items per page (1-100)
        in: query
        name: limit
        type: integer
      - default: 0
        description: Number of items to skip
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_shared.ListResponse-meeting_template_MeetingTemplateResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: List meeting templates
      tags:
      - Meeting Templates
  /v1/meetings:
    get:
      description: Retrieves meetings accessible to the authenticated user within
        their workspace. Returns paginated results.
      operationId: v1ListMeetings
      parameters:
      - description: Maximum items per page (1-100, default 20)
        in: query
        name: limit
        type: integer
      - description: Number of items to skip (default 0)
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_shared.ListResponse-shared_MeetingResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: List meetings
      tags:
      - Meetings
    post:
      consumes:
      - application/json
      description: Creates a meeting owned by the authenticated user within their
        workspace. The creator is added as the owner participant.
      operationId: v1CreateMeeting
      parameters:
      - description: Meeting creation parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/meeting.CreateMeetingRequestV1'
      - description: Optional client-generated idempotency key (max 255 printable
          ASCII). Repeat requests with the same key replay the original 2xx response.
        in: header
        name: Idempotency-Key
        type: string
      produces:
      - application/json
      responses:
        "201":
          description: Created
          headers:
            Idempotent-Replayed:
              description: Present only on replays; value is true
              type: string
          schema:
            $ref: '#/definitions/shared.MeetingResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting template not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "409":
          description: An identical request is currently being processed (Idempotency-Key
            conflict)
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "422":
          description: Idempotency-Key has already been used with a different request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Create a meeting
      tags:
      - Meetings
  /v1/meetings/{id}:
    delete:
      description: Soft-deletes a meeting owned by the authenticated user (owner-scoped).
      operationId: v1DeleteMeeting
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Meeting deleted
        "400":
          description: Invalid meeting ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Not the meeting owner
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Delete a meeting
      tags:
      - Meetings
    get:
      description: Retrieves a specific meeting by ID. PRO+ plans receive the full
        summary_notes; FREE-tier callers receive a truncated preview (first 200 characters)
        followed by an upgrade note.
      operationId: v1GetMeeting
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/shared.MeetingResponse'
        "400":
          description: Invalid meeting ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Get meeting by ID
      tags:
      - Meetings
    patch:
      consumes:
      - application/json
      description: Partially updates a meeting within the authenticated user's workspace.
        Only the fields present in the request body are modified; sending start_time
        or end_time as null clears them (untimed / open-ended).
      operationId: v1UpdateMeeting
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Meeting update parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/meeting.UpdateMeetingRequestV1'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/shared.MeetingResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting or template not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Update a meeting
      tags:
      - Meetings
  /v1/meetings/{id}/contacts:
    get:
      description: Returns workspace contacts (active members and prior guest participants)
        matching the supplied query. Contacts are scoped to the meeting's workspace
        and are intended for use when inviting participants.
      operationId: v1ListMeetingContacts
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Search query matched against name or email
        in: query
        name: q
        type: string
      - description: Maximum number of items per page (1-100, default 20)
        in: query
        name: limit
        type: integer
      - description: Number of items to skip (default 0)
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_partner_user_shared.ListResponse-participant_V1ContactResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: List meeting contacts
      tags:
      - Participants
  /v1/meetings/{id}/context:
    get:
      consumes:
      - application/json
      description: Lists meeting contexts for a meeting with pagination. Returns all
        context documents regardless of source (partner or user-uploaded).
      operationId: v1ListMeetingContext
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - default: 25
        description: Maximum number of items to return (1-100)
        in: query
        name: limit
        type: integer
      - default: 0
        description: Offset for pagination
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/context.MeetingContextListResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: List meeting contexts
      tags:
      - Meeting Context
    post:
      consumes:
      - multipart/form-data
      description: Uploads a new meeting context document to a meeting. Accepts multipart
        form data with a file and metadata fields. Body size capped at 4.5MB; returns
        413 if exceeded.
      operationId: v1UploadMeetingContext
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Context document file
        in: formData
        name: file
        required: true
        type: file
      - description: Document title
        in: formData
        name: title
        type: string
      - description: MIME type of the document
        in: formData
        name: context_type
        type: string
      - description: Source format (json, csv, tsv, xml, html, yaml, markdown, plain_text)
        in: formData
        name: source_format
        required: true
        type: string
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/context.MeetingContextResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "413":
          description: Request entity too large
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Upload meeting context
      tags:
      - Meeting Context
  /v1/meetings/{id}/context/{context_id}:
    delete:
      description: Soft-deletes a specific meeting context document.
      operationId: v1DeleteMeetingContext
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Context ID
        format: uuid
        in: path
        name: context_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Context deleted
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Context not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Delete meeting context
      tags:
      - Meeting Context
    get:
      consumes:
      - application/json
      description: Retrieves metadata for a specific meeting context document.
      operationId: v1GetMeetingContext
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Context ID
        format: uuid
        in: path
        name: context_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/context.MeetingContextResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Context not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Get meeting context
      tags:
      - Meeting Context
  /v1/meetings/{id}/context/{context_id}/content:
    get:
      description: Streams the file content for a specific meeting context document
        from S3.
      operationId: v1DownloadMeetingContextContent
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Context ID
        format: uuid
        in: path
        name: context_id
        required: true
        type: string
      produces:
      - application/octet-stream
      responses:
        "200":
          description: Context file stream; Content-Disposition includes filename
          schema:
            type: file
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Context not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Download meeting context content
      tags:
      - Meeting Context
  /v1/meetings/{id}/participants:
    get:
      description: Retrieves participants for a specific meeting accessible to the
        authenticated user. Returns paginated results.
      operationId: v1ListMeetingParticipants
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Maximum number of items per page (1-100, default 20)
        in: query
        name: limit
        type: integer
      - description: Number of items to skip (default 0)
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_partner_user_shared.ListResponse-participant_V1ParticipantResponse'
        "400":
          description: Invalid request parameters
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: List meeting participants
      tags:
      - Participants
    post:
      consumes:
      - application/json
      description: Adds one or more participants to a meeting owned by the authenticated
        user's workspace.
      operationId: v1AddMeetingParticipants
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Participants to add
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/participant.V1AddParticipantsRequest'
      - description: Optional client-generated idempotency key (max 255 printable
          ASCII). Repeat requests with the same key replay the original 2xx response.
        in: header
        name: Idempotency-Key
        type: string
      produces:
      - application/json
      responses:
        "201":
          description: Created
          headers:
            Idempotent-Replayed:
              description: Present only on replays; value is true
              type: string
          schema:
            $ref: '#/definitions/participant.V1AddParticipantsResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope or permissions
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "409":
          description: An identical request is currently being processed (Idempotency-Key
            conflict)
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "422":
          description: Idempotency-Key has already been used with a different request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Add meeting participants
      tags:
      - Participants
  /v1/meetings/{id}/participants/{userId}:
    delete:
      description: Removes the participant identified by user ID from a meeting owned
        by the authenticated user's workspace.
      operationId: v1RemoveMeetingParticipant
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: User ID
        format: uuid
        in: path
        name: userId
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Participant removed
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope or permissions
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting or participant not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Remove meeting participant by user ID
      tags:
      - Participants
  /v1/meetings/{id}/participants/{userId}/role:
    patch:
      consumes:
      - application/json
      description: Updates the role (EDITOR or VIEWER) of the participant identified
        by user ID in a meeting owned by the authenticated user's workspace.
      operationId: v1UpdateMeetingParticipantRole
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: User ID
        format: uuid
        in: path
        name: userId
        required: true
        type: string
      - description: Role update
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/participant.V1UpdateParticipantRoleRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/participant.V1ParticipantResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope or permissions
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Meeting or participant not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:write
      summary: Update meeting participant role by user ID
      tags:
      - Participants
  /v1/meetings/{id}/transcript/export:
    get:
      description: Downloads the meeting transcript as an SRT file. Requires the Elite
        plan.
      operationId: v1ExportTranscript
      parameters:
      - description: Meeting ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: 'Output format (default: srt)'
        enum:
        - srt
        in: query
        name: format
        type: string
      produces:
      - application/x-subrip
      responses:
        "200":
          description: SRT file content
          schema:
            type: string
        "400":
          description: Invalid meeting ID or unsupported format
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required (Elite)
          schema:
            $ref: '#/definitions/middleware.FeatureNotAvailableResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Transcript not found, empty, or inaccessible
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Export meeting transcript
      tags:
      - Meetings
  /v1/meetings/search:
    get:
      description: 'Searches meetings the authenticated caller participates in using
        a curated set of filters. Results are scoped to the caller''s workspace and
        de-duplicated: meetings sharing the same calendar_event_id and start time
        are collapsed into one row, preferring the meeting owned by the caller, then
        created by the caller, then the most recently updated, and finally the meeting
        ID as a deterministic tie-breaker. Returns paginated results.'
      operationId: v1SearchMeetings
      parameters:
      - description: Free-text query matched (case-insensitive substring) against
          the meeting title and email alias
        in: query
        maxLength: 255
        name: q
        type: string
      - description: Inclusive lower bound on start time (ISO 8601 with timezone)
        format: date-time
        in: query
        name: start_time_from
        type: string
      - description: Inclusive upper bound on start time (ISO 8601 with timezone)
        format: date-time
        in: query
        name: start_time_to
        type: string
      - description: Filter by meeting status
        enum:
        - scheduled
        - completed
        in: query
        name: status
        type: string
      - description: Case-insensitive substring match against the meeting title
        in: query
        maxLength: 255
        name: title_contains
        type: string
      - description: Comma-separated participant email addresses to filter by
        in: query
        maxLength: 500
        name: participant_emails
        type: string
      - description: Restrict to meetings that do (true) or do not (false) have action
          items
        in: query
        name: has_action_items
        type: boolean
      - description: Maximum items per page (1-100, default 20)
        in: query
        name: limit
        type: integer
      - description: Number of items to skip (default 0)
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_shared.ListResponse-shared_MeetingResponse'
        "400":
          description: Invalid search parameters
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Search meetings
      tags:
      - Meetings
  /v1/meetings/upcoming:
    get:
      description: Retrieves the authenticated caller's upcoming meetings, soonest
        first. Returns paginated results.
      operationId: v1ListUpcomingMeetings
      parameters:
      - description: Maximum items per page (1-100, default 20)
        in: query
        name: limit
        type: integer
      - description: Number of items to skip (default 0)
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_shared.ListResponse-shared_MeetingResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: List upcoming meetings
      tags:
      - Meetings
  /v1/oauth/.well-known/jwks.json:
    get:
      description: Returns the JSON Web Key Set for first-party token verification.
      operationId: v1GetOAuthJwks
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_oauth.JWKSResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
      summary: First-Party JWKS
      tags:
      - First-Party OAuth
  /v1/oauth/.well-known/openid-configuration:
    get:
      description: Returns the first-party OpenID Connect discovery document (RFC
        8414, hyphenated spelling).
      operationId: v1GetOAuthOpenidConfiguration
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_oauth.DiscoveryDocument'
      summary: First-Party OIDC Discovery
      tags:
      - First-Party OAuth
  /v1/oauth/authorize:
    get:
      description: Initiates the first-party OAuth 2.1 authorization code flow with
        PKCE. Redirects to the loopback with an authorization code.
      operationId: v1AuthorizeOAuth
      parameters:
      - description: First-party client ID
        in: query
        name: client_id
        required: true
        type: string
      - description: Loopback redirect URI (http://127.0.0.1:PORT or http://localhost:PORT)
        in: query
        name: redirect_uri
        required: true
        type: string
      - description: Must be 'code'
        in: query
        name: response_type
        required: true
        type: string
      - description: Space-delimited scopes
        in: query
        name: scope
        required: true
        type: string
      - description: Opaque state value
        in: query
        name: state
        type: string
      - description: PKCE S256 code challenge
        in: query
        name: code_challenge
        required: true
        type: string
      - description: Must be 'S256'
        in: query
        name: code_challenge_method
        required: true
        type: string
      produces:
      - application/json
      responses:
        "302":
          description: Redirect to redirect_uri with code and state
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
      security:
      - ContioAuth: []
      summary: First-Party OAuth Authorization
      tags:
      - First-Party OAuth
  /v1/oauth/revoke:
    post:
      consumes:
      - application/x-www-form-urlencoded
      description: Revokes a first-party access or refresh token (and its chain).
        Follows RFC 7009.
      operationId: v1RevokeOAuthToken
      parameters:
      - description: Token to revoke
        in: formData
        name: token
        required: true
        type: string
      - description: access_token or refresh_token
        in: formData
        name: token_type_hint
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: Token revoked (always 200 per RFC 7009)
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
      security:
      - ContioAuth: []
      summary: First-Party OAuth Token Revocation
      tags:
      - First-Party OAuth
  /v1/oauth/token:
    post:
      consumes:
      - application/x-www-form-urlencoded
      description: Exchanges an authorization code + PKCE verifier for tokens, or
        refreshes an existing token.
      operationId: v1ExchangeOAuthToken
      parameters:
      - description: authorization_code or refresh_token
        in: formData
        name: grant_type
        required: true
        type: string
      - description: Authorization code (for authorization_code grant)
        in: formData
        name: code
        type: string
      - description: PKCE code verifier (for authorization_code grant)
        in: formData
        name: code_verifier
        type: string
      - description: First-party client ID (for authorization_code grant)
        in: formData
        name: client_id
        type: string
      - description: Must match authorize redirect_uri (for authorization_code grant)
        in: formData
        name: redirect_uri
        type: string
      - description: Refresh token (for refresh_token grant)
        in: formData
        name: refresh_token
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/rome_api_controllers_external_v1_oauth.TokenResponse'
        "400":
          description: Bad Request
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
        "500":
          description: Internal Server Error
          schema:
            $ref: '#/definitions/oauth.OAuthErrorResponse'
      summary: First-Party OAuth Token Exchange
      tags:
      - First-Party OAuth
  /v1/user/events:
    get:
      description: |-
        Opens a Server-Sent Events stream of the caller's workspace events
        (meetings, participants, action items, agenda items, meeting context,
        calendar events). Supply the Last-Event-ID header to resume a dropped
        connection without gaps. The stream may be opened with any of the
        following read scopes: meetings:read, action-items:read, calendar:read,
        or workspace:read. The @Security annotation lists one valid scope;
        the runtime middleware enforces the any-of requirement.
      operationId: v1StreamUserEvents
      parameters:
      - description: Stream ID of the last event the client received; replays events
          after it
        in: header
        name: Last-Event-ID
        type: string
      produces:
      - text/event-stream
      responses:
        "200":
          description: SSE stream of workspace events
          schema:
            type: string
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "429":
          description: Connection cap exceeded
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - meetings:read
      summary: Stream workspace events (SSE)
      tags:
      - User Events
  /v1/user/tokens:
    get:
      consumes:
      - application/json
      description: Returns a paginated list of the caller's non-revoked PATs (masked
        prefix, scopes, timestamps).
      operationId: v1ListUserTokens
      parameters:
      - default: 20
        description: Limit
        in: query
        name: limit
        type: integer
      - default: 0
        description: Offset
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/token.ListTokensResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application: []
      summary: List user access tokens
      tags:
      - User Tokens
  /v1/user/tokens/{id}:
    delete:
      consumes:
      - application/json
      description: Soft-deletes a PAT by ID. Only the token owner can delete.
      operationId: v1DeleteUserToken
      parameters:
      - description: Token ID
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Token deleted
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Forbidden — not the token owner
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Token not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application: []
      summary: Delete a user access token
      tags:
      - User Tokens
  /v1/workspace:
    get:
      consumes:
      - application/json
      description: Returns the workspace record (name, plan, owner, timestamps) for
        the Principal's workspace.
      operationId: v1GetWorkspace
      produces:
      - application/json
      responses:
        "200":
          description: Workspace settings
          schema:
            $ref: '#/definitions/workspace.WorkspaceResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "404":
          description: Workspace not found
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
      security:
      - OAuth2Application:
        - workspace:read
      summary: Get workspace settings
      tags:
      - Workspace
    patch:
      consumes:
      - application/json
      description: Updates workspace settings (name, company size, primary industry,
        external participant removal). Only provided fields are changed.
      operationId: v1UpdateWorkspace
      parameters:
      - description: Workspace update parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/workspace.PatchWorkspaceBody'
      produces:
      - application/json
      responses:
        "200":
          description: Updated workspace settings
          schema:
            $ref: '#/definitions/workspace.WorkspaceResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "404":
          description: Workspace not found
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Update workspace settings
      tags:
      - Workspace
  /v1/workspace/api-keys:
    get:
      consumes:
      - application/json
      description: Returns a paginated list of the workspace's non-revoked API keys
        (masked prefix, scopes, timestamps).
      operationId: v1ListWorkspaceApiKeys
      parameters:
      - default: 20
        description: Limit
        in: query
        name: limit
        type: integer
      - default: 0
        description: Offset
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/api_key.ListAPIKeysResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: List workspace API keys
      tags:
      - Workspace API Keys
  /v1/workspace/api-keys/{id}:
    delete:
      consumes:
      - application/json
      description: 'Soft-deletes a workspace API key by ID. IDOR protection: workspace-ownership
        verified before revocation; returns 404 on mismatch (section 3.4 cloaking).'
      operationId: v1DeleteWorkspaceApiKey
      parameters:
      - description: API Key ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Key deleted
        "400":
          description: Invalid API key ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Key not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Delete a workspace API key
      tags:
      - Workspace API Keys
  /v1/workspace/members:
    get:
      consumes:
      - application/json
      description: Returns a paginated list of members (active users and pending invitations)
        for the Principal's workspace.
      operationId: v1ListWorkspaceMembers
      parameters:
      - description: Items per page (default 25, clamped [1,100])
        in: query
        name: limit
        type: integer
      - description: Pagination offset (default 0)
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: Paginated member list
          schema:
            $ref: '#/definitions/workspace.MembersListResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
      security:
      - OAuth2Application:
        - workspace:read
      summary: List workspace members
      tags:
      - Workspace
  /v1/workspace/members/{userID}:
    delete:
      description: Soft-deletes a member from the workspace. Cannot remove the workspace
        owner or yourself.
      operationId: v1RemoveWorkspaceMember
      parameters:
      - description: User ID of the member to remove
        format: uuid
        in: path
        name: userID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Member removed
        "400":
          description: Invalid request (e.g. cannot remove self)
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "403":
          description: Forbidden (cannot remove workspace owner)
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "404":
          description: Member not found in workspace
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Remove workspace member
      tags:
      - Workspace
    patch:
      consumes:
      - application/json
      description: Changes the workspace role of the specified member. The requesting
        user must be an admin or owner. Cannot change the owner's role.
      operationId: v1UpdateWorkspaceMemberRole
      parameters:
      - description: User ID of the member
        format: uuid
        in: path
        name: userID
        required: true
        type: string
      - description: Role update parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/workspace.UpdateMemberRoleRequest'
      produces:
      - application/json
      responses:
        "204":
          description: Role updated successfully
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "401":
          description: Unauthorized
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "403":
          description: Forbidden
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "404":
          description: Member not found
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/workspace.ErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Update member role
      tags:
      - Workspace
  /v1/workspace/webhooks:
    get:
      consumes:
      - application/json
      description: Returns a paginated list of the workspace's non-deleted webhook
        endpoints.
      operationId: v1ListWorkspaceWebhooks
      parameters:
      - default: 20
        description: Limit
        in: query
        name: limit
        type: integer
      - default: 0
        description: Offset
        in: query
        name: offset
        type: integer
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/webhook.ListWebhooksResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope or role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: List workspace webhook endpoints
      tags:
      - Workspace Webhooks
    post:
      consumes:
      - application/json
      description: Registers a new webhook endpoint and returns the plaintext signing
        secret exactly once — it is not retrievable later, so store it immediately.
        The endpoint starts in pending verification. Requires PRO+ plan.
      operationId: v1CreateWorkspaceWebhook
      parameters:
      - description: Webhook creation parameters
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/webhook.CreateWebhookRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/webhook.CreateWebhookResponse'
        "400":
          description: Invalid request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required
          schema:
            $ref: '#/definitions/middleware.FeatureNotAvailableResponse'
        "403":
          description: Insufficient scope or role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "409":
          description: Active endpoint cap exceeded
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Create a workspace webhook endpoint
      tags:
      - Workspace Webhooks
  /v1/workspace/webhooks/{id}:
    delete:
      consumes:
      - application/json
      description: Soft-deletes a webhook endpoint by ID. Only workspace admins/owners
        can delete.
      operationId: v1DeleteWorkspaceWebhook
      parameters:
      - description: Webhook endpoint ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "204":
          description: Webhook endpoint deleted
        "400":
          description: Invalid webhook endpoint ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope or role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Webhook endpoint not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Delete a workspace webhook endpoint
      tags:
      - Workspace Webhooks
  /v1/workspace/webhooks/{id}/re-enable:
    post:
      consumes:
      - application/json
      description: 'Clears auto-disable state: sets status back to verified and resets
        failure count.'
      operationId: v1ReEnableWorkspaceWebhook
      parameters:
      - description: Webhook endpoint ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      - description: Optional client-generated idempotency key (max 255 printable
          ASCII). Repeat requests with the same key replay the original 2xx response.
        in: header
        name: Idempotency-Key
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          headers:
            Idempotent-Replayed:
              description: Present only on replays; value is true
              type: string
          schema:
            $ref: '#/definitions/webhook.WebhookResponse'
        "400":
          description: Invalid webhook endpoint ID or endpoint is not disabled
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "403":
          description: Insufficient scope or role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Webhook endpoint not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "409":
          description: An identical request is currently being processed (Idempotency-Key
            conflict)
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "422":
          description: Idempotency-Key has already been used with a different request
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Re-enable a disabled webhook endpoint
      tags:
      - Workspace Webhooks
  /v1/workspace/webhooks/{id}/rotate-secret:
    post:
      consumes:
      - application/json
      description: Generates a new signing secret and returns it exactly once — the
        previous secret is invalidated immediately and the new one is not retrievable
        later, so store it right away. This operation is destructive and non-idempotent.
        Requires PRO+ plan.
      operationId: v1RotateWorkspaceWebhookSecret
      parameters:
      - description: Webhook endpoint ID
        format: uuid
        in: path
        name: id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/webhook.RotateSecretResponse'
        "400":
          description: Invalid webhook endpoint ID
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "401":
          description: Authentication required
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "402":
          description: Plan upgrade required
          schema:
            $ref: '#/definitions/middleware.FeatureNotAvailableResponse'
        "403":
          description: Insufficient scope or role
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "404":
          description: Webhook endpoint not found
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
        "500":
          description: Internal server error
          schema:
            $ref: '#/definitions/errors.PartnerErrorResponse'
      security:
      - OAuth2Application:
        - workspace:write
      summary: Rotate webhook endpoint signing secret
      tags:
      - Workspace Webhooks
securityDefinitions:
  ContioAuth:
    description: 'First-party Authorization credential, sent as `Authorization: Bearer
      <token>`. Resource endpoints accept a personal access token (`cto_pat_v1_`)
      or OAuth access token (`cto_at_v1_`); the OAuth authorize/revoke endpoints instead
      require an authenticated user session.'
    in: header
    name: Authorization
    type: apiKey
  OAuth2Application:
    authorizationUrl: https://app.contio.ai/v1/oauth/authorize
    flow: accessCode
    scopes:
      action-items:read: Read action items
      action-items:write: Create, update, and delete action items
      calendar:read: Read calendar events
      meetings:read: Read meetings, agenda items, participants, meeting context, and
        event streams
      meetings:write: Create, update, and delete meetings, agenda items, participants,
        and meeting context
      workspace:read: Read workspace settings and membership
      workspace:write: Manage workspace settings, membership, API keys, and webhooks
    tokenUrl: https://api.contio.ai/v1/oauth/token
    type: oauth2
swagger: "2.0"
tags:
- name: "User Profile"
  description: |-
    Retrieve the authenticated user's identity and workspace context via the current-user (`/v1/me`) endpoint.
- name: "First-Party OAuth"
  description: |-
    Authorize and revoke first-party OAuth access on behalf of the signed-in user. The authorize/revoke endpoints require an authenticated user session; the resulting access token (`cto_at_v1_`) is then used as a bearer credential on resource endpoints.
- name: "User Tokens"
  description: |-
    Create and manage personal access tokens (`cto_pat_v1_`) for programmatic access to the User API. Personal access tokens are long-lived bearer credentials scoped to the issuing user.
- name: "Meetings"
  description: |-
    Retrieve meeting details, transcripts, and summaries, and update meeting metadata. Meetings are the central resource that action items, agenda items, participants, and context all attach to.
- name: "Meeting Templates"
  description: |-
    List meeting templates available to the authenticated user for structuring new meetings with predefined agendas and settings.
- name: "Participants"
  description: |-
    List and manage the participants associated with a meeting, including their roles and contact information.
- name: "Agenda Items"
  description: |-
    Read and write agenda items associated with a meeting. Agenda items can be set before a meeting starts and are available to all participants.
- name: "Action Items"
  description: |-
    Retrieve, create, and update action items extracted from meetings. Action items include the task description, owner, due date, and current status.
- name: "Meeting Context"
  description: |-
    Upload and manage context documents made available to the Contio AI agent for a meeting. Documents can be plain text, markdown, or structured data.
- name: "Calendar"
  description: |-
    Access calendar events linked to Contio meetings. These endpoints let you list events and retrieve event details associated with meeting records.
- name: "User Events"
  description: |-
    Subscribe to a Server-Sent Events stream of user-scoped changes across meetings, participants, action items, agenda items, meeting context, and calendar events. Supply the `Last-Event-ID` header to resume a dropped connection without gaps.
- name: "Workspace"
  description: |-
    Read and manage workspace-level settings and membership for the authenticated user's workspace.
- name: "Workspace API Keys"
  description: |-
    Issue, list, and revoke workspace-scoped API keys used by server-to-server integrations.
- name: "Workspace Webhooks"
  description: |-
    Configure workspace webhook endpoints that Contio uses to deliver real-time event notifications, and inspect their configuration.
x-tagGroups:
- name: "User Authentication"
  tags:
  - "User Profile"
  - "First-Party OAuth"
  - "User Tokens"
- name: "Meeting Data"
  tags:
  - "Meetings"
  - "Meeting Templates"
  - "Participants"
  - "Agenda Items"
  - "Action Items"
  - "Meeting Context"
  - "Calendar"
  - "User Events"
- name: "Workspace Administration"
  tags:
  - "Workspace"
  - "Workspace API Keys"
  - "Workspace Webhooks"
