openapi: 3.0.3
info:
  title: SOC Demo Flask API
  version: 1.0.0
  description: OpenAPI-first Flask service for Shuffle testing.
servers:
  - url: http://localhost:8000
paths:
  /health:
    get:
      operationId: app.handlers.health_check
      summary: Health check
      responses:
        "200":
          description: Service is healthy
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HealthResponse"
  /echo:
    post:
      operationId: app.handlers.echo_body
      summary: Echo request body
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EchoRequest"
      responses:
        "200":
          description: Echo response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EchoResponse"
  /ioc/{value}:
    get:
      operationId: app.handlers.lookup_ioc
      summary: Basic IOC classification demo
      parameters:
        - name: value
          in: path
          required: true
          schema:
            type: string
        - name: ioc_type
          in: query
          required: false
          schema:
            type: string
            default: auto
      responses:
        "200":
          description: IOC lookup result
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LookupResponse"
components:
  schemas:
    HealthResponse:
      type: object
      properties:
        status:
          type: string
          example: ok
        timestamp:
          type: string
          format: date-time
      required:
        - status
        - timestamp
    EchoRequest:
      type: object
      additionalProperties: true
      example:
        message: test from Shuffle
    EchoResponse:
      type: object
      properties:
        received:
          type: object
          additionalProperties: true
        length:
          type: integer
      required:
        - received
        - length
    LookupResponse:
      type: object
      properties:
        input:
          type: string
        type:
          type: string
        verdict:
          type: string
          example: domain-like
        source:
          type: string
      required:
        - input
        - type
        - verdict
        - source
