# AUTO-GENERATED tier-A mirror spec — do not edit.
# Source: openapi/runtime/embeddings.yaml (runtime 0.71.2)
#  + policy: openapi/mirror-policies/embeddings.json
# Regenerate: node scripts/generate-mirror-specs.mjs
openapi: 3.0.3
info:
  title: naturali.ai — Embeddings API
  version: 1.0.0
  description: >-
    Embeddings: turn text into vectors with one of the project's configured providers — the same
    computation ingestion and knowledge search run internally, exposed so a caller can index or
    compare text of its own. A fully runtime-backed module — this spec is generated verbatim from
    the runtime's own, re-rooted under /v1/projects/{project_id}. The project in the path is
    authorized by naturali and enforced upstream by the project's scoped credential.


    This module mirrors the upstream runtime verbatim (tier A, #304): paths are the runtime's own
    re-rooted under /v1/projects/{project_id}, and every field, method, status code and error shape
    passes through unchanged. Errors raised by the runtime arrive in its envelope; errors raised by
    naturali itself (authentication, project resolution, an unreachable runtime) use naturali's.
  contact:
    name: naturali.ai
    url: https://naturali.ai
servers:
  - url: "{baseUrl}"
    description: Host of your naturali.ai deployment; every path carries the /v1 prefix.
    variables:
      baseUrl:
        description: Base host URL.
        default: https://api.naturali.ai
tags:
  - name: Embeddings
    description: Generate text embeddings
security:
  - bearerAuth: []
  - oauth2:
      - mcp:access
paths:
  /v1/projects/{project_id}/embeddings:
    post:
      tags:
        - Embeddings
      summary: Create embeddings
      description: >
        Generates embedding vectors for one or more text inputs using the server's configured
        embedding model.

        Provide `input` for a single text or `inputs` for a batch. At least one is required.

        Returns `embedding` when `input` is used, and `embeddings` when `inputs` is used.


        `project_id` names the project the call's token usage is metered against, so

        embedding spend reaches the usage rollup and the project's `cost_usd` / `tokens`

        quotas. A project-scoped credential supplies its own project; a call that names

        none and is bound to none is served but not metered.
      operationId: createEmbeddings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  type: string
                  description: Single text to embed.
                  example: The quick brown fox jumps over the lazy dog.
                inputs:
                  type: array
                  description: Batch of texts to embed. At most 256 per request — each input is one call to the
                    embedding model, so a larger batch is refused (`VALIDATION_FAILED`) rather than
                    queued. Split it across requests.
                  maxItems: 256
                  items:
                    type: string
                  example:
                    - The quick brown fox.
                    - Pack my box with five dozen liquor jugs.
      responses:
        "200":
          description: Embeddings generated successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EmbeddingsResponse"
        "400":
          description: Invalid request body
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "403":
          description: The caller cannot write to the named `project_id`
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "503":
          description: Embedding service not configured
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
    parameters:
      - $ref: "#/components/parameters/ProjectId"
components:
  schemas:
    EmbeddingsResponse:
      type: object
      description: Response containing generated embeddings. Fields present depend on whether `input` or
        `inputs` was provided.
      properties:
        embedding:
          type: array
          description: Embedding vector for the single `input` text.
          items:
            type: number
          example:
            - 0.123
            - -0.456
            - 0.789
        embeddings:
          type: array
          description: Embedding vectors for each item in the `inputs` batch.
          items:
            type: array
            items:
              type: number
          example:
            - - 0.123
              - -0.456
              - 0.789
            - - 0.321
              - -0.654
              - 0.987
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          description: Structured error. Every error response uses this shape, so `code` can be read without
            first checking the type of `error`.
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: "Machine-readable error code: lower_snake for an error naturali raises
                (`access_denied`), UPPER_SNAKE for one the runtime reports (`RESOURCE_NOT_FOUND`)."
              example: access_denied
            message:
              type: string
              description: Human-readable explanation.
              example: Your role in this project does not carry this action.
            details:
              type: object
              additionalProperties: true
              description: Structured context for an error naturali raises, such as the `resource` and `limit` of
                a `plan_limit_reached`.
            meta:
              type: object
              description: Structured context for an error the runtime reports.
  parameters:
    ProjectId:
      name: project_id
      in: path
      required: true
      description: Project public ID (proj_ prefix).
      schema:
        type: string
        example: proj_V1StGXR8Z5jdHi6B
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: A naturali API key (nat_sk_…) or a session JWT.
    oauth2:
      type: oauth2
      description: "A connected app's OAuth access token, issued by this API's authorization server
        (discovery: /.well-known/oauth-authorization-server). Its one scope carries every operation,
        confined to the projects the user chose when approving the app."
      flows:
        authorizationCode:
          authorizationUrl: https://api.naturali.ai/authorize
          tokenUrl: https://api.naturali.ai/token
          refreshUrl: https://api.naturali.ai/token
          scopes:
            mcp:access: Every operation this API serves, on the projects the grant covers.
