openapi: 3.0.3
info:
  title: Fascia Platform API
  description: Spec Registry and Platform management API
  version: 0.1.0
components:
  schemas: {}
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT access token from auth.login or auth.register
paths:
  /health:
    get:
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  version:
                    type: string
      operationId: getHealth
      tags:
        - Health
      summary: Health check
  /health/live:
    get:
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
      operationId: getHealthLive
      tags:
        - Health
      summary: Liveness probe
  /health/ready:
    get:
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  checks:
                    type: object
                    additionalProperties: true
                additionalProperties: true
        '503':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  checks:
                    type: object
                    additionalProperties: true
                additionalProperties: true
      operationId: getHealthReady
      tags:
        - Health
      summary: Readiness probe
  /api/v1/specs/{type}:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - version
                - description
              additionalProperties: true
      parameters:
        - schema:
            type: string
          in: path
          name: type
          required: true
      responses:
        '201':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  workspace_id:
                    type: string
                  type:
                    type: string
                  name:
                    type: string
                  version:
                    type: integer
                  content:
                    type: object
                    additionalProperties: true
                  risk_level:
                    type:
                      - 'null'
                      - string
                  created_at:
                    type: string
                  created_by:
                    type:
                      - 'null'
                      - string
                  deleted_at:
                    type:
                      - 'null'
                      - string
      operationId: postSpecsBytype
      tags:
        - Specs
      summary: Create Specs Bytype
    get:
      parameters:
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          in: query
          name: limit
          required: false
        - schema:
            type: integer
            minimum: 0
            default: 0
          in: query
          name: offset
          required: false
        - schema:
            type: string
          in: path
          name: type
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  specs:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        workspace_id:
                          type: string
                        type:
                          type: string
                        name:
                          type: string
                        version:
                          type: integer
                        content:
                          type: object
                          additionalProperties: true
                        risk_level:
                          type:
                            - 'null'
                            - string
                        created_at:
                          type: string
                        created_by:
                          type:
                            - 'null'
                            - string
                        deleted_at:
                          type:
                            - 'null'
                            - string
                  total:
                    type: integer
                  limit:
                    type: integer
                  offset:
                    type: integer
      operationId: getSpecsBytype
      tags:
        - Specs
      summary: Get Specs Bytype
  /api/v1/specs/{type}/{name}:
    get:
      parameters:
        - schema:
            type: string
          in: path
          name: type
          required: true
        - schema:
            type: string
          in: path
          name: name
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  workspace_id:
                    type: string
                  type:
                    type: string
                  name:
                    type: string
                  version:
                    type: integer
                  content:
                    type: object
                    additionalProperties: true
                  risk_level:
                    type:
                      - 'null'
                      - string
                  created_at:
                    type: string
                  created_by:
                    type:
                      - 'null'
                      - string
                  deleted_at:
                    type:
                      - 'null'
                      - string
      operationId: getSpecsBytypeByname
      tags:
        - Specs
      summary: Get Specs Bytype Byname
    put:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - description
              additionalProperties: true
      parameters:
        - schema:
            type: string
          in: path
          name: type
          required: true
        - schema:
            type: string
          in: path
          name: name
          required: true
      responses:
        '201':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  workspace_id:
                    type: string
                  type:
                    type: string
                  name:
                    type: string
                  version:
                    type: integer
                  content:
                    type: object
                    additionalProperties: true
                  risk_level:
                    type:
                      - 'null'
                      - string
                  created_at:
                    type: string
                  created_by:
                    type:
                      - 'null'
                      - string
                  deleted_at:
                    type:
                      - 'null'
                      - string
      operationId: putSpecsBytypeByname
      tags:
        - Specs
      summary: Update Specs Bytype Byname
    delete:
      parameters:
        - schema:
            type: string
          in: path
          name: type
          required: true
        - schema:
            type: string
          in: path
          name: name
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  deletedVersions:
                    type: integer
      operationId: deleteSpecsBytypeByname
      tags:
        - Specs
      summary: Delete Specs Bytype Byname
  /api/v1/specs/{type}/{name}/versions:
    get:
      parameters:
        - schema:
            type: string
          in: path
          name: type
          required: true
        - schema:
            type: string
          in: path
          name: name
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  versions:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        workspace_id:
                          type: string
                        type:
                          type: string
                        name:
                          type: string
                        version:
                          type: integer
                        content:
                          type: object
                          additionalProperties: true
                        risk_level:
                          type:
                            - 'null'
                            - string
                        created_at:
                          type: string
                        created_by:
                          type:
                            - 'null'
                            - string
                        deleted_at:
                          type:
                            - 'null'
                            - string
      operationId: getSpecsBytypeBynameVersions
      tags:
        - Specs
      summary: Get Specs Bytype Byname Versions
  /api/v1/specs/{type}/{name}/versions/{version}:
    get:
      parameters:
        - schema:
            type: string
          in: path
          name: type
          required: true
        - schema:
            type: string
          in: path
          name: name
          required: true
        - schema:
            type: string
          in: path
          name: version
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  workspace_id:
                    type: string
                  type:
                    type: string
                  name:
                    type: string
                  version:
                    type: integer
                  content:
                    type: object
                    additionalProperties: true
                  risk_level:
                    type:
                      - 'null'
                      - string
                  created_at:
                    type: string
                  created_by:
                    type:
                      - 'null'
                      - string
                  deleted_at:
                    type:
                      - 'null'
                      - string
      operationId: getSpecsBytypeBynameVersionsByversion
      tags:
        - Specs
      summary: Get Specs Bytype Byname Versions Byversion
  /api/v1/bundle:
    get:
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  entities:
                    type: object
                    additionalProperties: true
                  tools:
                    type: object
                    additionalProperties: true
                  policies:
                    type: object
                    additionalProperties: true
                  manifest:
                    type: object
                    properties:
                      version:
                        type: string
                      schemaVersion:
                        type: string
                      workspaceId:
                        type: string
      operationId: getBundle
      tags:
        - Bundle
      summary: Get spec bundle for executor
  /api/v1/audit-logs:
    get:
      parameters:
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          in: query
          name: limit
          required: false
        - schema:
            type: integer
            minimum: 0
            default: 0
          in: query
          name: offset
          required: false
        - schema:
            type: string
          in: query
          name: userId
          required: false
        - schema:
            type: string
          in: query
          name: entityType
          required: false
        - schema:
            type: string
          in: query
          name: entityId
          required: false
        - schema:
            type: string
          in: query
          name: operation
          required: false
        - schema:
            type: string
            format: date-time
          in: query
          name: from
          required: false
        - schema:
            type: string
            format: date-time
          in: query
          name: to
          required: false
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  logs:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        workspace_id:
                          type: string
                        user_id:
                          type:
                            - 'null'
                            - string
                        user_email:
                          type:
                            - 'null'
                            - string
                        operation:
                          type: string
                        entity_type:
                          type: string
                        entity_id:
                          type:
                            - 'null'
                            - string
                        entity_name:
                          type:
                            - 'null'
                            - string
                        changes:
                          type:
                            - 'null'
                            - object
                          additionalProperties: true
                        ip_address:
                          type:
                            - 'null'
                            - string
                        user_agent:
                          type:
                            - 'null'
                            - string
                        created_at:
                          type: string
                  total:
                    type: integer
                  limit:
                    type: integer
                  offset:
                    type: integer
      operationId: getAudit-logs
      tags:
        - Audit
      summary: Query audit logs
  /api/v1/risk/analyze:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - version
                - description
                - trigger
                - input
                - output
                - flow
              properties:
                name:
                  type: string
                version:
                  type: integer
                description:
                  type: string
                trigger:
                  type: object
                  additionalProperties: true
                input:
                  type: object
                  additionalProperties: true
                output:
                  type: object
                  additionalProperties: true
                flow:
                  type: object
                  required:
                    - nodes
                    - edges
                    - startNode
                  properties:
                    nodes:
                      type: object
                      additionalProperties: true
                    edges:
                      type: array
                    startNode:
                      type: string
                  additionalProperties: true
                policies:
                  type: array
                  items:
                    type: string
                auth:
                  type: object
                  additionalProperties: true
                idempotencyKey:
                  type: string
                compensation:
                  type: object
                  additionalProperties: true
                concurrencyStrategy:
                  type: string
              additionalProperties: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  riskLevel:
                    type: string
                    enum:
                      - green
                      - yellow
                      - red
                  signals:
                    type: array
                    items:
                      type: object
                      properties:
                        rule:
                          type: string
                        level:
                          type: string
                        message:
                          type: string
                        nodeIds:
                          type: array
                          items:
                            type: string
                  suggestions:
                    type: array
                    items:
                      type: object
                      properties:
                        rule:
                          type: string
                        description:
                          type: string
      operationId: postRiskAnalyze
      tags:
        - Risk
      summary: Analyze tool risk level
  /api/v1/deploy:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - environment
              properties:
                environment:
                  type: string
                  enum:
                    - development
                    - production
      responses:
        '202':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: postDeploy
      tags:
        - Deploy
      summary: Create Deploy
  /api/v1/deploy/{id}/status:
    get:
      parameters:
        - schema:
            type: string
            format: uuid
          in: path
          name: id
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: getDeployByidStatus
      tags:
        - Deploy
      summary: Get Deploy Byid Status
  /api/v1/deploy/{id}/rollback:
    post:
      parameters:
        - schema:
            type: string
            format: uuid
          in: path
          name: id
          required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: postDeployByidRollback
      tags:
        - Deploy
      summary: Rollback a deployment
  /api/v1/deploy/history:
    get:
      parameters:
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          in: query
          name: limit
          required: false
        - schema:
            type: integer
            minimum: 0
            default: 0
          in: query
          name: offset
          required: false
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: getDeployHistory
      tags:
        - Deploy
      summary: List deployment history
  /api/v1/workspace/gcp:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - gcpProjectId
                - serviceAccountKey
              properties:
                gcpProjectId:
                  type: string
                  minLength: 1
                region:
                  type: string
                  default: us-central1
                serviceAccountKey:
                  type: object
                  additionalProperties: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: postWorkspaceGcp
      tags:
        - Workspace
      summary: Create Workspace Gcp
    delete:
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: deleteWorkspaceGcp
      tags:
        - Workspace
      summary: Delete Workspace Gcp
  /api/v1/workspace/gcp/status:
    get:
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '404':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      operationId: getWorkspaceGcpStatus
      tags:
        - Workspace
      summary: Check GCP connection status
  /api/v1/safety/generate:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - description
                - target
              properties:
                description:
                  type: string
                  minLength: 1
                  maxLength: 2000
                target:
                  type: string
                  enum:
                    - entity
                    - tool
                context:
                  type: object
                  properties:
                    existingEntities:
                      type: array
                      items:
                        type: string
                    existingTools:
                      type: array
                      items:
                        type: string
                  additionalProperties: false
              additionalProperties: false
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  spec:
                    type: object
                    additionalProperties: true
                  crossCheck:
                    type: object
                    additionalProperties: true
                  riskAnalysis:
                    type:
                      - 'null'
                      - object
                    additionalProperties: true
                  testCases:
                    type: array
      operationId: postSafetyGenerate
      tags:
        - Safety
      summary: Generate safety test cases
  /api/v1/safety/review:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - specType
                - spec
              properties:
                specType:
                  type: string
                  enum:
                    - entity
                    - tool
                spec:
                  type: object
                  additionalProperties: true
                context:
                  type: string
              additionalProperties: false
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  crossCheck:
                    type: object
                    additionalProperties: true
                  riskAnalysis:
                    type:
                      - 'null'
                      - object
                    additionalProperties: true
                  testCases:
                    type: array
      operationId: postSafetyReview
      tags:
        - Safety
      summary: Review tool spec safety
  /api/v1/safety/analyze:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - specType
                - spec
              properties:
                specType:
                  type: string
                  enum:
                    - entity
                    - tool
                spec:
                  type: object
                  additionalProperties: true
              additionalProperties: false
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  riskAnalysis:
                    type:
                      - 'null'
                      - object
                    additionalProperties: true
                  crossCheck:
                    type: object
                    additionalProperties: true
                  testCases:
                    type: array
                  overallVerdict:
                    type: string
                    enum:
                      - safe
                      - warnings
                      - unsafe
      operationId: postSafetyAnalyze
      tags:
        - Safety
      summary: Full safety analysis
servers:
  - url: http://localhost:3001
    description: Local development
tags:
  - name: Health
    description: Health check and readiness endpoints
  - name: Specs
    description: Spec Registry CRUD — Entity, Tool, Policy specs
  - name: Bundle
    description: Spec bundle for executor runtime
  - name: Audit
    description: Audit log queries
  - name: Risk
    description: Risk Engine analysis
  - name: Safety
    description: Safety Agent — AI-powered spec analysis
  - name: Deploy
    description: Deployment management
  - name: Workspace
    description: Workspace GCP configuration
