SageOx Recordings API

Full lifecycle management for discussion recordings: chunked upload, transcription, speaker identification, AI-generated summaries, decisions, and action items. Recordings feed into the repository Ledger. Supports both audio upload and real-time recording sessions via Temporal workflows.

OpenAPI Specification

sageox-recordings-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: SageOx Admin Recordings API
  version: 1.0.0
  description: "# API Reference\n\n## Overview\n\nSageOx is a platform that captures team knowledge from discussions, decisions, and work context into a Ledger (per-repo historical record) and Team Context (team-wide shared knowledge). The SageOx API provides programmatic access to manage repositories, recordings, notifications, and team data with high performance and reliability.\n\n## Base URLs\n\n| Environment | URL |\n|---|---|\n| Local Development | `http://localhost:3000` |\n| Test | `https://test.sageox.ai` |\n| Production | `https://sageox.ai` |\n\n## Authentication\n\nAll requests to the SageOx API require authentication via JWT tokens issued by the Better Auth service.\n\nInclude your token in the `Authorization` header:\n```\nAuthorization: Bearer <token>\n```\n\n**Initial Auth Flow (CLI)**\n- CLI initiates device flow to obtain initial credentials\n- Exchange device code for JWT token\n- Store token securely for subsequent API requests\n- Refresh token when expired\n\n**Authenticated Endpoints**\n- Pass JWT in `Authorization: Bearer <token>` header\n- Tokens contain user identity and team membership\n- Invalid or expired tokens return 401 Unauthorized\n\n## Response Format\n\n### Success\nStandard response format with optional pagination metadata:\n```json\n{\n  \"success\": true,\n  \"data\": { ... }\n}\n```\n\n### Error\nAll errors follow a consistent format:\n```json\n{\n  \"success\": false,\n  \"error\": \"Human-readable error description\"\n}\n```\n\n**Status Codes**\n- `400` — Bad Request: Invalid parameters or malformed request\n- `401` — Unauthorized: Missing or invalid authentication token\n- `403` — Forbidden: Insufficient permissions for this resource\n- `404` — Not Found: Resource does not exist\n- `409` — Conflict: Request conflicts with current state (e.g., duplicate)\n- `429` — Rate Limited: Too many requests; retry with backoff\n- `500` — Internal Error: Server error; contact support if persistent\n\n## Pagination\n\nList endpoints support cursor-based pagination via query parameters:\n\n**Query Parameters**\n- `limit` — Number of results per page (default: 20, max: 100)\n- `offset` — Number of results to skip (default: 0)\n\n**Response Metadata**\nList responses include pagination info:\n```json\n{\n  \"success\": true,\n  \"data\": [ ... ],\n  \"meta\": {\n    \"total\": 150,\n    \"limit\": 20,\n    \"offset\": 0,\n    \"hasMore\": true\n  }\n}\n```\n\n## ID Formats\n\nResources use standardized ID formats for easy identification:\n\n| Resource | Format | Length | Example |\n|---|---|---|---|\n| Team | `team_<cuid2>` | 10 chars | `team_abc1234567` |\n| User | `usr_<cuid2>` | 10 chars | `usr_xyz9876543` |\n| Repository | `repo_<uuidv7>` | 36 chars | `repo_01934f5a-8b9c-7def-abcd-0123456789ab` |\n| Recording | `rec_<uuidv7>` | 36 chars | `rec_01934f5a-8b9c-7def-abcd-0123456789ab` |\n| Image | `img_<uuidv7>` | 36 chars | `img_01934f5a-8b9c-7def-abcd-0123456789ab` |\n| Notification | `notif_<cuid2>` | 14 chars | `notif_ab1cd2ef3g` |\n\nUse these IDs for all API operations. IDs are unique across environments.\n\n## Rate Limiting\n\nThe API applies rate limiting to protect against abuse and ensure fair access:\n\n**Authenticated Endpoints**\n- Limited per user: depends on subscription tier\n- Quota resets hourly\n\n**Unauthenticated Endpoints**\n- Limited per IP address\n- More restrictive than authenticated limits\n\nWhen rate limited, the API returns `429 Too Many Requests`. Retry requests with exponential backoff:\n```\nwait = min(2^attempt * 100ms, 10s)\n```\n\n## Timestamps\n\nAll timestamps in API responses use RFC 3339 / ISO 8601 format in UTC:\n```\n2025-12-03T10:30:00Z\n```\n\nUse this format when providing timestamps in requests as well. The API rejects timestamps in other formats.\n\n## SDKs & Tools\n\n- **OpenAPI Spec** — Full schema available at `/api/openapi.json`\n- **Postman Collection** — Import from `/api/postman.json` for interactive exploration\n- **CLI** — Use `ox` CLI for command-line access\n"
  contact:
    name: SageOx Team
  license:
    name: MIT
servers:
- url: http://localhost:3000
  description: Devcontainer
- url: https://test.sageox.ai
  description: Test
- url: https://sageox.ai
  description: Production
security:
- bearerAuth: []
tags:
- name: Recordings
  description: 'Full lifecycle management for discussion recordings: chunked upload, transcription, speaker identification, AI-generated summaries, decisions, and action items. Recordings feed into the repository Ledger. Supports both audio upload and real-time recording sessions via Temporal workflows.

    '
paths:
  /api/v1/repos/{repo_id}/recordings:
    post:
      operationId: startRecordingRepo
      summary: Start recording (repo-scoped)
      description: 'Initialize a new chunked recording for a repository. Returns presigned URL

        for uploading the first chunk.


        **Workflow:**

        1. POST to start recording → get recording_id and upload URL

        2. Upload audio chunks to presigned URL

        3. POST /chunks/prefetch to batch-fetch future chunk URLs

        4. POST /chunks/heartbeat after each chunk upload (optional)

        5. POST /complete to finalize and trigger processing


        **Status flow:** pending → uploading → processing → ready

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
          example: repo_01934f5a-8b9c-7def-b012-3456789abcde
        description: Repository identifier (repo_<uuidv7>)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - mime_type
              properties:
                title:
                  type: string
                  maxLength: 200
                  description: Optional display name for the recording
                  example: Architecture Review - Jan 2025
                mime_type:
                  type: string
                  description: Media type (audio/webm, video/mp4, audio/mp4, etc.)
                  example: audio/webm
                duration_hint:
                  type: integer
                  format: int64
                  description: Expected duration in seconds (for progress tracking)
                  example: 1800
                metadata:
                  type: object
                  description: Optional client-provided context
                  example:
                    topic: API design
                    participants: 2
      responses:
        '201':
          description: Recording initialized successfully
          content:
            application/json:
              schema:
                type: object
                required:
                - recording_id
                - upload
                - created_at
                properties:
                  recording_id:
                    type: string
                    description: Unique identifier for this recording (rec_<uuidv7>)
                    example: rec_01934f5a-8b9c-7def-b012-3456789abcde
                  upload:
                    type: object
                    required:
                    - upload_url
                    - expires_at
                    - chunk_index
                    - bucket
                    - s3_key
                    properties:
                      upload_url:
                        type: string
                        format: uri
                        description: Presigned PUT URL for direct S3 upload
                        example: https://s3.amazonaws.com/bucket/repos/repo_01934f5a/recordings/rec_01934f5a/chunk_1?...
                      fields:
                        type: object
                        additionalProperties:
                          type: string
                        description: Additional form fields for multipart uploads (if applicable)
                      expires_at:
                        type: string
                        format: date-time
                        description: When the presigned URL expires
                        example: '2025-01-30T20:22:00Z'
                      chunk_index:
                        type: integer
                        description: Zero-based chunk index
                        example: 1
                      bucket:
                        type: string
                        description: S3 bucket name
                        example: sageox-recordings-prod
                      s3_key:
                        type: string
                        description: Full S3 object key path
                        example: repos/repo_01934f5a/recordings/rec_01934f5a/chunk_1
                  created_at:
                    type: string
                    format: date-time
                    description: Timestamp when recording was initialized
                    example: '2025-01-30T14:22:00Z'
        '400':
          description: Invalid request (missing mime_type, invalid format, etc.)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                missing_mime_type:
                  value:
                    error: mime_type is required
                invalid_mime_type:
                  value:
                    error: invalid mime_type format
        '401':
          description: Unauthorized - authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden - no access to repository
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    get:
      operationId: listRecordingsRepo
      summary: List recordings (repo-scoped)
      description: 'Retrieve paginated list of recordings for a repository with optional filtering

        by status, media type, and timestamp range.

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
          example: repo_01934f5a-8b9c-7def-b012-3456789abcde
      - name: status
        in: query
        schema:
          type: string
          enum:
          - pending
          - uploading
          - processing
          - ready
          - failed
          - deleted
          example: ready
        description: Filter by recording status
      - name: mime_type
        in: query
        schema:
          type: string
          example: audio/
        description: Filter by MIME type prefix (e.g., 'audio/', 'video/')
      - name: timestamp_start
        in: query
        schema:
          type: string
          format: date-time
          example: '2025-01-01T00:00:00Z'
        description: Filter recordings created after this timestamp (RFC3339)
      - name: timestamp_end
        in: query
        schema:
          type: string
          format: date-time
          example: '2025-01-31T23:59:59Z'
        description: Filter recordings created before this timestamp (RFC3339)
      - name: limit
        in: query
        schema:
          type: integer
          default: 20
          minimum: 1
          maximum: 100
          example: 20
        description: Maximum number of recordings to return
      - name: offset
        in: query
        schema:
          type: integer
          default: 0
          minimum: 0
          example: 0
        description: Number of recordings to skip for pagination
      responses:
        '200':
          description: List of recordings retrieved successfully
          content:
            application/json:
              schema:
                type: object
                required:
                - recordings
                - pagination
                properties:
                  recordings:
                    type: array
                    items:
                      $ref: '#/paths/~1api~1v1~1repos~1%7Brepo_id%7D~1recordings~1%7Brec_id%7D/get/responses/200/content/application~1json/schema'
                  pagination:
                    type: object
                    required:
                    - total
                    - limit
                    - offset
                    properties:
                      total:
                        type: integer
                        example: 42
                      limit:
                        type: integer
                        example: 20
                      offset:
                        type: integer
                        example: 0
        '400':
          description: Invalid query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                invalid_timestamp:
                  value:
                    error: invalid timestamp_start format (expected RFC3339)
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/repos/{repo_id}/recordings/{rec_id}:
    get:
      operationId: getRecordingRepo
      summary: Get recording details (repo-scoped)
      description: 'Retrieve full recording details including metadata, status, processing steps,

        and URLs. Processing steps show the pipeline state (upload, transcribe, summarize, commit).

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          description: Recording identifier (rec_<uuidv7>)
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      responses:
        '200':
          description: Recording details retrieved
          content:
            application/json:
              schema:
                type: object
                required:
                - id
                - context_type
                - context_id
                - title
                - status
                - mime_type
                - size
                - chunk_count
                - created_by
                - created_at
                - updated_at
                properties:
                  id:
                    type: string
                    description: Recording identifier (rec_<uuidv7>)
                    example: rec_01934f5a-8b9c-7def-b012-3456789abcde
                  context_type:
                    type: string
                    enum:
                    - repo
                    - team
                    description: Recording scope type
                    example: repo
                  context_id:
                    type: string
                    description: Repository or team ID
                    example: repo_01934f5a-8b9c-7def-b012-3456789abcde
                  title:
                    type: string
                    description: Display name
                    example: Architecture Review - Jan 2025
                  status:
                    type: string
                    enum:
                    - pending
                    - uploading
                    - processing
                    - ready
                    - failed
                    - deleted
                    description: Current recording status
                    example: ready
                  mime_type:
                    type: string
                    description: Media type
                    example: audio/webm
                  duration:
                    type: number
                    format: double
                    nullable: true
                    description: Duration in seconds (null if not yet known)
                    example: 1847.5
                  size:
                    type: integer
                    format: int64
                    description: Total size in bytes
                    example: 3145728
                  chunk_count:
                    type: integer
                    description: Number of uploaded chunks
                    example: 12
                  playback_url:
                    type: string
                    description: URL for playback (empty if not ready)
                    example: https://sageox.ai/recordings/rec_01934f5a/play
                  thumbnail_url:
                    type: string
                    nullable: true
                    description: Thumbnail URL (if available)
                  metadata:
                    type: object
                    description: Client-provided and system metadata
                  processing_steps:
                    type: object
                    additionalProperties:
                      type: object
                      additionalProperties: true
                    description: Pipeline step states (upload, transcribe, summarize, commit)
                    example:
                      upload:
                        status: completed
                        started_at: '2025-01-30T14:22:00Z'
                        completed_at: '2025-01-30T14:45:30Z'
                      transcribe:
                        status: in-progress
                        started_at: '2025-01-30T14:45:30Z'
                      summarize:
                        status: pending
                      commit:
                        status: pending
                  created_by:
                    type: string
                    description: User ID of recording creator
                    example: usr_abc123xyz
                  created_by_name:
                    type: string
                    nullable: true
                    description: Display name of creator
                  created_by_email:
                    type: string
                    nullable: true
                    description: Email of creator
                  created_at:
                    type: string
                    format: date-time
                    example: '2025-01-30T14:22:00Z'
                  updated_at:
                    type: string
                    format: date-time
                    example: '2025-01-30T14:45:30Z'
                  completed_at:
                    type: string
                    format: date-time
                    nullable: true
                    description: When recording was finalized (null if not complete)
        '400':
          description: Invalid recording ID format
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Recording not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    patch:
      operationId: updateRecordingRepo
      summary: Update recording metadata (repo-scoped)
      description: 'Update recording title and/or metadata. Only specified fields are updated.

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  maxLength: 200
                  description: Updated display name
                  example: API Design Discussion - Updated
                metadata:
                  type: object
                  description: Additional context to merge with existing metadata
                  example:
                    speaker: Team Lead
                    resolved: true
      responses:
        '200':
          description: Recording updated successfully
          content:
            application/json:
              schema:
                $ref: '#/paths/~1api~1v1~1repos~1%7Brepo_id%7D~1recordings~1%7Brec_id%7D/get/responses/200/content/application~1json/schema'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Recording not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    delete:
      operationId: deleteRecordingRepo
      summary: Delete recording (repo-scoped)
      description: 'Soft-delete a recording. The recording is marked as deleted but retained for auditing.

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      responses:
        '204':
          description: Recording deleted successfully
        '400':
          description: Invalid recording ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Recording not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/repos/{repo_id}/recordings/{rec_id}/chunks:
    post:
      operationId: getChunkURLRepo
      summary: Get presigned URL for chunk upload (repo-scoped)
      description: 'Get a presigned URL for uploading a specific chunk. Use this to upload

        individual chunks sequentially, or use /chunks/prefetch for batch URLs.

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - chunk_index
              properties:
                chunk_index:
                  type: integer
                  minimum: 0
                  description: Zero-based chunk index
                  example: 1
                chunk_size:
                  type: integer
                  format: int64
                  description: Chunk size in bytes (optional, for validation)
                  example: 262144
      responses:
        '200':
          description: Presigned URL generated
          content:
            application/json:
              schema:
                type: object
                required:
                - upload
                properties:
                  upload:
                    $ref: '#/paths/~1api~1v1~1repos~1%7Brepo_id%7D~1recordings/post/responses/201/content/application~1json/schema/properties/upload'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Recording not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Recording not in uploading state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/repos/{repo_id}/recordings/{rec_id}/chunks/prefetch:
    post:
      operationId: prefetchChunkURLsRepo
      summary: Batch prefetch chunk upload URLs (repo-scoped)
      description: 'Generate multiple presigned URLs at once for continued recording during API downtime

        (deployments, hot-reload). Each URL expires after 6 hours.


        **Why this matters:**

        - During API restarts, the client has pre-fetched URLs and can continue recording

        - Recording doesn''t stall waiting for new presigned URLs

        - Workflow automatically heartbeats on prefetch to keep session alive

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - count
              properties:
                count:
                  type: integer
                  minimum: 1
                  maximum: 40
                  default: 20
                  description: Number of URLs to prefetch (clamped to 1-40)
                  example: 20
      responses:
        '200':
          description: URLs prefetched successfully
          content:
            application/json:
              schema:
                type: object
                required:
                - chunks
                properties:
                  chunks:
                    type: array
                    items:
                      $ref: '#/paths/~1api~1v1~1repos~1%7Brepo_id%7D~1recordings/post/responses/201/content/application~1json/schema/properties/upload'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Recording not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Recording not in uploading state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/repos/{repo_id}/recordings/{rec_id}/chunks/heartbeat:
    post:
      operationId: chunkHeartbeatRepo
      summary: Send chunk upload heartbeat (repo-scoped)
      description: 'Lightweight signal that a chunk was successfully uploaded to S3.

        Keeps the session workflow aware of recording activity without generating

        a new presigned URL. Fire-and-forget (no response body expected).

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - chunk_index
              properties:
                chunk_index:
                  type: integer
                  minimum: 0
                  description: Index of chunk that was uploaded
                  example: 5
      responses:
        '204':
          description: Heartbeat recorded
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/repos/{repo_id}/recordings/{rec_id}/pause:
    post:
      operationId: pauseRecordingRepo
      summary: Pause recording (repo-scoped)
      description: 'Signal to the session workflow that recording was paused. Resets the

        inactivity timer so the workflow doesn''t auto-complete during pause.

        '
      tags:
      - Recordings
      security:
      - BearerAuth: []
      parameters:
      - name: repo_id
        in: path
        required: true
        schema:
          type: string
          pattern: ^repo_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
      - name: rec_id
        in: path
        required: true
        schema:
          type: string
          example: rec_01934f5a-8b9c-7def-b012-3456789abcde
      responses:
        '204':
          description: Pause signal recorded
        '400':
          description: Invalid recording ID
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /api/v1/repos/{repo_id}/recordings/{rec_id}/resume:
    post:
      operationId: resumeRecordingRepo
      summary: Resume recording (repo-scoped)
      description: 'Signal to the sessio

# --- truncated at 32 KB (88 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/sageox/refs/heads/main/openapi/sageox-recordings-api-openapi.yml