Skip to content

Publish an immutable version of an agent

POST
/v1/agents/{agent_id}/publish
curl --request POST \
--url https://api.vocapable.com/v1/agents/example/publish \
--header 'Authorization: Bearer <token>'
agent_id
required
Agent Id
string

Successful Response

Media typeapplication/json
AgentVersionResource

The fully resolved configuration a call executes.

object
id
required
Id
string
agent_definition_id
required
Agent Definition Id
string
version
required
Version
integer
content_hash
required
Content Hash
string
action_confirmation_policy
Action Confirmation Policy
string
default: legacy_v0
Allowed values: legacy_v0 exact_action_v1 exact_action_v2
max_call_seconds
required
Max Call Seconds
integer
stock_voice_id
Any of:
string
voice_profile_id
Any of:
string
knowledge_pack_version_id
Any of:
string
receptionist_intelligence_version_id
Any of:
string
receptionist_release_status
Receptionist Release Status
string
default: not_applicable
Allowed values: not_applicable unqualified qualified draining
receptionist_capability_manifest_hash
Any of:
string
receptionist_rendered_token_budget
Any of:
object
key
additional properties
any
receptionist_live_preflight_eval_run_id
Any of:
string
receptionist_canary_route_fingerprint
Any of:
string
receptionist_qualified_at
Any of:
string format: date-time
compliance_profile_id
required
Compliance Profile Id
string
gate_eval_run_id
required
Gate Eval Run Id
string
published_by
Any of:
string
published_at
required
Published At
string format: date-time
persona
required
Persona
object
key
additional properties
any
use_case
Use Case
string
default: custom
Allowed values: sdr staffing survey reminder custom receptionist recruiting
conversation_settings
ConversationSettings

Versioned dialogue policy; language availability is qualified by the speech service.

object
default_language
Default Language
string
default: en
Allowed values: en es
supported_languages
Supported Languages
Array<string>
Allowed values: en es
allow_language_switch
Allow Language Switch
boolean
default: true
objectives
required
Objectives
Array<object>
object
key
additional properties
any
guardrails
required
Guardrails

Conversation-level controls frozen into the published version.

object
disallowed_topics
Disallowed Topics
Array<string>
blocklist_patterns
Blocklist Patterns
Array<string>
judge
Judge
object
key
additional properties
any
max_call_seconds
Any of:
integer
>= 30 <= 900
max_turns
Any of:
integer
>= 1
tools
required
Tools
Array<string>
Allowed values: check_calendar book_meeting send_sms send_verification_code verify_identity record_sms_consent take_message open_ticket update_lead record_survey_answer confirm_shift record_shift_response record_qualification schedule_callback transfer_to_human record_optout end_call custom_webhook
sms_template_ids
Sms Template Ids
Array<string>
handoff_targets
Handoff Targets
Array<object>
DirectRepHandoffTarget

One server-resolved, immutable direct-rep target in an agent snapshot.

A write request names only rep_id values. Control-api resolves those ids against active, transfer-enabled tenant reps and persists this compact snapshot so an AgentVersion never follows a later mutable Settings record. A raw destination is deliberately not part of this customer/model/runtime representation.

object
rep_id
required
Rep Id
string
>= 1 characters <= 128 characters
display_name
required
Display Name
string
>= 1 characters <= 200 characters
llm_route
Any of:
LlmRoute

Provider routing chain with health-checked failover (CANON fact 24).

LLM chain only. STT and TTS chains are platform-defaulted at P1 and are not API-settable (CANON fact 80), which is what extra="forbid" refuses here.

object
primary
required
Primary
string
>= 1 characters
fallbacks
Fallbacks
Array<string>
disclosure_config
required
Disclosure Config
object
key
additional properties
string
voicemail_config
VoicemailConfig

The tenant’s two slots in a platform-composed voicemail drop (ADR-0023).

This is the DisclosureSlots doctrine applied to voicemail: the customer supplies a body and a callback number, and nothing else. The AI-disclosure opener, the order of the elements, and the identification/opt-out closing are composed by the platform from the same pinned version the live conversation discloses from, so a voicemail and a conversation can never disagree about who is calling or that it is artificial.

body is keyed by language tag exactly as disclosure_config is, and the drop resolves the same tag for both: a message whose opener and body were in different languages would be a disclosure in name only. An empty model is the ordinary state - it means this agent leaves no messages.

object
body
Body
object
key
additional properties
string
callback_e164
Any of:
string
/^\+[1-9]\d{6,14}$/
Example
{
"action_confirmation_policy": "legacy_v0",
"receptionist_release_status": "not_applicable",
"use_case": "sdr",
"conversation_settings": {
"default_language": "en",
"supported_languages": [
"en"
],
"allow_language_switch": true
},
"tools": [
"check_calendar"
]
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}