Amigo Settings API

The Settings API from Amigo — 9 operation(s) for settings.

Operations 16

GET /v1/{workspace_id}/settings/retention Get retention policy #
PUT /v1/{workspace_id}/settings/retention Update retention policy #
GET /v1/{workspace_id}/settings/gap-scanner Get gap scanner settings #
PUT /v1/{workspace_id}/settings/gap-scanner Update gap scanner settings #
POST /v1/{workspace_id}/settings/gap-scanner/preview Preview gap detection (dry run) #
POST /v1/{workspace_id}/settings/gap-scanner/scan Trigger one scan tick #
GET /v1/{workspace_id}/settings/metrics Get metric definitions #
PUT /v1/{workspace_id}/settings/metrics Update metric definitions #
GET /v1/{workspace_id}/settings/outreach Get outreach settings #
PUT /v1/{workspace_id}/settings/outreach Update outreach settings #
GET /v1/{workspace_id}/settings/branding Get workspace branding #
PUT /v1/{workspace_id}/settings/branding Update workspace branding #
GET /v1/{workspace_id}/settings/environments Get environment overrides #
PUT /v1/{workspace_id}/settings/environments Update environment overrides #
GET /v1/{workspace_id}/settings/voice Get voice settings #
PUT /v1/{workspace_id}/settings/voice Update voice settings #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/amigo-settings-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

amigo-settings-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Amigo Account Settings API
  version: 0.1.0
servers:
- url: https://api.amigo.ai
- url: https://internal-api.amigo.ai
- url: https://api-eu-central-1.amigo.ai
- url: https://api-ap-southeast-2.amigo.ai
- url: https://api-ca-central-1.amigo.ai
security:
- Bearer-Authorization: []
  Bearer-Authorization-Organization: []
  Basic: []
tags:
- name: Settings
paths:
  /v1/{workspace_id}/settings/retention:
    get:
      tags:
      - Settings
      summary: Get retention policy
      description: 'Get the workspace retention policy.


        Returns HIPAA-compliant defaults (2190 days / 6 years) for any field

        not explicitly configured. Advisory in v1 — no automated deletion.


        Permissions: authenticated (any role).'
      operationId: get-retention-policy
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetentionPolicyResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update retention policy
      description: 'Update the workspace retention policy.


        Partial updates supported — only provided fields are changed.

        Advisory in v1: policy is stored and displayed but no automated

        deletion is performed. Legal hold overrides all retention.


        Permissions: admin, owner (``Workspace.update``).'
      operationId: update-retention-policy
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RetentionPolicyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetentionPolicyResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/gap-scanner:
    get:
      tags:
      - Settings
      summary: Get gap scanner settings
      description: 'Get the workspace gap scanner settings.


        Returns defaults when not configured. Gap scanner is disabled by default.


        Permissions: authenticated (any role).'
      operationId: get-gap-scanner-settings
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GapScannerSettingsResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update gap scanner settings
      description: 'Update the workspace gap scanner settings.


        Partial updates supported — only provided fields are changed.

        Requirements list is replaced entirely when provided (not merged).


        Permissions: admin, owner (enforced via ``Workspace.update``, matching

        the outreach-settings sibling).'
      operationId: update-gap-scanner-settings
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GapScannerSettingsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GapScannerSettingsResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/gap-scanner/preview:
    post:
      tags:
      - Settings
      summary: Preview gap detection (dry run)
      description: 'Dry-run gap detection — returns entities with missing fields without creating surfaces.


        Proxies to connector-runner /internal/gap-scanner/preview.


        Permissions: admin, owner (enforced via ``Workspace.update``).'
      operationId: gap-scanner-preview
      requestBody:
        content:
          application/json:
            schema:
              anyOf:
              - $ref: '#/components/schemas/GapScannerPreviewRequest'
              - type: 'null'
              title: Body
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Gap-Scanner-Preview
        '429':
          description: Rate limited
        '503':
          description: Connector runner unavailable
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/gap-scanner/scan:
    post:
      tags:
      - Settings
      summary: Trigger one scan tick
      description: 'Trigger one scan tick immediately — creates surfaces for detected gaps.


        Proxies to connector-runner /internal/gap-scanner/scan.


        Permissions: admin, owner (enforced via ``Workspace.update`` — this

        creates patient-facing surfaces, so it must not be reachable below

        admin tier).'
      operationId: gap-scanner-scan
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Gap-Scanner-Scan
        '429':
          description: Rate limited
        '503':
          description: Connector runner unavailable
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/metrics:
    get:
      tags:
      - Settings
      summary: Get metric definitions
      description: 'Get the workspace metric definitions.


        Returns built-in defaults when not configured.


        Permissions: authenticated (any role).'
      operationId: get-metric-settings
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MetricSettingsResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update metric definitions
      description: 'Update the workspace metric definitions.


        Partial updates supported — only provided fields are changed.

        The definitions list is replaced entirely when provided.


        Permissions: admin, owner.'
      operationId: update-metric-settings
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricSettingsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MetricSettingsResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/outreach:
    get:
      tags:
      - Settings
      summary: Get outreach settings
      description: 'Get the workspace outreach settings.


        Returns empty rules and templates when not configured.


        Permissions: authenticated (any role).'
      operationId: get-outreach-settings
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutreachSettingsResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update outreach settings
      description: 'Update the workspace outreach settings.


        Partial updates supported — only provided fields are changed.

        Rules and data_templates lists are replaced entirely when provided.


        Validates that data_template_id references in rules point to

        templates that exist in the same payload or current settings.


        Permissions: admin, owner.'
      operationId: update-outreach-settings
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OutreachSettingsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutreachSettingsResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/branding:
    get:
      tags:
      - Settings
      summary: Get workspace branding
      description: 'Get the workspace default branding for surfaces.


        Returns empty branding when not configured.


        Permissions: authenticated (any role).'
      operationId: get-branding-settings
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandingSettingsResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update workspace branding
      description: 'Update the workspace default branding for surfaces.


        Surface-level branding takes precedence over workspace-level branding.


        Permissions: admin, owner.'
      operationId: update-branding-settings
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrandingSettingsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandingSettingsResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/environments:
    get:
      tags:
      - Settings
      summary: Get environment overrides
      description: 'Get per-environment config overrides.


        Returns empty environments when not configured.


        Permissions: authenticated (any role).'
      operationId: get-environment-settings
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentSettingsResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update environment overrides
      description: 'Update per-environment config overrides.


        Permissions: admin, owner.'
      operationId: update-environment-settings
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EnvironmentSettingsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentSettingsResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
  /v1/{workspace_id}/settings/voice:
    get:
      tags:
      - Settings
      summary: Get voice settings
      description: 'Get the voice experience settings for a workspace.


        Returns voice identity, domain vocabulary, and post-call intelligence

        configuration. These settings shape how the AI agent sounds and what

        domain-specific terms it recognizes accurately.


        #### Permissions

        * Requires authenticated API key (any role).'
      operationId: get-voice-settings
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoiceSettingsResponse'
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
    put:
      tags:
      - Settings
      summary: Update voice settings
      description: "Update the voice experience settings for a workspace.\n\nOnly provided fields are updated; omitted fields retain their current\nvalues. Set a field to ``null`` to reset it to default.\n\n**Voice Identity & Style**\n- **voice_id**: Voice identity UUID — determines the agent's voice persona\n- **tone**: Emotional baseline (``calm``, ``sympathetic``,\n  ``enthusiastic``, ``content``, ``curious``, ``cheerful``,\n  ``serious``, ``friendly``). The system also adapts tone dynamically\n  based on real-time caller emotion analysis; this setting provides\n  the baseline when no strong emotional signal is detected.\n- **speed**: Speech rate multiplier (0.5-2.0)\n- **volume**: Volume multiplier (0.0-1.0)\n- **language**: BCP-47 language tag (default ``en``)\n\n**Speech Recognition Boost**\n- **keyterms**: Exact words the speech recognition engine should\n  prioritize. Use for specific names, drug names, and org jargon.\n  Example: ``[\"Dr. Ramirez\", \"metformin\", \"HIPAA\"]``\n\n**Post-Call Intelligence**\n- **post_call_analysis_enabled**: Run automated quality scoring after\n  each call ends (default ``true``)\n- **transcript_correction_enabled**: Re-verify transcripts with a\n  high-accuracy batch model after call ends (default ``true``)\n\n#### Permissions\n* Requires admin or owner role."
      operationId: update-voice-settings
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoiceSettingsRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoiceSettingsResponse'
        '404':
          description: Workspace not found
        '422':
          description: Validation error
        '429':
          description: Rate limited
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
          title: Workspace Id
components:
  schemas:
    FieldType:
      type: string
      enum:
      - text
      - textarea
      - date
      - phone
      - email
      - number
      - select
      - multiselect
      - checkbox
      - photo
      - signature
      - file
      - heading
      - info
      title: FieldType
      description: Input field types for surface data collection.
    DataTemplateField:
      properties:
        key:
          type: string
          maxLength: 128
          minLength: 1
          title: Key
        label:
          $ref: '#/components/schemas/NameString'
        field_type:
          $ref: '#/components/schemas/FieldType'
          default: text
        required:
          type: boolean
          title: Required
          default: true
        sensitive:
          type: boolean
          title: Sensitive
          default: false
        path:
          type: string
          maxLength: 256
          minLength: 1
          title: Path
          description: Dot-notation path into entity state (e.g. demographics.date_of_birth)
      type: object
      required:
      - key
      - label
      - path
      title: DataTemplateField
      description: A field in a data template — maps to entity state path for gap detection.
    QuietHours:
      properties:
        enabled:
          type: boolean
          title: Enabled
          default: false
        start_hour:
          type: integer
          maximum: 23.0
          minimum: 0.0
          title: Start Hour
          default: 21
        end_hour:
          type: integer
          maximum: 23.0
          minimum: 0.0
          title: End Hour
          default: 8
        timezone:
          type: string
          maxLength: 64
          title: Timezone
          default: America/New_York
      type: object
      title: QuietHours
      description: Quiet hours — no outbound outreach during this window.
    EnvironmentOverrides:
      properties:
        data_source_id:
          anyOf:
          - type: string
            format: uuid
          - type: 'null'
          title: Data Source Id
        tool_overrides:
          additionalProperties: true
          type: object
          title: Tool Overrides
        data_source_overrides:
          additionalProperties: true
          type: object
          title: Data Source Overrides
      type: object
      title: EnvironmentOverrides
      description: Per-environment config overrides merged at runtime.
    DescriptionString:
      type: string
      maxLength: 2000
    GapScannerPreviewRequest:
      properties:
        limit:
          type: integer
          maximum: 200.0
          minimum: 1.0
          title: Limit
          default: 50
      type: object
      title: GapScannerPreviewRequest
    DataTemplate-Output:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        name:
          $ref: '#/components/schemas/NameString'
        fields:
          items:
            $ref: '#/components/schemas/DataTemplateField'
          type: array
          maxItems: 50
          minItems: 1
          title: Fields
      type: object
      required:
      - name
      - fields
      title: DataTemplate
      description: Named field template — reusable across multiple outreach rules.
    BrandingConfig:
      properties:
        logo_url:
          anyOf:
          - type: string
            maxLength: 2048
          - type: 'null'
          title: Logo Url
        primary_color:
          anyOf:
          - type: string
            maxLength: 32
          - type: 'null'
          title: Primary Color
        background_color:
          anyOf:
          - type: string
            maxLength: 32
          - type: 'null'
          title: Background Color
        font_family:
          anyOf:
          - type: string
            maxLength: 256
          - type: 'null'
          title: Font Family
      type: object
      title: BrandingConfig
      description: Visual branding for patient-facing surfaces.
    MetricDefinition:
      properties:
        id:
          type: string
          format: uuid
          title: Id
        key:
          type: string
          maxLength: 64
          minLength: 1
          pattern: ^[a-z][a-z0-9_]*$
          title: Key
          description: Lowercase slug used as metric key (e.g. 'voice_quality_score')
        name:
          $ref: '#/components/schemas/NameString'
        description:
          anyOf:
          - $ref: '#/components/schemas/DescriptionString'
          - type: 'null'
        metric_type:
          type: string
          enum:
          - numerical
          - categorical
          - boolean
          title: Metric Type
        latency_tier:
          type: string
          enum:
          - streaming
          - near_realtime
          - batch
          title: Latency Tier
          description: '''streaming'' — seconds-latency via ZeroBus streaming ingestion (continuous pipeline). ''near_realtime'' — minutes-latency via triggered pipeline refresh. ''batch'' — hourly/daily scheduled refresh (default, cheapest).'
          default: batch
        period_granularity:
          type: string
          enum:
          - hourly
          - daily
          title: Period Granularity
          description: '''hourly'' — one row per workspace per hour. Use for near_realtime metrics where shift-level visibility matters (voice quality, latency). ''daily'' — one row per workspace per day (default, cheapest).'
          default: daily
        source:
          type: string
          enum:
          - call_intelligence
          - world_events
          - surface_events
          - emotion_events
          - connector_events
          - zerobus_events
          - voice_judge_results
          - custom
          title: Source
          description: Source key for the producer that supplies this metric. Built-ins include 'call_intelligence', 'world_events', and 'surface_events'. Use 'custom' with custom_source_key for extension producers.
        custom_source_key:
          anyOf:
          - type: string
            maxLength: 128
            minLength: 1
            pattern: ^[a-z][a-z0-9_]*$
          - type: 'null'
          title: Custom Source Key
          description: Extension source key used only when source='custom'.
        event_types:
          items:
            type: string
          type: array
          maxItems: 100
          minItems: 1
          title: Event Types
          description: 'Event types to scan (e.g. ''call.outcome'', ''surface.submitted''). For call_intelligence source, use pseudo-types: ''call_intelligence.row''.'
        source_filter:
          anyOf:
          - type: string
          - type: 'null'
          title: Source Filter
          description: Optional SQL WHERE fragment for additional filtering (e.g. "source = 'voice_agent'"). Applied after event_type filter.
        extraction_mode:
          type: string
          enum:
          - static
          - ai_classify
          - ai_extract
          - ai_query
          - sql_expr
          title: Extraction Mode
          description: '''static'' — JSONB path extraction (fast, free). ''ai_classify'' — AI classification into user-defined labels (free). ''ai_extract'' — AI field extraction from text (free). ''ai_query'' — LLM-powered extraction with custom prompt (uses model_tier). ''sql_expr'' — Raw SQL expression for computed metrics.'
          default: static
        extract_path:
          anyOf:
          - type: string
          - type: 'null'
          title: Extract Path
          description: JSON path for static extraction (e.g. `$.quality_score`, `$.risk_level`). For `call_intelligence` and `world_events`, single-segment paths resolve to typed columns when available and fall back to JSONB extraction otherwise. Used when `extraction_mode='static'`.
        ai_labels:
          anyOf:
          - items:
              type: string
            type: array
            maxItems: 500
          - type: 'null'
          title: Ai Labels
          description: 'Labels for ai_classify (categories) or ai_extract (field names). Required when extraction_mode=''ai_classify'' or ''ai_extract''. Examples: [''positive'', ''negative'', ''neutral''] or [''diagnosis'', ''medication''].'
        ai_schema:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Ai Schema
          description: Extraction schema for ai_extract. Required when extraction_mode='ai_extract'.
        ai_query_endpoint:
          anyOf:
          - type: string
            maxLength: 256
          - type: 'null'
          title: Ai Query Endpoint
          description: Model serving endpoint for ai_query. Optional — if omitted, platform resolves from model_tier automatically. Override for custom endpoints.
        ai_query_prompt:
          anyOf:
          - type: string
            maxLength: 8000
          - type: 'null'
          title: Ai Query Prompt
          description: 'Prompt template for ai_query. Use {data} placeholder for event data. Example: ''Classify this call transcript into one of: {labels}. Transcript: {data}''. Budgeted at 8KB to hold the full rubric + output spec for standard quality judges (longest authored rubric — conversational_naturalness — is ~5KB).'
        sql_expression:
          anyOf:
          - type: string
            maxLength: 1000
          - type: 'null'
          title: Sql Expression
          description: 'Raw SQL expression evaluated in pipeline context. Has access to all columns in the source table. Example: ''CASE WHEN duration_seconds > 120 THEN 1.0 ELSE 0.0 END''. Required when extraction_mode=''sql_expr''.'
        aggregation:
          type: string
          enum:
          - count
          - sum
          - avg
          - min
          - max
          - count_distinct
          - ratio
          - rate
          title: Aggregation
          description: How to aggregate extracted values per workspace per period. 'ratio' requires ratio_numerator_event and ratio_denominator_event. 'rate' computes count(true) / count(all) for boolean metrics.
          default: count
        ratio_numerator_event:
          anyOf:
          - type: string
          - type: 'null'
          title: Ratio Numerator Event
          description: Event type for numerator when aggregation='ratio'.
        ratio_denominator_event:
          anyOf:
          - type: string
          - type: 'null'
          title: Ratio Denominator Event
          description: Event type for denominator when aggregation='ratio'.
        valid_range_min:
          anyOf:
          - type: number
          - type: 'null'
          title: Valid Range Min
          description: Minimum valid value for numerical metrics. Pipeline drops values outside range.
        valid_range_max:
          anyOf:
          - type: number
          - type: 'null'
          title: Valid Range Max
          description: Maximum valid value for numerical metrics.
        freshness_sla_minutes:
          type: integer
          maximum: 1440.0
          minimum: 5.0
          title: Freshness Sla Minutes
          description: 'Max acceptable staleness in minutes before alerting. Default: 60 (1 hour).'
          default: 60
        unit:
          anyOf:
          - type: string
            maxLength: 32
          - type: 'null'
          title: Unit
          description: Display unit (e.g. 'score', 'minutes', '%', 'count').
        categories:
          anyOf:
          - items:
              type: string
            type: array
            maxItems: 100
          - type: 'null'
          title: Categories
          description: Allowed values for categorical metrics. Pipeline drops values not in this list when set.
        model_tier:
          type: string
          enum:
          - free
          - fast
          - balanced
          - max
          - custom
          title: Model Tier
          description: AI model tier for extraction quality/cost tradeoff. 'free' — platform managed models (ai_classify, ai_extract). 'fast' — optimized for simple classification, low latency. 'balanced' — quality scoring, moderate reasoning. 'max' — complex analysis, multi-step reasoning. 'custom' — use ai_query_endpoint directly. When extraction_mode='ai_query' and ai_query_endpoint is not set, platform resolves model_tier to the optimal model automatically.
          default: free
        channel_scope:
          type: string
          enum:
          - all
          - voice
          - text
          - surface
          - inbound
          - outbound
          title: Channel Scope
          description: Business-logic channel filter. 'voice' — voice calls only. 'text' — SMS/text sessions. 'surface' — form submissions. 'inbound'/'outbound' — by direction. 'all' — no channel filter (default). Pipeline translates to appropriate source + event_type filters.
          default: all
        applies_to_product_types:
          anyOf:
          - items:
              type: string
            type: array
          - type: 'null'
          title: Applies To Product Types
          description: Product types this metric applies to (matches service tags, e.g. 'scheduling', 'outbound', 'coaching', 'intake', 'triage', 'support'). When set, the metric only computes for calls belonging to services whose config.tags include one of these keys. When None (default), the metric applies to every service regardless of product type.
        prompt:
          anyOf:
          - type: string
            maxLength: 4000
          - type: 'null'
          title: Prompt
          description: Rubric prompt for LLM judge evaluation with {$.path} context variables. Each {$.path} reference is extracted from the entity's projected state and substituted before sending to ai_query. The prompt is both the evaluation criteria and the context specification.
        granularity:
          type: string
          enum:
          - aggregate
          - per_entity
          title: Granularity
          description: '''aggregate'' groups by (workspace, period) — one value per time bucket. ''per_entity'' keeps entity_id — one value per entity (call, encounter). Judge metrics are typically per_entity. Computed metrics are typically aggregate.'
          default: aggregate
        active:
          type: boolean
          title: Active
          default: true
        builtin:
          type: boolean
          title: Builtin
          description: True for platform-provided metrics (read-only key).
          default: false
      type: object
      required:
      - key
      - name
      - metric_type
      - source
      - event_types
      title: MetricDefinition
      description: "A single metric definition — what to extract and how.\n\nTwo broad modes:\n- Built-in metrics: extraction is handled by hardcoded pipeline logic\n  (extract_path + aggregation). Shipped with every workspace.\n- Custom metrics: extraction uses AI functions or static JSONB paths.\n  Defined per-workspace via settings API.\n\nFrozen: builtins are process-wide singletons exposed via the\n``BUILTIN_METRICS`` list. 

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