openapi: "3.1.0"
info:
  title: SecondBrain API
  description: AI-powered knowledge base and team collaboration platform
  version: "1.0.0"
servers:
  - url: http://localhost:3000
    description: Development
  - url: https://app.secondbrain.ai
    description: Production

components:
  securitySchemes:
    cookieAuth:
      type: apiKey
      in: cookie
      name: session_token
    apiKey:
      type: http
      scheme: bearer

  schemas:
    Error:
      type: object
      properties:
        error: { type: string }
    User:
      type: object
      properties:
        id: { type: string }
        email: { type: string }
        displayName: { type: string }
    Team:
      type: object
      properties:
        id: { type: string }
        name: { type: string }
        plan: { type: string }
    Document:
      type: object
      properties:
        id: { type: string }
        teamId: { type: string }
        userId: { type: string }
        title: { type: string }
        fileType: { type: string }
        status: { type: string }
        createdAt: { type: string, format: date-time }
    ChatSession:
      type: object
      properties:
        id: { type: string }
        teamId: { type: string }
        userId: { type: string }
        title: { type: string }
        createdAt: { type: string, format: date-time }
    ChatMessage:
      type: object
      properties:
        id: { type: string }
        sessionId: { type: string }
        role: { type: string, enum: [user, assistant] }
        content: { type: string }
        sources: { type: array }
    Channel:
      type: object
      properties:
        id: { type: string }
        teamId: { type: string }
        name: { type: string }
        description: { type: string }
        type: { type: string, enum: [public, private] }
    Notification:
      type: object
      properties:
        id: { type: string }
        type: { type: string }
        title: { type: string }
        description: { type: string }
        read: { type: boolean }
        createdAt: { type: string, format: date-time }
    Invite:
      type: object
      properties:
        id: { type: string }
        teamId: { type: string }
        email: { type: string }
        role: { type: string }
        inviteUrl: { type: string }
        expiresAt: { type: string, format: date-time }

paths:
  # ─── AUTH ─────────────────────────────────────────
  /api/auth/login:
    post:
      tags: [Auth]
      summary: Authenticate user and create session
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [email, password]
              properties:
                email: { type: string, format: email, maxLength: 254 }
                password: { type: string, minLength: 1, maxLength: 128 }
      responses:
        "200":
          description: Login success
          headers:
            Set-Cookie: { description: session + session_token cookies }
          content:
            application/json:
              schema:
                type: object
                properties:
                  user: { $ref: "#/components/schemas/User" }
        "400": { description: Invalid request body }
        "401": { description: Invalid email or password }
        "429": { description: Too many requests }

  /api/auth/register:
    post:
      tags: [Auth]
      summary: Create a new user account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [email, password]
              properties:
                email: { type: string, format: email, maxLength: 254 }
                password: { type: string, minLength: 8, maxLength: 128 }
                displayName: { type: string, maxLength: 100 }
      responses:
        "200":
          description: Registration success
          headers:
            Set-Cookie: { description: session + session_token cookies }
          content:
            application/json:
              schema:
                type: object
                properties:
                  user: { $ref: "#/components/schemas/User" }
        "400": { description: Invalid input }
        "409": { description: Registration failed }
        "429": { description: Too many requests }

  /api/auth/csrf:
    get:
      tags: [Auth]
      summary: Get or generate a CSRF token
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  csrfToken: { type: string }

  /api/auth/2fa:
    get:
      tags: [Auth]
      summary: Get 2FA status
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  twoFa:
                    type: object
                    properties:
                      isEnabled: { type: boolean }
                      recoveryEmail: { type: string }
                      lastUsedAt: { type: string, nullable: true }
        "401": { description: Unauthorized }
    post:
      tags: [Auth]
      summary: Enable, disable, or regenerate 2FA codes
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [action]
              properties:
                action: { type: string, enum: [enable, disable, regenerate_codes] }
                recoveryEmail: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  backupCodes: { type: array, items: { type: string } }
        "400": { description: Invalid action }
        "401": { description: Unauthorized }

  /api/auth/sessions:
    get:
      tags: [Auth]
      summary: List active user sessions
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  sessions: { type: array, items: { type: object } }
    delete:
      tags: [Auth]
      summary: Revoke sessions
      parameters:
        - in: query
          name: sessionId
          schema: { type: string }
          description: Revoke specific session; omit to revoke all others
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  message: { type: string }

  # ─── API KEYS ─────────────────────────────────────────
  /api/api-keys:
    get:
      tags: [API Keys]
      summary: List API keys (hashes only, no raw keys)
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  apiKeys: { type: array }
    post:
      tags: [API Keys]
      summary: Create a new API key
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
                scopes: { type: array, items: { type: string }, default: ["read"] }
                rateLimit: { type: integer, default: 1000 }
                expiresInDays: { type: integer }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  apiKey:
                    type: object
                    properties:
                      key: { type: string, description: "Full key – shown only once" }
        "403": { description: Insufficient permissions }

  /api/api-keys/{id}:
    delete:
      tags: [API Keys]
      summary: Delete an API key
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
        "403": { description: Insufficient permissions }

  # ─── CHAT ─────────────────────────────────────────────
  /api/chat:
    post:
      tags: [Chat]
      summary: Send a message and get an AI streamed response
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [messages]
              properties:
                messages:
                  type: array
                  items:
                    type: object
                    properties:
                      role: { type: string, enum: [user, assistant] }
                      content: { type: string }
                sessionId: { type: string }
                personaId: { type: string }
      responses:
        "200":
          description: SSE stream of AI response + X-Sources header
          headers:
            X-Sources:
              schema: { type: string }
              description: JSON array of source references
        "400": { $ref: "#/components/responses/Error" }
        "503": { description: Search not configured }

  /api/chat/sessions:
    get:
      tags: [Chat]
      summary: List chat sessions
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  sessions:
                    type: array
                    items: { $ref: "#/components/schemas/ChatSession" }
    post:
      tags: [Chat]
      summary: Create a new chat session
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                title: { type: string, default: "New Chat" }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  session: { $ref: "#/components/schemas/ChatSession" }

  /api/chat/sessions/{id}:
    get:
      tags: [Chat]
      summary: Get messages in a session
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  messages:
                    type: array
                    items: { $ref: "#/components/schemas/ChatMessage" }
    patch:
      tags: [Chat]
      summary: Update session title
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [title]
              properties:
                title: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  session: { $ref: "#/components/schemas/ChatSession" }
    delete:
      tags: [Chat]
      summary: Delete a chat session
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/chat/sessions/{id}/messages:
    get:
      tags: [Chat]
      summary: Get messages for a session (alias)
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  messages:
                    type: array
                    items: { $ref: "#/components/schemas/ChatMessage" }
    post:
      tags: [Chat]
      summary: Save a message to a session
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [role, content]
              properties:
                role: { type: string, enum: [user, assistant] }
                content: { type: string }
                sources: { type: array }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  message: { $ref: "#/components/schemas/ChatMessage" }

  /api/chat/sessions/{id}/share:
    post:
      tags: [Chat]
      summary: Toggle chat session sharing
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                isPublic: { type: boolean }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  session: { $ref: "#/components/schemas/ChatSession" }
                  shareToken: { type: string, nullable: true }

  # ─── CHANNELS ─────────────────────────────────────────
  /api/channels:
    get:
      tags: [Channels]
      summary: List team channels
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  channels:
                    type: array
                    items: { $ref: "#/components/schemas/Channel" }
    post:
      tags: [Channels]
      summary: Create a channel
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
                description: { type: string }
                type: { type: string, enum: [public, private], default: public }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  channel: { $ref: "#/components/schemas/Channel" }

  /api/channels/{id}:
    get:
      tags: [Channels]
      summary: Get channel details
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  channel: { $ref: "#/components/schemas/Channel" }
    delete:
      tags: [Channels]
      summary: Delete a channel (admin only)
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/channels/{id}/messages:
    get:
      tags: [Channels]
      summary: Get channel messages
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  messages: { type: array }
    post:
      tags: [Channels]
      summary: Send a message to a channel
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [content]
              properties:
                content: { type: string }
                message_type: { type: string, default: text }
                reply_to: { type: string }
                mentions: { type: array, items: { type: string } }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  message: { type: object }

  /api/channels/{id}/typing:
    post:
      tags: [Channels]
      summary: Start typing indicator
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
    delete:
      tags: [Channels]
      summary: Stop typing indicator
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── DOCUMENTS ────────────────────────────────────────
  /api/documents:
    get:
      tags: [Documents]
      summary: List team documents
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  documents:
                    type: array
                    items: { $ref: "#/components/schemas/Document" }

  /api/documents/upload:
    post:
      tags: [Documents]
      summary: Upload a document (file + optional title)
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required: [file]
              properties:
                file: { type: string, format: binary }
                title: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  document: { $ref: "#/components/schemas/Document" }

  /api/documents/{id}:
    get:
      tags: [Documents]
      summary: Get a single document
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  document: { $ref: "#/components/schemas/Document" }
    delete:
      tags: [Documents]
      summary: Delete a document
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/documents/{id}/comments:
    get:
      tags: [Documents]
      summary: Get document comments
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  comments: { type: array }
    post:
      tags: [Documents]
      summary: Add a comment to a document
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [content]
              properties:
                content: { type: string }
                position_x: { type: number }
                position_y: { type: number }
                page_number: { type: integer }
                selection_text: { type: string }
                reply_to: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  comment: { type: object }

  /api/documents/{id}/related:
    get:
      tags: [Documents]
      summary: Find semantically related documents
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id: { type: string }
                    similarity_score: { type: number }
                    related_document: { type: object }

  /api/documents/{id}/summarize:
    get:
      tags: [Documents]
      summary: AI-generate a document summary
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  summary: { type: string }
                  key_points: { type: array, items: { type: string } }
                  word_count: { type: integer }
                  reading_time_minutes: { type: integer }

  # ─── FOLDERS ──────────────────────────────────────────
  /api/folders:
    get:
      tags: [Folders]
      summary: List team folders
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  folders: { type: array }
    post:
      tags: [Folders]
      summary: Create a folder
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
                description: { type: string }
                color: { type: string, default: "#3b82f6" }
                parentId: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  folder: { type: object }

  /api/folders/{id}:
    patch:
      tags: [Folders]
      summary: Update a folder
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name: { type: string }
                description: { type: string }
                color: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  folder: { type: object }
    delete:
      tags: [Folders]
      summary: Delete a folder
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── INTEGRATIONS ─────────────────────────────────────
  /api/integrations:
    get:
      tags: [Integrations]
      summary: List team integrations
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  integrations: { type: array }
    post:
      tags: [Integrations]
      summary: Create or update an integration
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [provider]
              properties:
                provider: { type: string }
                accessToken: { type: string }
                refreshToken: { type: string }
                accountEmail: { type: string }
                accountName: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  integration: { type: object }

  /api/integrations/notion:
    get:
      tags: [Integrations]
      summary: Redirect to Notion OAuth consent page
      responses:
        "302":
          description: Redirect to Notion OAuth URL
  /api/integrations/notion/callback:
    get:
      tags: [Integrations]
      summary: Handle Notion OAuth callback
      parameters:
        - in: query
          name: code
          schema: { type: string }
          required: true
        - in: query
          name: state
          schema: { type: string }
          required: true
      responses:
        "302": { description: Redirect to /settings/integrations with result }

  /api/integrations/google-drive:
    get:
      tags: [Integrations]
      summary: Redirect to Google Drive OAuth consent page
      responses:
        "302":
          description: Redirect to Google OAuth URL
  /api/integrations/google-drive/callback:
    get:
      tags: [Integrations]
      summary: Handle Google Drive OAuth callback
      parameters:
        - in: query
          name: code
          schema: { type: string }
          required: true
        - in: query
          name: state
          schema: { type: string }
          required: true
      responses:
        "302": { description: Redirect to /settings/integrations with result }

  /api/integrations/{provider}/disconnect:
    post:
      tags: [Integrations]
      summary: Disconnect an integration provider
      parameters:
        - in: path
          name: provider
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
  /api/integrations/{provider}/sync:
    post:
      tags: [Integrations]
      summary: Trigger a manual sync for a provider
      parameters:
        - in: path
          name: provider
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  syncedCount: { type: integer }

  # ─── NOTIFICATIONS ────────────────────────────────────
  /api/notifications:
    get:
      tags: [Notifications]
      summary: List notifications
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  notifications:
                    type: array
                    items: { $ref: "#/components/schemas/Notification" }
    post:
      tags: [Notifications]
      summary: Create a notification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [type, title]
              properties:
                type: { type: string }
                title: { type: string }
                description: { type: string }
                actionUrl: { type: string }
                targetUserId: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  notification: { $ref: "#/components/schemas/Notification" }

  /api/notifications/{id}:
    patch:
      tags: [Notifications]
      summary: Mark notification as read
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                read: { type: boolean }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  notification: { $ref: "#/components/schemas/Notification" }
    delete:
      tags: [Notifications]
      summary: Delete a notification
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/notifications/realtime:
    get:
      tags: [Notifications]
      summary: List realtime notifications
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  notifications: { type: array }

  /api/notifications/realtime/{id}/read:
    post:
      tags: [Notifications]
      summary: Mark realtime notification as read
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/notifications/realtime/mark-all-read:
    post:
      tags: [Notifications]
      summary: Mark all notifications as read
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── PERSONAS ─────────────────────────────────────────
  /api/personas:
    get:
      tags: [Personas]
      summary: List AI personas
      responses:
        "200":
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
    post:
      tags: [Personas]
      summary: Create an AI persona
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
                description: { type: string }
                system_prompt: { type: string }
                model: { type: string }
                temperature: { type: number }
                icon: { type: string }
                color: { type: string }
                is_default: { type: boolean }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object

  /api/personas/{id}:
    delete:
      tags: [Personas]
      summary: Delete an AI persona
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── PRESENCE ─────────────────────────────────────────
  /api/presence:
    get:
      tags: [Presence]
      summary: Get team online presence count
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  presence: { type: array }
                  online: { type: integer }
    post:
      tags: [Presence]
      summary: Update own presence status
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                status: { type: string, enum: [online, away, busy, offline], default: online }
                current_page: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── PUSH ─────────────────────────────────────────────
  /api/push/subscribe:
    post:
      tags: [Push]
      summary: Subscribe to push notifications
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [endpoint, keys]
              properties:
                endpoint: { type: string }
                keys:
                  type: object
                  properties:
                    p256dh: { type: string }
                    auth: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
    delete:
      tags: [Push]
      summary: Unsubscribe from push notifications
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                endpoint: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/push/send:
    post:
      tags: [Push]
      summary: Send push notification to a user (admin)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [userId, title, body]
              properties:
                userId: { type: string }
                title: { type: string }
                body: { type: string }
                url: { type: string }
                icon: { type: string }
                badge: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  sent: { type: integer }
                  failed: { type: integer }
        "400": { description: Missing required fields }
        "403": { description: Insufficient permissions }
    put:
      tags: [Push]
      summary: Broadcast push notification (admin)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [title, body]
              properties:
                title: { type: string }
                body: { type: string }
                url: { type: string }
                icon: { type: string }
                badge: { type: string }
                targetUsers: { type: array, items: { type: string } }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  sent: { type: integer }
                  failed: { type: integer }

  # ─── SEARCH ───────────────────────────────────────────
  /api/search:
    post:
      tags: [Search]
      summary: Semantic vector search across documents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [query]
              properties:
                query: { type: string }
                limit: { type: integer, default: 5 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id: { type: string }
                        content: { type: object }
                        metadata: { type: object }
                        score: { type: number }
        "503": { description: Search not configured }

  /api/search/advanced:
    post:
      tags: [Search]
      summary: Advanced search with filters and pagination
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                query: { type: string }
                filters:
                  type: object
                  properties:
                    fileTypes: { type: array, items: { type: string } }
                    tags: { type: array, items: { type: string } }
                    folders: { type: array, items: { type: string } }
                    dateFrom: { type: string, format: date-time }
                    dateTo: { type: string, format: date-time }
                    status: { type: array, items: { type: string } }
                limit: { type: integer, default: 20 }
                offset: { type: integer, default: 0 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  documents: { type: array }
                  total: { type: integer }
                  limit: { type: integer }
                  offset: { type: integer }

  # ─── SETTINGS ─────────────────────────────────────────
  /api/settings/profile:
    get:
      tags: [Settings]
      summary: Get user profile
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  profile: { type: object }
    put:
      tags: [Settings]
      summary: Update user profile
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                fullName: { type: string }
                avatarUrl: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  profile: { type: object }
    delete:
      tags: [Settings]
      summary: Delete user account
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/settings/data-retention:
    get:
      tags: [Settings]
      summary: Get data retention policy
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  retention: { type: object }
    put:
      tags: [Settings]
      summary: Update data retention policy
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                chatRetentionDays: { type: integer }
                documentRetentionDays: { type: integer }
                auditLogRetentionDays: { type: integer }
                autoDeleteEnabled: { type: boolean }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  retention: { type: object }
    post:
      tags: [Settings]
      summary: Run manual data cleanup
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  deleted:
                    type: object
                    properties:
                      chats: { type: integer }
                      documents: { type: integer }
                      auditLogs: { type: integer }

  /api/settings/retention:
    get:
      tags: [Settings]
      summary: Get retention policy (alias)
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  policy: { type: object }
    put:
      tags: [Settings]
      summary: Update retention policy (alias)
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                chatRetentionDays: { type: integer }
                documentRetentionDays: { type: integer }
                auditLogRetentionDays: { type: integer }
                autoDeleteEnabled: { type: boolean }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  policy: { type: object }
    post:
      tags: [Settings]
      summary: Run manual cleanup (alias)
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  deleted:
                    type: object
                    properties:
                      chats: { type: integer }
                      documents: { type: integer }
                      auditLogs: { type: integer }

  /api/settings/roles:
    get:
      tags: [Settings]
      summary: List custom roles and available permissions
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  roles: { type: array }
                  availablePermissions:
                    type: array
                    items: { type: string }
    post:
      tags: [Settings]
      summary: Create a custom role
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
                description: { type: string }
                permissions: { type: array, items: { type: string } }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  role: { type: object }
    put:
      tags: [Settings]
      summary: Update a role
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [id]
              properties:
                id: { type: string }
                name: { type: string }
                description: { type: string }
                permissions: { type: array, items: { type: string } }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  role: { type: object }
    delete:
      tags: [Settings]
      summary: Delete a role
      parameters:
        - in: query
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── STRIPE ──────────────────────────────────────────
  /api/stripe/checkout-session:
    post:
      tags: [Stripe]
      summary: Create a Stripe checkout session
      security:
        - apiKey: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                priceId: { type: string }
                planKey: { type: string, enum: [PRO, BUSINESS, ENTERPRISE] }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  sessionId: { type: string }
                  url: { type: string }

  /api/stripe/invoices:
    get:
      tags: [Stripe]
      summary: List invoices
      security:
        - apiKey: []
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  invoices: { type: array }

  /api/stripe/portal:
    post:
      tags: [Stripe]
      summary: Create Stripe billing portal session
      security:
        - apiKey: []
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  url: { type: string }

  /api/stripe/subscription:
    get:
      tags: [Stripe]
      summary: Get current subscription
      security:
        - apiKey: []
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  plan: { type: string }
                  status: { type: string }
                  currentPeriodStart: { type: string }
                  currentPeriodEnd: { type: string }
                  cancelAtPeriodEnd: { type: boolean }
    delete:
      tags: [Stripe]
      summary: Cancel subscription at period end
      security:
        - apiKey: []
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/stripe/webhooks:
    post:
      tags: [Stripe]
      summary: Handle Stripe webhook events
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  received: { type: boolean }

  # ─── TAGS ────────────────────────────────────────────
  /api/tags:
    get:
      tags: [Tags]
      summary: List team tags
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  tags: { type: array }
    post:
      tags: [Tags]
      summary: Create a tag
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
                color: { type: string, default: "#6366f1" }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  tag: { type: object }

  # ─── TEAMS ──────────────────────────────────────────
  /api/teams:
    post:
      tags: [Teams]
      summary: Create a new team
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name]
              properties:
                name: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  team: { $ref: "#/components/schemas/Team" }

  /api/teams/invites:
    get:
      tags: [Teams]
      summary: List team invites
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  invites:
                    type: array
                    items: { $ref: "#/components/schemas/Invite" }
    post:
      tags: [Teams]
      summary: Create a team invite
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                email: { type: string }
                role: { type: string, default: member }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  invite:
                    type: object
                    properties:
                      inviteUrl: { type: string }

  # ─── WEBHOOKS ───────────────────────────────────────
  /api/webhooks:
    get:
      tags: [Webhooks]
      summary: List webhooks
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  webhooks: { type: array }
    post:
      tags: [Webhooks]
      summary: Create a webhook
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [name, url, events]
              properties:
                name: { type: string }
                url: { type: string, format: uri }
                events: { type: array, items: { type: string } }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  webhook: { type: object }
        "403": { description: Insufficient permissions }

  /api/webhooks/{id}:
    delete:
      tags: [Webhooks]
      summary: Delete a webhook
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/webhooks/{id}/deliveries:
    get:
      tags: [Webhooks]
      summary: List webhook delivery attempts
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
        - in: query
          name: limit
          schema: { type: integer, default: 50 }
        - in: query
          name: offset
          schema: { type: integer, default: 0 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  deliveries: { type: array }
                  total: { type: integer }

  # ─── ANALYTICS ─────────────────────────────────────
  /api/analytics/usage:
    get:
      tags: [Analytics]
      summary: Get usage analytics
      parameters:
        - in: query
          name: timeRange
          schema: { type: string, enum: [7d, 30d, 90d, 1y], default: 30d }
        - in: query
          name: eventType
          schema: { type: string }
        - in: query
          name: groupBy
          schema: { type: string, enum: [hour, day, month], default: day }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  analytics: { type: array }
                  aggregatedData: { type: array }
                  summary: { type: object }
    post:
      tags: [Analytics]
      summary: Track a usage event
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [eventType]
              properties:
                eventType: { type: string }
                sessionId: { type: string }
                eventData: { type: object }
                metadata: { type: object }
                durationSeconds: { type: number }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/analytics/ai-performance:
    get:
      tags: [Analytics]
      summary: Get AI performance metrics
      parameters:
        - in: query
          name: timeRange
          schema: { type: string, enum: [7d, 30d, 90d], default: 30d }
        - in: query
          name: model
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  metrics: { type: array }
                  statistics: { type: object }
                  modelComparison: { type: array }
    post:
      tags: [Analytics]
      summary: Log AI interaction performance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [modelUsed, sessionId]
              properties:
                modelUsed: { type: string }
                sessionId: { type: string }
                promptTokens: { type: integer }
                completionTokens: { type: integer }
                responseTimeMs: { type: integer }
                responseQualityScore: { type: number }
                userFeedbackScore: { type: number }
                errorOccurred: { type: boolean }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/analytics/knowledge-base-health:
    get:
      tags: [Analytics]
      summary: Get knowledge base health data
      parameters:
        - in: query
          name: threshold
          schema: { type: number, default: 0.5 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  healthData: { type: array }
                  statistics: { type: object }
                  trends: { type: array }
                  recommendations: { type: array }
    post:
      tags: [Analytics]
      summary: Update knowledge base health
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [documentId]
              properties:
                documentId: { type: string }
                healthScore: { type: number }
                issues: { type: array }
                reviewFrequencyDays: { type: integer }
                accessCount: { type: integer }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/analytics/productivity:
    get:
      tags: [Analytics]
      summary: Get productivity metrics
      parameters:
        - in: query
          name: timeRange
          schema: { type: string, enum: [7d, 30d, 90d, 1y], default: 30d }
        - in: query
          name: metricType
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  metrics: { type: array }
                  roiMetrics: { type: object }
                  trends: { type: array }
                  insights: { type: array }
    post:
      tags: [Analytics]
      summary: Track a productivity metric
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [metricType, metricValue, timePeriodStart, timePeriodEnd]
              properties:
                metricType: { type: string }
                metricValue: { type: number }
                metricUnit: { type: string }
                baselineValue: { type: number }
                timePeriodStart: { type: string }
                timePeriodEnd: { type: string }
                contextData: { type: object }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/analytics/predictive:
    get:
      tags: [Analytics]
      summary: Get predictive insights
      parameters:
        - in: query
          name: type
          schema: { type: string }
        - in: query
          name: limit
          schema: { type: integer, default: 10 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  insights: { type: array }
                  categorizedInsights: { type: object }
    post:
      tags: [Analytics]
      summary: Apply or dismiss a predictive insight
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [id, action]
              properties:
                id: { type: string }
                action: { type: string, enum: [apply, dismiss] }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  # ─── SECURITY ─────────────────────────────────────
  /api/security/access-control:
    get:
      tags: [Security]
      summary: List access policies (admin)
      parameters:
        - in: query
          name: resourceType
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  policies: { type: array }
    post:
      tags: [Security]
      summary: Create access policy or check access
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  description: Create policy
                  properties:
                    name: { type: string }
                    resourceType: { type: string }
                    actions: { type: array, items: { type: string } }
                    conditions: { type: object }
                    effect: { type: string, enum: [allow, deny] }
                - type: object
                  description: Check access
                  properties:
                    userId: { type: string }
                    resourceId: { type: string }
                    resourceType: { type: string }
                    action: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      policy: { type: object }
                  - type: object
                    properties:
                      allowed: { type: boolean }
                      reason: { type: string }
    put:
      tags: [Security]
      summary: Update an access policy (admin)
      parameters:
        - in: query
          name: policyId
          schema: { type: string }
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name: { type: string }
                resourceType: { type: string }
                actions: { type: array, items: { type: string } }
                effect: { type: string, enum: [allow, deny] }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  policy: { type: object }
    delete:
      tags: [Security]
      summary: Delete an access policy (admin)
      parameters:
        - in: query
          name: policyId
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/security/audit:
    get:
      tags: [Security]
      summary: Query audit logs (admin)
      parameters:
        - in: query
          name: startDate
          schema: { type: string, format: date-time }
        - in: query
          name: endDate
          schema: { type: string, format: date-time }
        - in: query
          name: userId
          schema: { type: string }
        - in: query
          name: action
          schema: { type: string }
        - in: query
          name: resourceType
          schema: { type: string }
        - in: query
          name: limit
          schema: { type: integer, default: 100, maximum: 1000 }
        - in: query
          name: offset
          schema: { type: integer, default: 0 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  auditLogs: { type: array }
                  total: { type: integer }
    post:
      tags: [Security]
      summary: Generate compliance report (admin)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [reportType, period]
              properties:
                reportType: { type: string, enum: [access, data_processing, security_incidents, user_activity] }
                period: { type: string, enum: [daily, weekly, monthly, quarterly] }
                teamId: { type: string }
                format: { type: string, enum: [json, csv, pdf], default: json }
      responses:
        "200":
          description: Report file (JSON, CSV, or PDF based on format)

  /api/security/dashboard/metrics:
    get:
      tags: [Security]
      summary: Get security dashboard metrics (admin)
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  metrics:
                    type: object
                    properties:
                      overallScore: { type: number }
                      threats: { type: object }
                      compliance: { type: object }
                      access: { type: object }
                      audit: { type: object }

  /api/security/data-residency:
    get:
      tags: [Security]
      summary: Get data residency info
      parameters:
        - in: query
          name: action
          schema: { type: string, enum: [policies, requests] }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
    post:
      tags: [Security]
      summary: Create data request or residency policy
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                requestType: { type: string, enum: [access, rectification, erasure, portability, restriction] }
                userId: { type: string }
                reason: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
    put:
      tags: [Security]
      summary: Update data request status (admin)
      parameters:
        - in: query
          name: requestId
          schema: { type: string }
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                status: { type: string }
                response: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
    delete:
      tags: [Security]
      summary: Execute data erasure (admin)
      parameters:
        - in: query
          name: requestId
          required: true
          schema: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/security/sso:
    get:
      tags: [Security]
      summary: List SSO configurations
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  ssoProviders: { type: array }
    post:
      tags: [Security]
      summary: Create SSO provider config
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [provider, providerName, config]
              properties:
                provider: { type: string, enum: [saml, oauth, oidc] }
                providerName: { type: string }
                config: { type: object }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  ssoConfig: { type: object }

  /api/security/threat-detection:
    get:
      tags: [Security]
      summary: List security events (admin)
      parameters:
        - in: query
          name: startDate
          schema: { type: string }
        - in: query
          name: endDate
          schema: { type: string }
        - in: query
          name: threatLevel
          schema: { type: string, enum: [low, medium, high, critical] }
        - in: query
          name: eventType
          schema: { type: string }
        - in: query
          name: limit
          schema: { type: integer, default: 100, maximum: 1000 }
        - in: query
          name: offset
          schema: { type: integer, default: 0 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  events: { type: array }
                  summary: { type: object }
    post:
      tags: [Security]
      summary: Log a security event
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [eventType, userId]
              properties:
                eventType: { type: string }
                userId: { type: string }
                ipAddress: { type: string }
                userAgent: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  event: { type: object }
                  analysis: { type: object }
    patch:
      tags: [Security]
      summary: Resolve a security event (admin)
      parameters:
        - in: query
          name: eventId
          required: true
          schema: { type: string }
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                status: { type: string }
                notes: { type: string }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  event: { type: object }

  # ─── MOBILE ────────────────────────────────────────
  /api/mobile/analytics:
    get:
      tags: [Mobile]
      summary: Get mobile analytics (auth required)
      parameters:
        - in: query
          name: days
          schema: { type: integer, default: 30 }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  analytics: { type: array }
                  summary: { type: object }
    post:
      tags: [Mobile]
      summary: Track mobile analytics event
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [event_type]
              properties:
                event_type: { type: string }
                session_id: { type: string }
                device_id: { type: string }
                event_data: { type: object }
                performance_metrics: { type: object }
                network_type: { type: string }
                battery_level: { type: number }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }

  /api/mobile/sync:
    get:
      tags: [Mobile]
      summary: Get documents for offline sync
      parameters:
        - in: query
          name: device_id
          required: true
          schema: { type: string }
        - in: query
          name: last_sync
          schema: { type: string, format: date-time }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  documents: { type: array }
                  pendingSync: { type: object, nullable: true }
                  serverTime: { type: string }
    post:
      tags: [Mobile]
      summary: Push offline-created documents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [device_id, documents]
              properties:
                device_id: { type: string }
                documents: { type: array }
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
                properties:
                  success: { type: boolean }
                  syncedDocuments: { type: array }

  # ─── AI ────────────────────────────────────────
  /api/ai/hybrid-search:
    post:
      tags: [AI]
      summary: Hybrid search across documents
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/insights:
    post:
      tags: [AI]
      summary: Generate AI insights
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/image-analysis:
    post:
      tags: [AI]
      summary: Analyze an image
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/language-detect:
    post:
      tags: [AI]
      summary: Detect language of text
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/speech-to-text:
    post:
      tags: [AI]
      summary: Transcribe speech to text
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/text-to-speech:
    post:
      tags: [AI]
      summary: Convert text to speech
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/translate:
    post:
      tags: [AI]
      summary: Translate text
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
  /api/ai/fine-tune:
    post:
      tags: [AI]
      summary: Fine-tune an AI model
      responses:
        "200":
          content:
            application/json:
              schema:
                type: object
