Amigo Services API
The Services API from Amigo — 5 operation(s) for services.
The Services API from Amigo — 5 operation(s) for services.
openapi: 3.1.0
info:
title: Amigo Account Services 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: Services
paths:
/v1/{workspace_id}/services:
post:
tags:
- Services
summary: Create a service
description: Create a new service linking an agent and HSM. Validates that agent_id and context_graph_id exist in the workspace. Requires `Service.create` permission.
operationId: create-service
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateServiceRequest'
responses:
'201':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceResponse'
'404':
description: Not found.
'409':
description: Name already taken.
'403':
description: Insufficient permissions.
'401':
description: Missing or invalid API key.
'422':
description: Invalid request body.
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
get:
tags:
- Services
summary: List services
description: List services in a workspace with pagination. Requires `Service.view` permission.
operationId: list-services
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: search
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/SearchString'
- type: 'null'
title: Search
- name: sort_by
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Sort By
- name: is_active
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
title: Is Active
- name: limit
in: query
required: false
schema:
type: integer
maximum: 100
exclusiveMinimum: 0
default: 10
title: Limit
- name: continuation_token
in: query
required: false
schema:
type: integer
default: 0
title: Continuation Token
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedResponse_ServiceResponse_'
'404':
description: Not found.
'403':
description: Insufficient permissions.
'401':
description: Missing or invalid API key.
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/{workspace_id}/services/{service_id}:
get:
tags:
- Services
summary: Get a service
description: Retrieve a service by ID. Requires `Service.view` permission.
operationId: get-service
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: service_id
in: path
required: true
schema:
type: string
format: uuid
title: Service Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceResponse'
'404':
description: Not found.
'403':
description: Insufficient permissions.
'401':
description: Missing or invalid API key.
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
put:
tags:
- Services
summary: Update a service
description: Update a service's configuration. Requires `Service.update` permission.
operationId: update-service
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: service_id
in: path
required: true
schema:
type: string
format: uuid
title: Service Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateServiceRequest'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceResponse'
'404':
description: Not found.
'409':
description: Name already taken.
'403':
description: Insufficient permissions.
'401':
description: Missing or invalid API key.
'422':
description: Invalid request body.
delete:
tags:
- Services
summary: Delete a service
description: Delete a service. Requires `Service.delete` permission.
operationId: delete-service
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: service_id
in: path
required: true
schema:
type: string
format: uuid
title: Service Id
responses:
'204':
description: Successful Response
'404':
description: Not found.
'403':
description: Insufficient permissions.
'401':
description: Missing or invalid API key.
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/{workspace_id}/services/{service_id}/version-sets/{name}:
put:
tags:
- Services
summary: Upsert a service version set
description: Replace or create a named version set on a service. Pinned agent/HSM versions are validated.
operationId: upsert-service-version-set
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: service_id
in: path
required: true
schema:
type: string
format: uuid
title: Service Id
- name: name
in: path
required: true
schema:
type: string
maxLength: 40
description: Version set name (e.g. 'release')
title: Name
description: Version set name (e.g. 'release')
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpsertVersionSetRequest'
responses:
'204':
description: Successful Response
'404':
description: Not found.
'409':
description: Name already taken.
'403':
description: Insufficient permissions.
'401':
description: Missing or invalid API key.
'422':
description: Invalid request body.
/v1/{workspace_id}/services/{service_id}/voice-turn:
post:
tags:
- Services
summary: Voice Turn
description: 'Run one WhatsApp-style voice-note turn against the service''s agent.
Accepts OGG Opus audio (or any format Deepgram''s prerecorded endpoint
accepts). Server keys the conversation on ``(workspace, service,
phone_number)`` and returns the agent''s spoken reply as OGG Opus.'
operationId: voice-turn
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: service_id
in: path
required: true
schema:
type: string
format: uuid
title: Service Id
requestBody:
required: true
content:
multipart/form-data:
schema:
$ref: '#/components/schemas/Body_voice-turn'
responses:
'200':
description: OGG Opus agent reply
content:
application/json:
schema: {}
audio/ogg: {}
'204':
description: Agent elected silence
'409':
description: Concurrent voice turn in progress for this speaker
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/v1/{workspace_id}/services/{service_id}/text-turn:
post:
tags:
- Services
summary: Text Turn
description: Run one WhatsApp-style text turn against the service's agent.
operationId: text-turn
parameters:
- name: workspace_id
in: path
required: true
schema:
type: string
format: uuid
title: Workspace Id
- name: service_id
in: path
required: true
schema:
type: string
format: uuid
title: Service Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TextTurnRequest'
responses:
'200':
description: Agent text reply
content:
application/json:
schema:
$ref: '#/components/schemas/TextTurnResponse'
'204':
description: Agent elected silence
'409':
description: Concurrent text turn in progress for this speaker
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
PaginatedResponse_ServiceResponse_:
properties:
items:
items:
$ref: '#/components/schemas/ServiceResponse'
type: array
title: Items
has_more:
type: boolean
title: Has More
continuation_token:
anyOf:
- type: integer
- type: 'null'
title: Continuation Token
total:
anyOf:
- type: integer
- type: 'null'
title: Total
type: object
required:
- items
- has_more
title: PaginatedResponse[ServiceResponse]
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
VersionSet-Output:
properties:
agent_version_number:
anyOf:
- type: integer
- type: 'null'
title: Agent Version Number
context_graph_version_number:
anyOf:
- type: integer
- type: 'null'
title: Context Graph Version Number
llm_model_preferences:
additionalProperties:
$ref: '#/components/schemas/LLMConfig'
type: object
title: Llm Model Preferences
turn_runtime:
type: string
enum:
- native
- openai-agents
title: Turn Runtime
default: native
type: object
title: VersionSet
description: Pins agent, state machine, and LLM model versions for a service.
ServiceVoiceConfig-Output:
properties:
tts_model:
anyOf:
- type: string
enum:
- sonic-turbo
- sonic-3
- type: 'null'
title: Tts Model
max_buffer_delay_ms:
anyOf:
- type: integer
- type: 'null'
title: Max Buffer Delay Ms
eager_eot_threshold:
anyOf:
- type: number
- type: 'null'
title: Eager Eot Threshold
eot_timeout_ms:
anyOf:
- type: integer
- type: 'null'
title: Eot Timeout Ms
filler_style:
type: string
enum:
- backchannel
- phrase
- silent
title: Filler Style
default: backchannel
filler_vocabulary:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Filler Vocabulary
backchannel_delay_ms:
type: integer
title: Backchannel Delay Ms
default: 400
max_response_sentences:
anyOf:
- type: integer
- type: 'null'
title: Max Response Sentences
max_response_words:
anyOf:
- type: integer
- type: 'null'
title: Max Response Words
barge_in_min_speech_s:
anyOf:
- type: number
- type: 'null'
title: Barge In Min Speech S
barge_in_cooldown_s:
anyOf:
- type: number
- type: 'null'
title: Barge In Cooldown S
min_tts_speed:
anyOf:
- type: number
- type: 'null'
title: Min Tts Speed
post_eot_pause_ms:
anyOf:
- type: integer
- type: 'null'
title: Post Eot Pause Ms
transition_deadline_ms:
anyOf:
- type: integer
- type: 'null'
title: Transition Deadline Ms
progress_interval_ms:
anyOf:
- type: integer
- type: 'null'
title: Progress Interval Ms
empathy_hold_ms:
anyOf:
- type: integer
- type: 'null'
title: Empathy Hold Ms
filler_cooldown_ms:
anyOf:
- type: integer
- type: 'null'
title: Filler Cooldown Ms
progress_vocabulary:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Progress Vocabulary
tts_provider:
anyOf:
- type: string
enum:
- cartesia
- elevenlabs
- groq
- type: 'null'
title: Tts Provider
tts_config:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Tts Config
language_providers:
anyOf:
- additionalProperties:
$ref: '#/components/schemas/LanguageProviderEntry'
type: object
maxProperties: 10
- type: 'null'
title: Language Providers
session_provider:
anyOf:
- type: string
enum:
- amigo
- gpt_realtime
- gpt_live
- type: 'null'
title: Session Provider
realtime_voice:
anyOf:
- type: string
enum:
- alloy
- ash
- ballad
- coral
- echo
- sage
- shimmer
- verse
- marin
- cedar
- type: 'null'
title: Realtime Voice
forward_call_enabled:
type: boolean
title: Forward Call Enabled
default: false
forwarding:
anyOf:
- $ref: '#/components/schemas/ServiceForwardingConfig'
- type: 'null'
type: object
title: ServiceVoiceConfig
description: 'Per-service voice pipeline tuning. Overrides workspace/env defaults.
Each field is optional — None means inherit from the layer above
(workspace VoiceSettings → env vars → hardcoded defaults).'
TextTurnRequest:
properties:
phone_number:
type: string
maxLength: 16
pattern: ^\+[1-9]\d{1,14}$
title: Phone Number
agent_phone:
type: string
maxLength: 16
pattern: ^\+[1-9]\d{1,14}$
title: Agent Phone
text:
type: string
maxLength: 8192
minLength: 1
title: Text
type: object
required:
- phone_number
- agent_phone
- text
title: TextTurnRequest
description: Request body for ``POST /v1/{ws}/services/{service_id}/text-turn``.
ServiceVoiceConfig-Input:
properties:
tts_model:
anyOf:
- type: string
enum:
- sonic-turbo
- sonic-3
- type: 'null'
title: Tts Model
max_buffer_delay_ms:
anyOf:
- type: integer
- type: 'null'
title: Max Buffer Delay Ms
eager_eot_threshold:
anyOf:
- type: number
- type: 'null'
title: Eager Eot Threshold
eot_timeout_ms:
anyOf:
- type: integer
- type: 'null'
title: Eot Timeout Ms
filler_style:
type: string
enum:
- backchannel
- phrase
- silent
title: Filler Style
default: backchannel
filler_vocabulary:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Filler Vocabulary
backchannel_delay_ms:
type: integer
title: Backchannel Delay Ms
default: 400
max_response_sentences:
anyOf:
- type: integer
- type: 'null'
title: Max Response Sentences
max_response_words:
anyOf:
- type: integer
- type: 'null'
title: Max Response Words
barge_in_min_speech_s:
anyOf:
- type: number
- type: 'null'
title: Barge In Min Speech S
barge_in_cooldown_s:
anyOf:
- type: number
- type: 'null'
title: Barge In Cooldown S
min_tts_speed:
anyOf:
- type: number
- type: 'null'
title: Min Tts Speed
post_eot_pause_ms:
anyOf:
- type: integer
- type: 'null'
title: Post Eot Pause Ms
transition_deadline_ms:
anyOf:
- type: integer
- type: 'null'
title: Transition Deadline Ms
progress_interval_ms:
anyOf:
- type: integer
- type: 'null'
title: Progress Interval Ms
empathy_hold_ms:
anyOf:
- type: integer
- type: 'null'
title: Empathy Hold Ms
filler_cooldown_ms:
anyOf:
- type: integer
- type: 'null'
title: Filler Cooldown Ms
progress_vocabulary:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Progress Vocabulary
tts_provider:
anyOf:
- type: string
enum:
- cartesia
- elevenlabs
- groq
- type: 'null'
title: Tts Provider
tts_config:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Tts Config
language_providers:
anyOf:
- additionalProperties:
$ref: '#/components/schemas/LanguageProviderEntry'
type: object
maxProperties: 10
- type: 'null'
title: Language Providers
session_provider:
anyOf:
- type: string
enum:
- amigo
- gpt_realtime
- gpt_live
- type: 'null'
title: Session Provider
realtime_voice:
anyOf:
- type: string
enum:
- alloy
- ash
- ballad
- coral
- echo
- sage
- shimmer
- verse
- marin
- cedar
- type: 'null'
title: Realtime Voice
forward_call_enabled:
type: boolean
title: Forward Call Enabled
default: false
forwarding:
anyOf:
- $ref: '#/components/schemas/ServiceForwardingConfig'
- type: 'null'
type: object
title: ServiceVoiceConfig
description: 'Per-service voice pipeline tuning. Overrides workspace/env defaults.
Each field is optional — None means inherit from the layer above
(workspace VoiceSettings → env vars → hardcoded defaults).'
PhoneE164:
type: string
maxLength: 16
minLength: 2
UpsertVersionSetRequest:
properties:
version_set:
$ref: '#/components/schemas/VersionSet-Input'
type: object
required:
- version_set
title: UpsertVersionSetRequest
ServiceTag:
properties:
key:
type: string
title: Key
value:
anyOf:
- type: string
- type: 'null'
title: Value
type: object
required:
- key
title: ServiceTag
ServiceResponse:
properties:
id:
type: string
format: uuid
title: Id
workspace_id:
type: string
format: uuid
title: Workspace Id
name:
type: string
title: Name
description:
type: string
title: Description
agent_id:
type: string
format: uuid
title: Agent Id
context_graph_id:
type: string
format: uuid
title: Context Graph Id
agent_name:
anyOf:
- type: string
- type: 'null'
title: Agent Name
context_graph_name:
anyOf:
- type: string
- type: 'null'
title: Context Graph Name
keyterms:
items:
type: string
type: array
title: Keyterms
is_active:
type: boolean
title: Is Active
version_sets:
additionalProperties:
$ref: '#/components/schemas/VersionSet-Output'
type: object
title: Version Sets
tags:
items:
$ref: '#/components/schemas/ServiceTag'
type: array
title: Tags
tool_capacity:
type: integer
title: Tool Capacity
channel_type:
type: string
enum:
- voice
- text
title: Channel Type
default: voice
environment:
type: string
enum:
- sandbox
- production
title: Environment
default: production
voice_config:
anyOf:
- $ref: '#/components/schemas/ServiceVoiceConfig-Output'
- type: 'null'
is_system:
type: boolean
title: Is System
default: false
created_at:
type: string
format: date-time
title: Created At
updated_at:
type: string
format: date-time
title: Updated At
type: object
required:
- id
- workspace_id
- name
- description
- agent_id
- context_graph_id
- keyterms
- is_active
- version_sets
- tags
- tool_capacity
- created_at
- updated_at
title: ServiceResponse
SearchString:
type: string
maxLength: 200
minLength: 1
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
TextTurnResponse:
properties:
text:
type: string
maxLength: 8192
title: Text
type: object
required:
- text
title: TextTurnResponse
description: 'Response body — the agent''s text reply.
Returned only on 200; 204 indicates the engine elected silence.'
UpdateServiceRequest:
properties:
name:
anyOf:
- $ref: '#/components/schemas/NameString'
- type: 'null'
description:
anyOf:
- $ref: '#/components/schemas/DescriptionString'
- type: 'null'
agent_id:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Agent Id
context_graph_id:
anyOf:
- type: string
format: uuid
- type: 'null'
title: Context Graph Id
keyterms:
anyOf:
- items:
type: string
maxLength: 128
minLength: 1
type: array
maxItems: 500
- type: 'null'
title: Keyterms
is_active:
anyOf:
- type: boolean
- type: 'null'
title: Is Active
version_sets:
anyOf:
- additionalProperties:
$ref: '#/components/schemas/VersionSet-Input'
type: object
- type: 'null'
title: Version Sets
tags:
anyOf:
- items:
$ref: '#/components/schemas/ServiceTag'
type: array
maxItems: 50
- type: 'null'
title: Tags
tool_capacity:
anyOf:
- type: integer
maximum: 10.0
minimum: 1.0
- type: 'null'
title: Tool Capacity
channel_type:
anyOf:
- type: string
enum:
- voice
- text
- type: 'null'
title: Channel Type
environment:
anyOf:
- type: string
enum:
- sandbox
- production
- type: 'null'
title: Environment
voice_config:
anyOf:
- $ref: '#/components/schemas/ServiceVoiceConfig-Input'
- type: 'null'
type: object
title: UpdateServiceRequest
CreateServiceRequest:
properties:
name:
$ref: '#/components/schemas/NameString'
description:
$ref: '#/components/schemas/DescriptionString'
default: ''
agent_id:
type: string
format: uuid
title: Agent Id
context_graph_id:
type: string
format: uuid
title: Context Graph Id
keyterms:
items:
type: string
maxLength: 128
minLength: 1
type: array
maxItems: 500
title: Keyterms
is_active:
type: boolean
title: Is Active
default: true
version_sets:
additionalProperties:
$ref: '#/components/schemas/VersionSet-Input'
type: object
title: Version Sets
default: {}
tags:
items:
$ref: '#/components/schemas/ServiceTag'
type: array
maxItems: 50
title: Tags
tool_capacity:
type: integer
maximum: 10.0
minimum: 1.0
title: Tool Capacity
default: 3
channel_type:
type: string
enum:
- voice
- text
title: Channel Type
default: voice
environment:
type: string
enum:
- sandbox
- production
title: Environment
default: production
voice_config:
anyOf:
- $ref: '#/components/schemas/ServiceVoiceConfig-Input'
- type: 'null'
type: object
required:
- name
- agent_id
- context_graph_id
title: CreateServiceRequest
DescriptionString:
type: string
maxLength: 2000
ServiceForwardingConfig:
properties:
forward_to:
$ref: '#/components/schemas/PhoneE164'
should_disconnect:
type: boolean
title: Should Disconnect
default: true
warm_transfer:
type: boolean
title: Warm Transfer
default: true
type: object
required:
- forward_to
title: ServiceForwardingConfig
description: 'Per-service call-forwarding destination + transfer mechanism.
Read by the LLM-driven ``forward_call`` tool (tier 3 fallback when the LLM
doesn''t pass an explicit ``phone_number`` and no EHR location is configured).
Per-service forwarding is a binary presence — set means tier 3 resolves
to it, None means tier 3 has no static target. (The legacy per-phone
forwarding shape, with its own ``enabled`` flag, was removed alongside
the legacy Twilio phone path.)'
VersionSet-Input:
properties:
agent_version_number:
anyOf:
- type: integer
- type: 'null'
title: Agent Version Number
context_graph_version_number:
anyOf:
- type: integer
- type: 'null'
title: Context Graph Version Number
llm_model_preferences:
additionalProperties:
$ref: '#/components/schemas/LLMConfig'
type: object
title: Llm Model Preferences
turn_runtime:
type: string
enum:
- native
- openai-agents
title: Turn Runtime
default: native
type: object
title: VersionSet
description: Pins agent, state machine, and LLM model versions for a service.
NameString:
type: string
maxLength: 256
minLength: 1
LanguageProviderEntry:
properties:
provider:
type: string
enum:
- cartesia
- elevenlabs
- groq
title: Provider
config:
additionalProperties: true
type: object
maxProperties: 20
title: Config
type: object
required:
- provider
title: LanguageProviderEntry
description: Per-language TTS provider configuration.
LLMConfig:
properties:
llm_name:
type: string
title: Llm Name
params:
additionalProperties: true
type: object
title: Params
experience_controls:
anyOf:
- $ref: '#/components/schemas/LLMExperienceControls'
- type: 'null'
type: object
required:
- llm_name
title: LLMConfig
Body_voice-turn:
properties:
audio:
type: string
contentMediaType: application/octet-stream
title: Audio
phone_number:
type: string
maxLength: 16
pattern: ^\+[1-9]\d{1,14}$
title: Phone Number
type: object
required:
- audio
- phone_number
title: Body_voice-turn
LLMExperienceControls:
properties:
verbosity:
anyOf:
- type: string
enum:
- low
# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/amigo/refs/heads/main/openapi/amigo-services-api-openapi.yml