Freeplay Test Runs & Evaluations API

Run batch evaluations against datasets, create and list test runs and retrieve their results, and record completion-level and trace-level customer and human feedback to close the evaluation feedback loop.

OpenAPI Specification

freeplay-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Freeplay HTTP API
  description: >-
    The Freeplay HTTP API provides programmatic access to the Freeplay LLM
    experimentation, evaluation, and observability platform. It covers prompt
    template management, recording completions and sessions/traces, curating
    test cases and datasets, running batch test runs and evaluations, and
    recording customer and human feedback. The API root is your Freeplay
    instance URL plus /api/v2. For the standard cloud instance this is
    https://app.freeplay.ai/api/v2; private/self-hosted instances use a
    per-account subdomain such as https://{subdomain}.freeplay.ai/api/v2.
  termsOfService: https://freeplay.ai/terms
  contact:
    name: Freeplay Support
    url: https://docs.freeplay.ai/
  version: v2
servers:
  - url: https://app.freeplay.ai/api/v2
    description: Freeplay Cloud (standard instance)
  - url: https://{subdomain}.freeplay.ai/api/v2
    description: Private / self-hosted instance (per-account subdomain)
    variables:
      subdomain:
        default: app
        description: Your Freeplay account subdomain.
security:
  - bearerAuth: []
tags:
  - name: Prompt Templates
    description: Create, version, retrieve, and deploy prompt templates.
  - name: Sessions
    description: List, search, and delete sessions.
  - name: Completions
    description: Record completions and aggregate completion statistics.
  - name: Traces
    description: Record traces that group related completions.
  - name: Datasets
    description: Curate datasets and their test cases.
  - name: Test Runs
    description: Create, list, and retrieve batch test runs.
  - name: Feedback
    description: Record completion-level and trace-level feedback.
  - name: Search
    description: API-only search over sessions, traces, and completions.
  - name: Projects
    description: List workspace projects.
  - name: Agents
    description: List agents within a project.
paths:
  /projects/all:
    get:
      operationId: listProjects
      tags:
        - Projects
      summary: List all projects in the workspace.
      responses:
        '200':
          description: A list of projects.
          content:
            application/json:
              schema:
                type: object
                properties:
                  projects:
                    type: array
                    items:
                      $ref: '#/components/schemas/Project'
  /projects/{project_id}/prompt-templates:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: listPromptTemplates
      tags:
        - Prompt Templates
      summary: List prompt templates for a project.
      responses:
        '200':
          description: A list of prompt templates.
          content:
            application/json:
              schema:
                type: object
                properties:
                  prompt_templates:
                    type: array
                    items:
                      $ref: '#/components/schemas/PromptTemplate'
    post:
      operationId: createPromptTemplate
      tags:
        - Prompt Templates
      summary: Create a prompt template.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePromptTemplateRequest'
      responses:
        '200':
          description: The created prompt template.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromptTemplate'
  /projects/{project_id}/prompt-templates/all/{environment_name}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - name: environment_name
        in: path
        required: true
        schema:
          type: string
        description: Environment name (e.g. latest, production).
    get:
      operationId: getAllPromptTemplatesInEnvironment
      tags:
        - Prompt Templates
      summary: Retrieve all prompt templates deployed in an environment.
      responses:
        '200':
          description: All prompt templates in the environment.
          content:
            application/json:
              schema:
                type: object
                properties:
                  prompt_templates:
                    type: array
                    items:
                      $ref: '#/components/schemas/PromptTemplateVersion'
  /projects/{project_id}/prompt-templates/name/{template_name}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/TemplateName'
    post:
      operationId: getPromptTemplateByName
      tags:
        - Prompt Templates
      summary: Retrieve a prompt template by name (formatted or raw).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetPromptTemplateRequest'
      responses:
        '200':
          description: The requested prompt template version.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromptTemplateVersion'
  /projects/{project_id}/prompt-templates/name/{template_name}/versions:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/TemplateName'
    post:
      operationId: createPromptTemplateVersionByName
      tags:
        - Prompt Templates
      summary: Create a new version of a prompt template by name.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePromptTemplateVersionRequest'
      responses:
        '200':
          description: The created prompt template version.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromptTemplateVersion'
  /projects/{project_id}/prompt-templates/id/{template_id}/versions:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/TemplateId'
    post:
      operationId: createPromptTemplateVersionById
      tags:
        - Prompt Templates
      summary: Create a new version of a prompt template by template ID.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePromptTemplateVersionRequest'
      responses:
        '200':
          description: The created prompt template version.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromptTemplateVersion'
  /projects/{project_id}/prompt-templates/id/{template_id}/versions/{version_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/TemplateId'
      - $ref: '#/components/parameters/VersionId'
    post:
      operationId: getPromptTemplateVersionById
      tags:
        - Prompt Templates
      summary: Retrieve a specific prompt template version by ID.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetPromptTemplateRequest'
      responses:
        '200':
          description: The requested prompt template version.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromptTemplateVersion'
  /projects/{project_id}/prompt-templates/id/{template_id}/versions/{version_id}/environments:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/TemplateId'
      - $ref: '#/components/parameters/VersionId'
    post:
      operationId: assignPromptTemplateVersionToEnvironments
      tags:
        - Prompt Templates
      summary: Deploy / assign a prompt template version to one or more environments.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                environments:
                  type: array
                  items:
                    type: string
              required:
                - environments
      responses:
        '200':
          description: The updated prompt template version with environment assignments.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromptTemplateVersion'
  /projects/{project_id}/sessions:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: listSessions
      tags:
        - Sessions
      summary: Retrieve sessions with pagination and filtering.
      parameters:
        - name: page
          in: query
          schema:
            type: integer
          description: Page number for pagination.
        - name: page_size
          in: query
          schema:
            type: integer
          description: Number of sessions per page.
      responses:
        '200':
          description: A paginated list of sessions.
          content:
            application/json:
              schema:
                type: object
                properties:
                  sessions:
                    type: array
                    items:
                      $ref: '#/components/schemas/Session'
                  next_page:
                    type: integer
                    nullable: true
  /projects/{project_id}/sessions/{session_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/SessionId'
    delete:
      operationId: deleteSession
      tags:
        - Sessions
      summary: Permanently delete a session.
      responses:
        '204':
          description: Session deleted.
  /projects/{project_id}/sessions/{session_id}/completions:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/SessionId'
    post:
      operationId: recordCompletion
      tags:
        - Completions
      summary: Record an LLM completion to a session.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordCompletionRequest'
      responses:
        '200':
          description: The recorded completion.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Completion'
  /projects/{project_id}/sessions/{session_id}/traces/id/{trace_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/SessionId'
      - $ref: '#/components/parameters/TraceId'
    post:
      operationId: recordTrace
      tags:
        - Traces
      summary: Record a trace that groups related completions within a session.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordTraceRequest'
      responses:
        '200':
          description: The recorded trace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Trace'
  /projects/{project_id}/completions/statistics:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    post:
      operationId: getCompletionStatistics
      tags:
        - Completions
      summary: Aggregate evaluation statistics across completions.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StatisticsRequest'
      responses:
        '200':
          description: Aggregated completion statistics.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Statistics'
  /projects/{project_id}/completions/statistics/{prompt_template_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - name: prompt_template_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
    post:
      operationId: getCompletionStatisticsByTemplate
      tags:
        - Completions
      summary: Aggregate evaluation statistics for a specific prompt template.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StatisticsRequest'
      responses:
        '200':
          description: Aggregated completion statistics for the prompt template.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Statistics'
  /projects/{project_id}/datasets/name/{dataset_name}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - name: dataset_name
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: getDatasetByName
      tags:
        - Datasets
      summary: Retrieve dataset metadata by name.
      responses:
        '200':
          description: Dataset metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Dataset'
  /projects/{project_id}/datasets/id/{dataset_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/DatasetId'
    get:
      operationId: getDatasetById
      tags:
        - Datasets
      summary: Retrieve dataset metadata by ID.
      responses:
        '200':
          description: Dataset metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Dataset'
  /projects/{project_id}/datasets/name/{dataset_name}/test-cases:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - name: dataset_name
        in: path
        required: true
        schema:
          type: string
    get:
      operationId: getTestCasesByDatasetName
      tags:
        - Datasets
      summary: Retrieve test cases for a dataset by name.
      responses:
        '200':
          description: A list of test cases.
          content:
            application/json:
              schema:
                type: object
                properties:
                  test_cases:
                    type: array
                    items:
                      $ref: '#/components/schemas/TestCase'
  /projects/{project_id}/datasets/id/{dataset_id}/test-cases:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/DatasetId'
    get:
      operationId: getTestCasesByDatasetId
      tags:
        - Datasets
      summary: Retrieve test cases for a dataset by ID.
      responses:
        '200':
          description: A list of test cases.
          content:
            application/json:
              schema:
                type: object
                properties:
                  test_cases:
                    type: array
                    items:
                      $ref: '#/components/schemas/TestCase'
    post:
      operationId: uploadTestCases
      tags:
        - Datasets
      summary: Upload test cases to a dataset.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadTestCasesRequest'
      responses:
        '200':
          description: The uploaded test cases.
          content:
            application/json:
              schema:
                type: object
                properties:
                  test_cases:
                    type: array
                    items:
                      $ref: '#/components/schemas/TestCase'
  /projects/{project_id}/test-runs:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: listTestRuns
      tags:
        - Test Runs
      summary: List test runs for a project.
      responses:
        '200':
          description: A list of test runs.
          content:
            application/json:
              schema:
                type: object
                properties:
                  test_runs:
                    type: array
                    items:
                      $ref: '#/components/schemas/TestRun'
    post:
      operationId: createTestRun
      tags:
        - Test Runs
      summary: Create a test run from a dataset.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTestRunRequest'
      responses:
        '200':
          description: The created test run.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestRun'
  /projects/{project_id}/test-runs/id/{test_run_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - name: test_run_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
    get:
      operationId: getTestRun
      tags:
        - Test Runs
      summary: Retrieve test run results by ID.
      responses:
        '200':
          description: The test run and its results.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestRun'
  /projects/{project_id}/completion-feedback/id/{completion_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - name: completion_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
    post:
      operationId: recordCompletionFeedback
      tags:
        - Feedback
      summary: Record feedback on a completion.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FeedbackRequest'
      responses:
        '200':
          description: Feedback recorded.
  /projects/{project_id}/trace-feedback/id/{trace_id}:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/TraceId'
    post:
      operationId: recordTraceFeedback
      tags:
        - Feedback
      summary: Record feedback on a trace.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FeedbackRequest'
      responses:
        '200':
          description: Feedback recorded.
  /projects/{project_id}/search/sessions:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    post:
      operationId: searchSessions
      tags:
        - Search
      summary: Search sessions with advanced filters.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: Matching sessions.
          content:
            application/json:
              schema:
                type: object
                properties:
                  sessions:
                    type: array
                    items:
                      $ref: '#/components/schemas/Session'
  /projects/{project_id}/search/traces:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    post:
      operationId: searchTraces
      tags:
        - Search
      summary: Search traces with advanced filters.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: Matching traces.
          content:
            application/json:
              schema:
                type: object
                properties:
                  traces:
                    type: array
                    items:
                      $ref: '#/components/schemas/Trace'
  /projects/{project_id}/search/completions:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    post:
      operationId: searchCompletions
      tags:
        - Search
      summary: Search completions with advanced filters.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: Matching completions.
          content:
            application/json:
              schema:
                type: object
                properties:
                  completions:
                    type: array
                    items:
                      $ref: '#/components/schemas/Completion'
  /projects/{project_id}/agents:
    parameters:
      - $ref: '#/components/parameters/ProjectId'
    get:
      operationId: listAgents
      tags:
        - Agents
      summary: List agents within a project with pagination.
      parameters:
        - name: page
          in: query
          schema:
            type: integer
      responses:
        '200':
          description: A list of agents.
          content:
            application/json:
              schema:
                type: object
                properties:
                  agents:
                    type: array
                    items:
                      $ref: '#/components/schemas/Agent'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Authenticate requests using your Freeplay API key as a Bearer token in
        the Authorization header. API keys are managed at
        https://app.freeplay.ai/settings/api-access.
  parameters:
    ProjectId:
      name: project_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: The Freeplay project ID.
    SessionId:
      name: session_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    TraceId:
      name: trace_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    TemplateId:
      name: template_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    TemplateName:
      name: template_name
      in: path
      required: true
      schema:
        type: string
    VersionId:
      name: version_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    DatasetId:
      name: dataset_id
      in: path
      required: true
      schema:
        type: string
        format: uuid
  schemas:
    Project:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
    PromptTemplate:
      type: object
      properties:
        prompt_template_id:
          type: string
          format: uuid
        prompt_template_name:
          type: string
        project_id:
          type: string
          format: uuid
    CreatePromptTemplateRequest:
      type: object
      required:
        - prompt_template_name
      properties:
        prompt_template_name:
          type: string
        messages:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        model_parameters:
          type: object
          additionalProperties: true
    GetPromptTemplateRequest:
      type: object
      properties:
        environment:
          type: string
          description: Environment to resolve the deployed version from (e.g. latest, production).
        variables:
          type: object
          additionalProperties: true
          description: Variables used to format the template when requesting a formatted result.
    CreatePromptTemplateVersionRequest:
      type: object
      required:
        - messages
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        model:
          type: string
        model_parameters:
          type: object
          additionalProperties: true
    PromptTemplateVersion:
      type: object
      properties:
        prompt_template_id:
          type: string
          format: uuid
        prompt_template_version_id:
          type: string
          format: uuid
        prompt_template_name:
          type: string
        environments:
          type: array
          items:
            type: string
        messages:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        model:
          type: string
        model_parameters:
          type: object
          additionalProperties: true
    Message:
      type: object
      properties:
        role:
          type: string
          enum:
            - system
            - user
            - assistant
            - tool
        content:
          type: string
    Session:
      type: object
      properties:
        session_id:
          type: string
          format: uuid
        project_id:
          type: string
          format: uuid
        created_at:
          type: string
          format: date-time
        custom_metadata:
          type: object
          additionalProperties: true
    RecordCompletionRequest:
      type: object
      required:
        - messages
      properties:
        messages:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        inputs:
          type: object
          additionalProperties: true
        prompt_template_version_id:
          type: string
          format: uuid
        trace_id:
          type: string
          format: uuid
        start_time:
          type: string
          format: date-time
        end_time:
          type: string
          format: date-time
        model:
          type: string
        provider:
          type: string
        usage:
          $ref: '#/components/schemas/Usage'
        custom_metadata:
          type: object
          additionalProperties: true
    Completion:
      type: object
      properties:
        completion_id:
          type: string
          format: uuid
        session_id:
          type: string
          format: uuid
        trace_id:
          type: string
          format: uuid
        messages:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        model:
          type: string
        usage:
          $ref: '#/components/schemas/Usage'
    Usage:
      type: object
      properties:
        prompt_tokens:
          type: integer
        completion_tokens:
          type: integer
        total_tokens:
          type: integer
    RecordTraceRequest:
      type: object
      properties:
        input:
          type: string
        output:
          type: string
        custom_metadata:
          type: object
          additionalProperties: true
    Trace:
      type: object
      properties:
        trace_id:
          type: string
          format: uuid
        session_id:
          type: string
          format: uuid
        input:
          type: string
        output:
          type: string
    Dataset:
      type: object
      properties:
        dataset_id:
          type: string
          format: uuid
        name:
          type: string
        description:
          type: string
        test_case_count:
          type: integer
    TestCase:
      type: object
      properties:
        test_case_id:
          type: string
          format: uuid
        values:
          type: object
          additionalProperties: true
          description: Input variable values for the test case.
        output:
          type: string
          description: Expected or reference output.
        history:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        metadata:
          type: object
          additionalProperties: true
    UploadTestCasesRequest:
      type: object
      required:
        - test_cases
      properties:
        test_cases:
          type: array
          items:
            $ref: '#/components/schemas/TestCase'
    CreateTestRunRequest:
      type: object
      required:
        - dataset_id
      properties:
        dataset_id:
          type: string
          format: uuid
        name:
          type: string
        prompt_template_version_id:
          type: string
          format: uuid
        flavor_name:
          type: string
        include_outputs:
          type: boolean
    TestRun:
      type: object
      properties:
        test_run_id:
          type: string
          format: uuid
        name:
          type: string
        dataset_id:
          type: string
          format: uuid
        status:
          type: string
        results:
          type: array
          items:
            type: object
            additionalProperties: true
    FeedbackRequest:
      type: object
      properties:
        feedback:
          type: object
          additionalProperties: true
          description: Map of feedback key to value (scores, labels, or free text).
        source:
          type: string
          description: Origin of the feedback (e.g. customer, human-review).
    StatisticsRequest:
      type: object
      properties:
        environment:
          type: string
        start_time:
          type: string
          format: date-time
        end_time:
          type: string
          format: date-time
    Statistics:
      type: object
      properties:
        completion_count:
          type: integer
        evaluations:
          type: object
          additionalProperties: true
    SearchRequest:
      type: object
      properties:
        query:
          type: string
        filters:
          type: object
          additionalProperties: true
        start_time:
          type: string
          format: date-time
        end_time:
          type: string
          format: date-time
        page:
          type: integer
        page_size:
          type: integer
    Agent:
      type: object
      properties:
        agent_id:
          type: string
          format: uuid
        name:
          type: string