{
  "swagger": "2.0",
  "info": {
    "description": "First-party user/workspace API for Contio MeetingOS.",
    "title": "Contio MeetingOS User API",
    "termsOfService": "https://contio.ai/tos",
    "contact": {
      "name": "Contio MeetingOS Support",
      "url": "https://contio.ai/contact",
      "email": "support@contio.ai"
    },
    "license": {
      "name": "MIT/Commercial"
    },
    "version": "1.1.0"
  },
  "host": "api.contio.ai",
  "basePath": "/",
  "paths": {
    "/v1/action-items": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "action-items:read"
            ]
          }
        ],
        "description": "Retrieves action items assigned to the authenticated user within their workspace",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Action Items"
        ],
        "summary": "List action items",
        "operationId": "v1ListActionItems",
        "parameters": [
          {
            "type": "integer",
            "default": 20,
            "description": "Maximum items per page (1-100)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Number of items to skip",
            "name": "offset",
            "in": "query"
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "Filter by meeting ID",
            "name": "meeting_id",
            "in": "query"
          },
          {
            "enum": [
              "needs_review",
              "accepted",
              "in_progress",
              "blocked",
              "completed",
              "cancelled"
            ],
            "type": "string",
            "description": "Filter by status",
            "name": "status",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "action-items:write"
            ]
          }
        ],
        "description": "Creates a new action item in a meeting the authenticated user can access",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Action Items"
        ],
        "summary": "Create action item",
        "operationId": "v1CreateActionItem",
        "parameters": [
          {
            "description": "Action item data",
            "name": "action_item",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/action_item.CreateActionItemRequest"
            }
          },
          {
            "type": "string",
            "description": "Optional client-generated idempotency key (max 255 printable ASCII). Repeat requests with the same key replay the original 2xx response.",
            "name": "Idempotency-Key",
            "in": "header"
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "schema": {
              "$ref": "#/definitions/action_item.ActionItemResponse"
            },
            "headers": {
              "Idempotent-Replayed": {
                "type": "string",
                "description": "Present only on replays; value is true"
              }
            }
          },
          "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"
            }
          }
        }
      }
    },
    "/v1/action-items/{id}": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "action-items:read"
            ]
          }
        ],
        "description": "Retrieves a single action item by ID if it is accessible to the authenticated user",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Action Items"
        ],
        "summary": "Get action item",
        "operationId": "v1GetActionItem",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Action Item ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "action-items:write"
            ]
          }
        ],
        "description": "Deletes an action item the authenticated user can access",
        "tags": [
          "Action Items"
        ],
        "summary": "Delete action item",
        "operationId": "v1DeleteActionItem",
        "parameters": [
          {
            "type": "string",
            "description": "Action Item ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "patch": {
        "security": [
          {
            "OAuth2Application": [
              "action-items:write"
            ]
          }
        ],
        "description": "Partially updates an action item the authenticated user can access",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Action Items"
        ],
        "summary": "Update action item",
        "operationId": "v1UpdateActionItem",
        "parameters": [
          {
            "type": "string",
            "description": "Action Item ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "description": "Action item update data",
            "name": "action_item",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/action_item.UpdateActionItemRequest"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/agenda-items": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Retrieves agenda items accessible to the authenticated user within their workspace",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Agenda Items"
        ],
        "summary": "List agenda items",
        "operationId": "v1ListAgendaItems",
        "parameters": [
          {
            "type": "integer",
            "default": 20,
            "description": "Maximum items per page (1-100)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Number of items to skip",
            "name": "offset",
            "in": "query"
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "Filter by meeting ID",
            "name": "meeting_id",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Creates an agenda item attached to a meeting in the authenticated user's workspace.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Agenda Items"
        ],
        "summary": "Create an agenda item",
        "operationId": "v1CreateAgendaItem",
        "parameters": [
          {
            "description": "Agenda item creation parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/agenda_item.CreateAgendaItemRequest"
            }
          },
          {
            "type": "string",
            "description": "Optional client-generated idempotency key (max 255 printable ASCII). Repeat requests with the same key replay the original 2xx response.",
            "name": "Idempotency-Key",
            "in": "header"
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "schema": {
              "$ref": "#/definitions/agenda_item.AgendaItemResponse"
            },
            "headers": {
              "Idempotent-Replayed": {
                "type": "string",
                "description": "Present only on replays; value is true"
              }
            }
          },
          "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"
            }
          }
        }
      }
    },
    "/v1/agenda-items/{id}": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Retrieves a single agenda item by ID from the authenticated user's workspace.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Agenda Items"
        ],
        "summary": "Get an agenda item",
        "operationId": "v1GetAgendaItem",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Agenda item ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Deletes an agenda item in the authenticated user's workspace.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Agenda Items"
        ],
        "summary": "Delete an agenda item",
        "operationId": "v1DeleteAgendaItem",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Agenda item ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "patch": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Updates fields on an agenda item in the authenticated user's workspace. Only provided fields are changed.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Agenda Items"
        ],
        "summary": "Update an agenda item",
        "operationId": "v1UpdateAgendaItem",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Agenda item ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "description": "Agenda item update parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/agenda_item.UpdateAgendaItemRequest"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/auth/introspect": {
      "get": {
        "security": [
          {
            "OAuth2Application": []
          }
        ],
        "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.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "User Tokens"
        ],
        "summary": "Introspect first-party token",
        "operationId": "v1GetAuthIntrospect",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/token.IntrospectResponse"
            }
          },
          "401": {
            "description": "Authentication required",
            "schema": {
              "$ref": "#/definitions/errors.PartnerErrorResponse"
            }
          }
        }
      }
    },
    "/v1/calendar/events": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "calendar:read"
            ]
          }
        ],
        "description": "Retrieve a paginated list of calendar events for the authenticated user within a specified time range",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Calendar"
        ],
        "summary": "List calendar events",
        "operationId": "v1ListCalendarEvents",
        "parameters": [
          {
            "type": "string",
            "example": "\"2023-01-01T00:00:00Z\"",
            "description": "Start time in RFC3339 format",
            "name": "start_date",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "example": "\"2023-01-31T23:59:59Z\"",
            "description": "End time in RFC3339 format",
            "name": "end_date",
            "in": "query",
            "required": true
          },
          {
            "type": "integer",
            "description": "Number of results per page (default 25, max 100)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Pagination offset (default 0)",
            "name": "offset",
            "in": "query"
          },
          {
            "type": "string",
            "description": "Sort direction: asc or desc (default: asc)",
            "name": "direction",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/calendar/events/{id}": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "calendar:read"
            ]
          }
        ],
        "description": "Retrieve details of a specific calendar event for the authenticated user",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Calendar"
        ],
        "summary": "Get calendar event by ID",
        "operationId": "v1GetCalendarEvent",
        "parameters": [
          {
            "type": "string",
            "example": "\"123e4567-e89b-12d3-a456-426614174006\"",
            "description": "Calendar Event ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/me": {
      "get": {
        "security": [
          {
            "OAuth2Application": []
          }
        ],
        "description": "Returns the authenticated user's identity and workspace context.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "User Profile"
        ],
        "summary": "Get current user identity",
        "operationId": "v1GetMe",
        "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"
            }
          }
        }
      }
    },
    "/v1/meeting-templates": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "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.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meeting Templates"
        ],
        "summary": "List meeting templates",
        "operationId": "v1ListMeetingTemplates",
        "parameters": [
          {
            "type": "integer",
            "default": 20,
            "description": "Maximum items per page (1-100)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Number of items to skip",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Retrieves meetings accessible to the authenticated user within their workspace. Returns paginated results.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "List meetings",
        "operationId": "v1ListMeetings",
        "parameters": [
          {
            "type": "integer",
            "description": "Maximum items per page (1-100, default 20)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Number of items to skip (default 0)",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Creates a meeting owned by the authenticated user within their workspace. The creator is added as the owner participant.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "Create a meeting",
        "operationId": "v1CreateMeeting",
        "parameters": [
          {
            "description": "Meeting creation parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/meeting.CreateMeetingRequestV1"
            }
          },
          {
            "type": "string",
            "description": "Optional client-generated idempotency key (max 255 printable ASCII). Repeat requests with the same key replay the original 2xx response.",
            "name": "Idempotency-Key",
            "in": "header"
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "schema": {
              "$ref": "#/definitions/shared.MeetingResponse"
            },
            "headers": {
              "Idempotent-Replayed": {
                "type": "string",
                "description": "Present only on replays; value is true"
              }
            }
          },
          "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"
            }
          }
        }
      }
    },
    "/v1/meetings/search": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "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.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "Search meetings",
        "operationId": "v1SearchMeetings",
        "parameters": [
          {
            "maxLength": 255,
            "type": "string",
            "description": "Free-text query matched (case-insensitive substring) against the meeting title and email alias",
            "name": "q",
            "in": "query"
          },
          {
            "type": "string",
            "format": "date-time",
            "description": "Inclusive lower bound on start time (ISO 8601 with timezone)",
            "name": "start_time_from",
            "in": "query"
          },
          {
            "type": "string",
            "format": "date-time",
            "description": "Inclusive upper bound on start time (ISO 8601 with timezone)",
            "name": "start_time_to",
            "in": "query"
          },
          {
            "enum": [
              "scheduled",
              "completed"
            ],
            "type": "string",
            "description": "Filter by meeting status",
            "name": "status",
            "in": "query"
          },
          {
            "maxLength": 255,
            "type": "string",
            "description": "Case-insensitive substring match against the meeting title",
            "name": "title_contains",
            "in": "query"
          },
          {
            "maxLength": 500,
            "type": "string",
            "description": "Comma-separated participant email addresses to filter by",
            "name": "participant_emails",
            "in": "query"
          },
          {
            "type": "boolean",
            "description": "Restrict to meetings that do (true) or do not (false) have action items",
            "name": "has_action_items",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Maximum items per page (1-100, default 20)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Number of items to skip (default 0)",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/upcoming": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Retrieves the authenticated caller's upcoming meetings, soonest first. Returns paginated results.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "List upcoming meetings",
        "operationId": "v1ListUpcomingMeetings",
        "parameters": [
          {
            "type": "integer",
            "description": "Maximum items per page (1-100, default 20)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Number of items to skip (default 0)",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "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.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "Get meeting by ID",
        "operationId": "v1GetMeeting",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Soft-deletes a meeting owned by the authenticated user (owner-scoped).",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "Delete a meeting",
        "operationId": "v1DeleteMeeting",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "patch": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "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).",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "Update a meeting",
        "operationId": "v1UpdateMeeting",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "description": "Meeting update parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/meeting.UpdateMeetingRequestV1"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/contacts": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "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.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Participants"
        ],
        "summary": "List meeting contacts",
        "operationId": "v1ListMeetingContacts",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "description": "Search query matched against name or email",
            "name": "q",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Maximum number of items per page (1-100, default 20)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Number of items to skip (default 0)",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/context": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Lists meeting contexts for a meeting with pagination. Returns all context documents regardless of source (partner or user-uploaded).",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meeting Context"
        ],
        "summary": "List meeting contexts",
        "operationId": "v1ListMeetingContext",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "integer",
            "default": 25,
            "description": "Maximum number of items to return (1-100)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Offset for pagination",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "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.",
        "consumes": [
          "multipart/form-data"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meeting Context"
        ],
        "summary": "Upload meeting context",
        "operationId": "v1UploadMeetingContext",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "file",
            "description": "Context document file",
            "name": "file",
            "in": "formData",
            "required": true
          },
          {
            "type": "string",
            "description": "Document title",
            "name": "title",
            "in": "formData"
          },
          {
            "type": "string",
            "description": "MIME type of the document",
            "name": "context_type",
            "in": "formData"
          },
          {
            "type": "string",
            "description": "Source format (json, csv, tsv, xml, html, yaml, markdown, plain_text)",
            "name": "source_format",
            "in": "formData",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/context/{context_id}": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Retrieves metadata for a specific meeting context document.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meeting Context"
        ],
        "summary": "Get meeting context",
        "operationId": "v1GetMeetingContext",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "Context ID",
            "name": "context_id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Soft-deletes a specific meeting context document.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Meeting Context"
        ],
        "summary": "Delete meeting context",
        "operationId": "v1DeleteMeetingContext",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "Context ID",
            "name": "context_id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/context/{context_id}/content": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Streams the file content for a specific meeting context document from S3.",
        "produces": [
          "application/octet-stream"
        ],
        "tags": [
          "Meeting Context"
        ],
        "summary": "Download meeting context content",
        "operationId": "v1DownloadMeetingContextContent",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "Context ID",
            "name": "context_id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/participants": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Retrieves participants for a specific meeting accessible to the authenticated user. Returns paginated results.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Participants"
        ],
        "summary": "List meeting participants",
        "operationId": "v1ListMeetingParticipants",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "integer",
            "description": "Maximum number of items per page (1-100, default 20)",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Number of items to skip (default 0)",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Adds one or more participants to a meeting owned by the authenticated user's workspace.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Participants"
        ],
        "summary": "Add meeting participants",
        "operationId": "v1AddMeetingParticipants",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "description": "Participants to add",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/participant.V1AddParticipantsRequest"
            }
          },
          {
            "type": "string",
            "description": "Optional client-generated idempotency key (max 255 printable ASCII). Repeat requests with the same key replay the original 2xx response.",
            "name": "Idempotency-Key",
            "in": "header"
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "schema": {
              "$ref": "#/definitions/participant.V1AddParticipantsResponse"
            },
            "headers": {
              "Idempotent-Replayed": {
                "type": "string",
                "description": "Present only on replays; value is true"
              }
            }
          },
          "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/participants/{userId}": {
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Removes the participant identified by user ID from a meeting owned by the authenticated user's workspace.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Participants"
        ],
        "summary": "Remove meeting participant by user ID",
        "operationId": "v1RemoveMeetingParticipant",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "User ID",
            "name": "userId",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/participants/{userId}/role": {
      "patch": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:write"
            ]
          }
        ],
        "description": "Updates the role (EDITOR or VIEWER) of the participant identified by user ID in a meeting owned by the authenticated user's workspace.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Participants"
        ],
        "summary": "Update meeting participant role by user ID",
        "operationId": "v1UpdateMeetingParticipantRole",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "type": "string",
            "format": "uuid",
            "description": "User ID",
            "name": "userId",
            "in": "path",
            "required": true
          },
          {
            "description": "Role update",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/participant.V1UpdateParticipantRoleRequest"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/meetings/{id}/transcript/export": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Downloads the meeting transcript as an SRT file. Requires the Elite plan.",
        "produces": [
          "application/x-subrip"
        ],
        "tags": [
          "Meetings"
        ],
        "summary": "Export meeting transcript",
        "operationId": "v1ExportTranscript",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Meeting ID",
            "name": "id",
            "in": "path",
            "required": true
          },
          {
            "enum": [
              "srt"
            ],
            "type": "string",
            "description": "Output format (default: srt)",
            "name": "format",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/oauth/.well-known/jwks.json": {
      "get": {
        "description": "Returns the JSON Web Key Set for first-party token verification.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "First-Party OAuth"
        ],
        "summary": "First-Party JWKS",
        "operationId": "v1GetOAuthJwks",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/rome_api_controllers_external_v1_oauth.JWKSResponse"
            }
          },
          "500": {
            "description": "Internal Server Error",
            "schema": {
              "$ref": "#/definitions/oauth.OAuthErrorResponse"
            }
          }
        }
      }
    },
    "/v1/oauth/.well-known/openid-configuration": {
      "get": {
        "description": "Returns the first-party OpenID Connect discovery document (RFC 8414, hyphenated spelling).",
        "produces": [
          "application/json"
        ],
        "tags": [
          "First-Party OAuth"
        ],
        "summary": "First-Party OIDC Discovery",
        "operationId": "v1GetOAuthOpenidConfiguration",
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/rome_api_controllers_external_v1_oauth.DiscoveryDocument"
            }
          }
        }
      }
    },
    "/v1/oauth/authorize": {
      "get": {
        "security": [
          {
            "ContioAuth": []
          }
        ],
        "description": "Initiates the first-party OAuth 2.1 authorization code flow with PKCE. Redirects to the loopback with an authorization code.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "First-Party OAuth"
        ],
        "summary": "First-Party OAuth Authorization",
        "operationId": "v1AuthorizeOAuth",
        "parameters": [
          {
            "type": "string",
            "description": "First-party client ID",
            "name": "client_id",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "description": "Loopback redirect URI (http://127.0.0.1:PORT or http://localhost:PORT)",
            "name": "redirect_uri",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "description": "Must be 'code'",
            "name": "response_type",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "description": "Space-delimited scopes",
            "name": "scope",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "description": "Opaque state value",
            "name": "state",
            "in": "query"
          },
          {
            "type": "string",
            "description": "PKCE S256 code challenge",
            "name": "code_challenge",
            "in": "query",
            "required": true
          },
          {
            "type": "string",
            "description": "Must be 'S256'",
            "name": "code_challenge_method",
            "in": "query",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/oauth/revoke": {
      "post": {
        "security": [
          {
            "ContioAuth": []
          }
        ],
        "description": "Revokes a first-party access or refresh token (and its chain). Follows RFC 7009.",
        "consumes": [
          "application/x-www-form-urlencoded"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "First-Party OAuth"
        ],
        "summary": "First-Party OAuth Token Revocation",
        "operationId": "v1RevokeOAuthToken",
        "parameters": [
          {
            "type": "string",
            "description": "Token to revoke",
            "name": "token",
            "in": "formData",
            "required": true
          },
          {
            "type": "string",
            "description": "access_token or refresh_token",
            "name": "token_type_hint",
            "in": "formData"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/oauth/token": {
      "post": {
        "description": "Exchanges an authorization code + PKCE verifier for tokens, or refreshes an existing token.",
        "consumes": [
          "application/x-www-form-urlencoded"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "First-Party OAuth"
        ],
        "summary": "First-Party OAuth Token Exchange",
        "operationId": "v1ExchangeOAuthToken",
        "parameters": [
          {
            "type": "string",
            "description": "authorization_code or refresh_token",
            "name": "grant_type",
            "in": "formData",
            "required": true
          },
          {
            "type": "string",
            "description": "Authorization code (for authorization_code grant)",
            "name": "code",
            "in": "formData"
          },
          {
            "type": "string",
            "description": "PKCE code verifier (for authorization_code grant)",
            "name": "code_verifier",
            "in": "formData"
          },
          {
            "type": "string",
            "description": "First-party client ID (for authorization_code grant)",
            "name": "client_id",
            "in": "formData"
          },
          {
            "type": "string",
            "description": "Must match authorize redirect_uri (for authorization_code grant)",
            "name": "redirect_uri",
            "in": "formData"
          },
          {
            "type": "string",
            "description": "Refresh token (for refresh_token grant)",
            "name": "refresh_token",
            "in": "formData"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/user/events": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "meetings:read"
            ]
          }
        ],
        "description": "Opens a Server-Sent Events stream of the caller's workspace events\n(meetings, participants, action items, agenda items, meeting context,\ncalendar events). Supply the Last-Event-ID header to resume a dropped\nconnection without gaps. The stream may be opened with any of the\nfollowing read scopes: meetings:read, action-items:read, calendar:read,\nor workspace:read. The @Security annotation lists one valid scope;\nthe runtime middleware enforces the any-of requirement.",
        "produces": [
          "text/event-stream"
        ],
        "tags": [
          "User Events"
        ],
        "summary": "Stream workspace events (SSE)",
        "operationId": "v1StreamUserEvents",
        "parameters": [
          {
            "type": "string",
            "description": "Stream ID of the last event the client received; replays events after it",
            "name": "Last-Event-ID",
            "in": "header"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/user/tokens": {
      "get": {
        "security": [
          {
            "OAuth2Application": []
          }
        ],
        "description": "Returns a paginated list of the caller's non-revoked PATs (masked prefix, scopes, timestamps).",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "User Tokens"
        ],
        "summary": "List user access tokens",
        "operationId": "v1ListUserTokens",
        "parameters": [
          {
            "type": "integer",
            "default": 20,
            "description": "Limit",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Offset",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/user/tokens/{id}": {
      "delete": {
        "security": [
          {
            "OAuth2Application": []
          }
        ],
        "description": "Soft-deletes a PAT by ID. Only the token owner can delete.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "User Tokens"
        ],
        "summary": "Delete a user access token",
        "operationId": "v1DeleteUserToken",
        "parameters": [
          {
            "type": "string",
            "description": "Token ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:read"
            ]
          }
        ],
        "description": "Returns the workspace record (name, plan, owner, timestamps) for the Principal's workspace.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace"
        ],
        "summary": "Get workspace settings",
        "operationId": "v1GetWorkspace",
        "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"
            }
          }
        }
      },
      "patch": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Updates workspace settings (name, company size, primary industry, external participant removal). Only provided fields are changed.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace"
        ],
        "summary": "Update workspace settings",
        "operationId": "v1UpdateWorkspace",
        "parameters": [
          {
            "description": "Workspace update parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/workspace.PatchWorkspaceBody"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/api-keys": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Returns a paginated list of the workspace's non-revoked API keys (masked prefix, scopes, timestamps).",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace API Keys"
        ],
        "summary": "List workspace API keys",
        "operationId": "v1ListWorkspaceApiKeys",
        "parameters": [
          {
            "type": "integer",
            "default": 20,
            "description": "Limit",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Offset",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/api-keys/{id}": {
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Soft-deletes a workspace API key by ID. IDOR protection: workspace-ownership verified before revocation; returns 404 on mismatch (section 3.4 cloaking).",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace API Keys"
        ],
        "summary": "Delete a workspace API key",
        "operationId": "v1DeleteWorkspaceApiKey",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "API Key ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/members": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:read"
            ]
          }
        ],
        "description": "Returns a paginated list of members (active users and pending invitations) for the Principal's workspace.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace"
        ],
        "summary": "List workspace members",
        "operationId": "v1ListWorkspaceMembers",
        "parameters": [
          {
            "type": "integer",
            "description": "Items per page (default 25, clamped [1,100])",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "description": "Pagination offset (default 0)",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/members/{userID}": {
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Soft-deletes a member from the workspace. Cannot remove the workspace owner or yourself.",
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace"
        ],
        "summary": "Remove workspace member",
        "operationId": "v1RemoveWorkspaceMember",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "User ID of the member to remove",
            "name": "userID",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      },
      "patch": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Changes the workspace role of the specified member. The requesting user must be an admin or owner. Cannot change the owner's role.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace"
        ],
        "summary": "Update member role",
        "operationId": "v1UpdateWorkspaceMemberRole",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "User ID of the member",
            "name": "userID",
            "in": "path",
            "required": true
          },
          {
            "description": "Role update parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/workspace.UpdateMemberRoleRequest"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/webhooks": {
      "get": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Returns a paginated list of the workspace's non-deleted webhook endpoints.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace Webhooks"
        ],
        "summary": "List workspace webhook endpoints",
        "operationId": "v1ListWorkspaceWebhooks",
        "parameters": [
          {
            "type": "integer",
            "default": 20,
            "description": "Limit",
            "name": "limit",
            "in": "query"
          },
          {
            "type": "integer",
            "default": 0,
            "description": "Offset",
            "name": "offset",
            "in": "query"
          }
        ],
        "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"
            }
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "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.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace Webhooks"
        ],
        "summary": "Create a workspace webhook endpoint",
        "operationId": "v1CreateWorkspaceWebhook",
        "parameters": [
          {
            "description": "Webhook creation parameters",
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/webhook.CreateWebhookRequest"
            }
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/webhooks/{id}": {
      "delete": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Soft-deletes a webhook endpoint by ID. Only workspace admins/owners can delete.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace Webhooks"
        ],
        "summary": "Delete a workspace webhook endpoint",
        "operationId": "v1DeleteWorkspaceWebhook",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Webhook endpoint ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    },
    "/v1/workspace/webhooks/{id}/re-enable": {
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "description": "Clears auto-disable state: sets status back to verified and resets failure count.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace Webhooks"
        ],
        "summary": "Re-enable a disabled webhook endpoint",
        "operationId": "v1ReEnableWorkspaceWebhook",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Webhook endpoint ID",
            "name": "id",
            "in": "path",
            "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.",
            "name": "Idempotency-Key",
            "in": "header"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/webhook.WebhookResponse"
            },
            "headers": {
              "Idempotent-Replayed": {
                "type": "string",
                "description": "Present only on replays; value is true"
              }
            }
          },
          "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"
            }
          }
        }
      }
    },
    "/v1/workspace/webhooks/{id}/rotate-secret": {
      "post": {
        "security": [
          {
            "OAuth2Application": [
              "workspace:write"
            ]
          }
        ],
        "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.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "tags": [
          "Workspace Webhooks"
        ],
        "summary": "Rotate webhook endpoint signing secret",
        "operationId": "v1RotateWorkspaceWebhookSecret",
        "parameters": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Webhook endpoint ID",
            "name": "id",
            "in": "path",
            "required": true
          }
        ],
        "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"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "action_item.ActionItemResponse": {
      "type": "object",
      "properties": {
        "agenda_item_id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000003"
        },
        "assigned_to_user_id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000004"
        },
        "completed_at": {
          "type": "string",
          "example": "2026-01-15T10:00:00Z"
        },
        "created_at": {
          "type": "string",
          "example": "2026-01-01T00:00:00Z"
        },
        "description": {
          "type": "string",
          "example": "Send proposal by Friday"
        },
        "due_date": {
          "type": "string",
          "example": "2026-01-15"
        },
        "id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000001"
        },
        "is_completed": {
          "type": "boolean",
          "example": false
        },
        "meeting_id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000002"
        },
        "status": {
          "type": "string",
          "example": "accepted"
        },
        "title": {
          "type": "string",
          "example": "Follow up with client"
        },
        "updated_at": {
          "type": "string",
          "example": "2026-01-01T00:00:00Z"
        }
      }
    },
    "action_item.CreateActionItemRequest": {
      "type": "object",
      "required": [
        "meeting_id",
        "title"
      ],
      "properties": {
        "description": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1,
          "example": "Send proposal by Friday"
        },
        "due_date": {
          "type": "string",
          "example": "2026-01-15"
        },
        "meeting_id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000002"
        },
        "status": {
          "type": "string",
          "enum": [
            "needs_review",
            "accepted",
            "in_progress",
            "blocked",
            "completed",
            "cancelled"
          ],
          "example": "needs_review"
        },
        "title": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1,
          "example": "Follow up with client"
        }
      }
    },
    "action_item.UpdateActionItemRequest": {
      "type": "object",
      "properties": {
        "description": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1,
          "example": "Updated description"
        },
        "due_date": {
          "type": "string",
          "example": "2026-01-15"
        },
        "is_completed": {
          "type": "boolean",
          "example": true
        },
        "status": {
          "type": "string",
          "enum": [
            "needs_review",
            "accepted",
            "in_progress",
            "blocked",
            "completed",
            "cancelled"
          ],
          "example": "accepted"
        },
        "title": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1,
          "example": "Follow up with client"
        }
      }
    },
    "agenda_item.AgendaItemResponse": {
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2026-01-01T00:00:00Z"
        },
        "deferred": {
          "type": "boolean",
          "example": false
        },
        "id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000001"
        },
        "item_type": {
          "type": "string",
          "example": "DISCUSSION"
        },
        "meeting_id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000002"
        },
        "status": {
          "type": "string",
          "example": "PENDING"
        },
        "time_allocation_minutes": {
          "type": "number",
          "example": 15
        },
        "title": {
          "type": "string",
          "example": "Q3 roadmap review"
        },
        "updated_at": {
          "type": "string",
          "example": "2026-01-01T00:00:00Z"
        }
      }
    },
    "agenda_item.CreateAgendaItemRequest": {
      "type": "object",
      "required": [
        "item_type",
        "meeting_id",
        "title"
      ],
      "properties": {
        "description": {
          "type": "string",
          "example": "Review the Q3 roadmap"
        },
        "item_type": {
          "type": "string",
          "example": "DISCUSSION"
        },
        "meeting_id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000002"
        },
        "presenters": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "restricted_to_leads": {
          "type": "boolean",
          "example": false
        },
        "sequence": {
          "type": "string",
          "example": "a0"
        },
        "time_allocation_minutes": {
          "type": "number",
          "example": 15
        },
        "title": {
          "type": "string",
          "example": "Q3 roadmap review"
        }
      }
    },
    "agenda_item.UpdateAgendaItemRequest": {
      "type": "object",
      "properties": {
        "description": {
          "type": "string",
          "example": "Review the roadmap"
        },
        "item_type": {
          "type": "string",
          "example": "DISCUSSION"
        },
        "presenters": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "restricted_to_leads": {
          "type": "boolean",
          "example": false
        },
        "sequence": {
          "type": "string",
          "example": "a0"
        },
        "status": {
          "type": "string",
          "example": "ACTIVE"
        },
        "time_allocation_minutes": {
          "type": "number",
          "example": 15
        },
        "title": {
          "type": "string",
          "example": "Q3 roadmap review"
        }
      }
    },
    "api_key.APIKeyResponse": {
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string"
        },
        "expires_at": {
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "last_used_at": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "prefix": {
          "type": "string"
        },
        "scopes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "api_key.ListAPIKeysResponse": {
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/api_key.APIKeyResponse"
          }
        },
        "limit": {
          "type": "integer"
        },
        "offset": {
          "type": "integer"
        },
        "total": {
          "type": "integer"
        }
      }
    },
    "calendar.CalendarEventAttendeeResponse": {
      "type": "object",
      "properties": {
        "email": {
          "description": "Email address of the attendee",
          "type": "string",
          "example": "john.doe@example.com"
        },
        "name": {
          "description": "Display name of the attendee",
          "type": "string",
          "example": "John Doe"
        },
        "status": {
          "description": "RSVP status (accepted, declined, tentative, needs_action)",
          "type": "string",
          "example": "accepted"
        },
        "type": {
          "description": "Attendee type (required, optional, resource)",
          "type": "string",
          "example": "required"
        }
      }
    },
    "calendar.CalendarEventResponse": {
      "type": "object",
      "properties": {
        "attendees": {
          "description": "List of attendees for the calendar event",
          "type": "array",
          "items": {
            "$ref": "#/definitions/calendar.CalendarEventAttendeeResponse"
          }
        },
        "description": {
          "description": "Description or body of the calendar event",
          "type": "string",
          "example": "Discuss project updates"
        },
        "end_time": {
          "description": "End time of the event in RFC3339 format",
          "type": "string",
          "example": "2023-01-01T11:00:00Z"
        },
        "id": {
          "description": "Unique identifier for the calendar event",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174006"
        },
        "linked_meetings": {
          "description": "IDs of all linked Contio meetings, sorted by creation date (oldest first)",
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "[\"123e4567-e89b-12d3-a456-426614174000\"]"
          ]
        },
        "location": {
          "description": "Location of the event (physical or virtual)",
          "type": "string",
          "example": "Conference Room A"
        },
        "organizer": {
          "description": "Organizer of the calendar event",
          "allOf": [
            {
              "$ref": "#/definitions/calendar.CalendarEventAttendeeResponse"
            }
          ]
        },
        "start_time": {
          "description": "Start time of the event in RFC3339 format",
          "type": "string",
          "example": "2023-01-01T10:00:00Z"
        },
        "title": {
          "description": "Title of the calendar event",
          "type": "string",
          "example": "Weekly Team Sync"
        }
      }
    },
    "calendar.ListCalendarEventsResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of calendar events for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/calendar.CalendarEventResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 25
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "context.MeetingContextListResponse": {
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/context.MeetingContextResponse"
          }
        },
        "limit": {
          "type": "integer"
        },
        "offset": {
          "type": "integer"
        },
        "total": {
          "type": "integer"
        }
      }
    },
    "context.MeetingContextResponse": {
      "type": "object",
      "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"
        }
      }
    },
    "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.",
      "type": "object",
      "properties": {
        "code": {
          "description": "Unique identifier for the error type, useful for programmatic error handling",
          "type": "string",
          "example": "invalid_request"
        },
        "error": {
          "description": "User-friendly description of what went wrong",
          "type": "string",
          "example": "Invalid request"
        },
        "message": {
          "description": "Deprecated: Use 'error' field instead. Will be removed in v2.0",
          "type": "string",
          "example": "Invalid request"
        },
        "request_id": {
          "description": "Request identifier to correlate errors with logs",
          "type": "string",
          "example": "abc123xyz"
        }
      }
    },
    "meeting.CreateMeetingRequestV1": {
      "type": "object",
      "required": [
        "title"
      ],
      "properties": {
        "detail_level": {
          "type": "string",
          "enum": [
            "BULLET_POINTS",
            "STANDARD",
            "VERBATIM"
          ],
          "example": "STANDARD"
        },
        "end_time": {
          "type": "string",
          "example": "2023-01-01T11:00:00Z"
        },
        "is_instant": {
          "type": "boolean",
          "example": false
        },
        "start_time": {
          "type": "string",
          "example": "2023-01-01T10:00:00Z"
        },
        "template_id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174004"
        },
        "title": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "example": "Weekly Team Sync"
        }
      }
    },
    "meeting.UpdateMeetingRequestV1": {
      "type": "object",
      "properties": {
        "detail_level": {
          "type": "string",
          "enum": [
            "BULLET_POINTS",
            "STANDARD",
            "VERBATIM"
          ],
          "example": "STANDARD"
        },
        "end_time": {
          "type": "string",
          "x-nullable": true,
          "example": "2023-01-01T11:00:00Z"
        },
        "start_time": {
          "type": "string",
          "x-nullable": true,
          "example": "2023-01-01T10:00:00Z"
        },
        "template_id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174004"
        },
        "title": {
          "type": "string",
          "maxLength": 255,
          "example": "Renamed Team Sync"
        }
      }
    },
    "meeting_template.MeetingTemplateResponse": {
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2026-01-01T00:00:00Z"
        },
        "description": {
          "type": "string",
          "example": "Standard agenda for weekly team syncs"
        },
        "id": {
          "type": "string",
          "example": "019abc12-def3-7000-8000-000000000001"
        },
        "is_active": {
          "type": "boolean",
          "example": true
        },
        "name": {
          "type": "string",
          "example": "Weekly Team Sync"
        },
        "ownership_type": {
          "type": "string",
          "enum": [
            "SYSTEM",
            "VERTICAL",
            "WORKSPACE",
            "USER",
            "PARTNER"
          ],
          "example": "WORKSPACE"
        },
        "updated_at": {
          "type": "string",
          "example": "2026-01-01T00:00:00Z"
        }
      }
    },
    "middleware.FeatureNotAvailableResponse": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "current_plan": {
          "type": "string"
        },
        "feature": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "required_plan": {
          "type": "string"
        }
      }
    },
    "oauth.OAuthErrorResponse": {
      "type": "object",
      "properties": {
        "error": {
          "type": "string"
        },
        "error_description": {
          "type": "string"
        }
      }
    },
    "participant.V1AddParticipantsRequest": {
      "type": "object",
      "required": [
        "participants"
      ],
      "properties": {
        "participants": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/definitions/participant.V1ParticipantAdd"
          }
        }
      }
    },
    "participant.V1AddParticipantsResponse": {
      "type": "object",
      "properties": {
        "participants": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/participant.V1ParticipantResponse"
          }
        }
      }
    },
    "participant.V1ContactResponse": {
      "type": "object",
      "properties": {
        "email": {
          "type": "string",
          "example": "jane@acme.com"
        },
        "name": {
          "type": "string",
          "example": "Jane Doe"
        }
      }
    },
    "participant.V1ParticipantAdd": {
      "type": "object",
      "required": [
        "role"
      ],
      "properties": {
        "guest_email": {
          "type": "string",
          "format": "email",
          "maxLength": 255,
          "example": "guest@example.com"
        },
        "role": {
          "type": "string",
          "enum": [
            "EDITOR",
            "VIEWER"
          ],
          "example": "VIEWER"
        },
        "user_id": {
          "type": "string",
          "format": "uuid",
          "example": "123e4567-e89b-12d3-a456-426614174003"
        }
      }
    },
    "participant.V1ParticipantResponse": {
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2023-01-01T00:00:00Z"
        },
        "email": {
          "type": "string",
          "example": "john.doe@example.com"
        },
        "id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174004"
        },
        "is_attended": {
          "type": "boolean",
          "example": true
        },
        "meeting_id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174000"
        },
        "name": {
          "type": "string",
          "example": "John Doe"
        },
        "role": {
          "type": "string",
          "example": "EDITOR"
        },
        "updated_at": {
          "type": "string",
          "example": "2023-01-01T00:00:00Z"
        },
        "user_id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174003"
        }
      }
    },
    "participant.V1UpdateParticipantRoleRequest": {
      "type": "object",
      "required": [
        "role"
      ],
      "properties": {
        "role": {
          "type": "string",
          "enum": [
            "EDITOR",
            "VIEWER"
          ],
          "example": "EDITOR"
        }
      }
    },
    "profile.MeResponse": {
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2023-01-01T00:00:00Z"
        },
        "display_name": {
          "type": "string",
          "example": "John Doe"
        },
        "email": {
          "type": "string",
          "example": "john.doe@example.com"
        },
        "id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174003"
        },
        "plan_type": {
          "type": "string",
          "example": "FREE"
        },
        "workspace_id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174002"
        },
        "workspace_name": {
          "type": "string",
          "example": "Acme Corp"
        },
        "workspace_role": {
          "type": "string",
          "example": "WORKSPACE_MEMBER"
        }
      }
    },
    "rome_api_controllers_external_partner_user_shared.ListResponse-action_item_ActionItemResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of items for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/action_item.ActionItemResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 50
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "rome_api_controllers_external_partner_user_shared.ListResponse-agenda_item_AgendaItemResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of items for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/agenda_item.AgendaItemResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 50
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "rome_api_controllers_external_partner_user_shared.ListResponse-participant_V1ContactResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of items for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/participant.V1ContactResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 50
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "rome_api_controllers_external_partner_user_shared.ListResponse-participant_V1ParticipantResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of items for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/participant.V1ParticipantResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 50
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "rome_api_controllers_external_v1_oauth.DiscoveryDocument": {
      "type": "object",
      "properties": {
        "authorization_endpoint": {
          "type": "string"
        },
        "code_challenge_methods_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "grant_types_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "id_token_signing_alg_values_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "issuer": {
          "type": "string"
        },
        "jwks_uri": {
          "type": "string"
        },
        "response_types_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "revocation_endpoint": {
          "type": "string"
        },
        "scopes_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "subject_types_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "token_endpoint": {
          "type": "string"
        },
        "token_endpoint_auth_methods_supported": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "rome_api_controllers_external_v1_oauth.JWK": {
      "type": "object",
      "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"
        }
      }
    },
    "rome_api_controllers_external_v1_oauth.JWKSResponse": {
      "type": "object",
      "properties": {
        "keys": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/rome_api_controllers_external_v1_oauth.JWK"
          }
        }
      }
    },
    "rome_api_controllers_external_v1_oauth.TokenResponse": {
      "type": "object",
      "properties": {
        "access_token": {
          "type": "string",
          "example": "cto_at_v1_..."
        },
        "expires_in": {
          "type": "integer",
          "example": 3600
        },
        "refresh_token": {
          "type": "string",
          "example": "cto_rt_v1_..."
        },
        "scope": {
          "type": "string",
          "example": "meetings:read meetings:write action-items:read action-items:write calendar:read workspace:read workspace:write"
        },
        "token_type": {
          "type": "string",
          "example": "Bearer"
        }
      }
    },
    "rome_api_controllers_external_v1_shared.ListResponse-meeting_template_MeetingTemplateResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of items for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/meeting_template.MeetingTemplateResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 20
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "rome_api_controllers_external_v1_shared.ListResponse-shared_MeetingResponse": {
      "type": "object",
      "properties": {
        "items": {
          "description": "Array of items for the current page",
          "type": "array",
          "items": {
            "$ref": "#/definitions/shared.MeetingResponse"
          }
        },
        "limit": {
          "description": "Maximum number of items per page",
          "type": "integer",
          "example": 20
        },
        "offset": {
          "description": "Number of items skipped from the beginning",
          "type": "integer",
          "example": 0
        },
        "total": {
          "description": "Total number of items across all pages",
          "type": "integer",
          "example": 100
        }
      }
    },
    "shared.MeetingResponse": {
      "type": "object",
      "properties": {
        "calendar_event_id": {
          "description": "ID of the linked calendar event, if any",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174006"
        },
        "created_at": {
          "description": "Timestamp when the meeting was created",
          "type": "string",
          "example": "2023-01-01T00:00:00Z"
        },
        "created_by_user_id": {
          "description": "ID of the user who created the meeting",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174003"
        },
        "end_time": {
          "description": "Scheduled end time in RFC3339 format",
          "type": "string",
          "example": "2023-01-01T11:00:00-07:00"
        },
        "id": {
          "description": "Unique identifier for the meeting",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174000"
        },
        "owned_by_user_id": {
          "description": "ID of the user who owns the meeting",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174003"
        },
        "redirect_to_meeting_id": {
          "description": "ID of the meeting to redirect to if this meeting was merged",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174007"
        },
        "start_time": {
          "description": "Scheduled start time in RFC3339 format",
          "type": "string",
          "example": "2023-01-01T10:00:00-07:00"
        },
        "status": {
          "description": "Current status of the meeting",
          "type": "string",
          "enum": [
            "draft",
            "scheduled",
            "in_progress",
            "ended",
            "completed"
          ],
          "example": "completed"
        },
        "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.",
          "type": "string",
          "example": "Post-Meeting Summarization ..."
        },
        "title": {
          "description": "Title of the meeting",
          "type": "string",
          "example": "Weekly Team Sync"
        },
        "updated_at": {
          "description": "Timestamp when the meeting was last updated",
          "type": "string",
          "example": "2023-01-01T00:00:00Z"
        },
        "workspace_id": {
          "description": "ID of the workspace this meeting belongs to",
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174002"
        }
      }
    },
    "token.IntrospectResponse": {
      "type": "object",
      "properties": {
        "active": {
          "type": "boolean"
        },
        "auth_surface": {
          "type": "string"
        },
        "plan_type": {
          "type": "string"
        },
        "scopes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "token_type": {
          "type": "string"
        },
        "user_id": {
          "type": "string"
        },
        "workspace_id": {
          "type": "string"
        },
        "workspace_role": {
          "type": "string"
        }
      }
    },
    "token.ListTokensResponse": {
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/token.TokenResponse"
          }
        },
        "limit": {
          "type": "integer"
        },
        "offset": {
          "type": "integer"
        },
        "total": {
          "type": "integer"
        }
      }
    },
    "token.TokenResponse": {
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string"
        },
        "expires_at": {
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "last_used_at": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "prefix": {
          "type": "string"
        },
        "scopes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "webhook.CreateWebhookRequest": {
      "type": "object",
      "required": [
        "subscribed_events",
        "url"
      ],
      "properties": {
        "subscribed_events": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "url": {
          "type": "string"
        }
      }
    },
    "webhook.CreateWebhookResponse": {
      "type": "object",
      "properties": {
        "signing_secret": {
          "type": "string"
        },
        "verification_token": {
          "type": "string"
        },
        "webhook": {
          "$ref": "#/definitions/webhook.WebhookResponse"
        }
      }
    },
    "webhook.ListWebhooksResponse": {
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/webhook.WebhookResponse"
          }
        },
        "limit": {
          "type": "integer"
        },
        "offset": {
          "type": "integer"
        },
        "total": {
          "type": "integer"
        }
      }
    },
    "webhook.RotateSecretResponse": {
      "type": "object",
      "properties": {
        "signing_secret": {
          "type": "string"
        },
        "webhook": {
          "$ref": "#/definitions/webhook.WebhookResponse"
        }
      }
    },
    "webhook.WebhookResponse": {
      "type": "object",
      "properties": {
        "consecutive_failure_count": {
          "type": "integer"
        },
        "created_at": {
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "last_success_at": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "subscribed_events": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "updated_at": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "verified_at": {
          "type": "string"
        },
        "workspace_id": {
          "type": "string"
        }
      }
    },
    "workspace.ErrorResponse": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "error": {
          "type": "string"
        }
      }
    },
    "workspace.MemberResponse": {
      "description": "Workspace member returned by the /v1 API",
      "type": "object",
      "properties": {
        "deactivated_at": {
          "type": "string"
        },
        "email": {
          "type": "string",
          "example": "jane@acme.com"
        },
        "id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174002"
        },
        "is_deactivated": {
          "type": "boolean",
          "example": false
        },
        "is_pending": {
          "type": "boolean",
          "example": false
        },
        "name": {
          "type": "string",
          "example": "Jane Doe"
        },
        "role": {
          "type": "string",
          "example": "WORKSPACE_ADMIN"
        }
      }
    },
    "workspace.MembersListResponse": {
      "description": "Paginated list of workspace members",
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/workspace.MemberResponse"
          }
        },
        "limit": {
          "type": "integer",
          "example": 25
        },
        "offset": {
          "type": "integer",
          "example": 0
        },
        "total": {
          "type": "integer",
          "example": 42
        }
      }
    },
    "workspace.PatchWorkspaceBody": {
      "type": "object",
      "properties": {
        "company_size": {
          "type": "string",
          "example": "11-50"
        },
        "name": {
          "type": "string",
          "example": "Acme Corp"
        },
        "primary_industry_id": {
          "type": "string",
          "example": "industry-1"
        },
        "remove_external_participants_from_meetings": {
          "type": "boolean",
          "example": true
        }
      }
    },
    "workspace.UpdateMemberRoleRequest": {
      "type": "object",
      "required": [
        "role"
      ],
      "properties": {
        "role": {
          "type": "string",
          "example": "WORKSPACE_ADMIN"
        }
      }
    },
    "workspace.WorkspaceResponse": {
      "description": "Workspace settings returned by the /v1 API",
      "type": "object",
      "properties": {
        "created_at": {
          "type": "string",
          "example": "2024-01-01T00:00:00Z"
        },
        "id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174000"
        },
        "name": {
          "type": "string",
          "example": "Acme Corp"
        },
        "owner_id": {
          "type": "string",
          "example": "123e4567-e89b-12d3-a456-426614174001"
        },
        "plan_type": {
          "type": "string",
          "example": "PRO"
        },
        "updated_at": {
          "type": "string",
          "example": "2024-06-15T12:30:00Z"
        }
      }
    }
  },
  "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.",
      "type": "apiKey",
      "name": "Authorization",
      "in": "header"
    },
    "OAuth2Application": {
      "type": "oauth2",
      "flow": "accessCode",
      "authorizationUrl": "https://app.contio.ai/v1/oauth/authorize",
      "tokenUrl": "https://api.contio.ai/v1/oauth/token",
      "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"
      }
    }
  },
  "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"
      ]
    }
  ],
  "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."
    }
  ]
}
