API reference

LLM

BYOK Anthropic/OpenAI route + completion endpoint.

Upsert route

PUT/v1/llm-routes

Request body

FieldTypeNotes
phone_number_idstring
len 1..∞
providerrequired"anthropic" | "openai"
modelrequiredstring
len 1..∞
api_keyrequiredstring
len 10..∞
system_promptrequiredstring
len 40..∞
max_tokensinteger
range 1..4096
temperaturenumber
range 0..2
daily_cost_cap_brlstring
pattern: ^\d+(\.\d{1,2})?$
handoff_phrasesstring[]
blocked_topicsobject[]
blocked_topic_fallback_responsestring
len 1..1000
max_context_messagesinteger
range 1..100
max_context_age_secondsinteger | null
memory_persistence"disabled" | "opt_in" | "opt_out"
enabledboolean

Response

FieldTypeNotes
idrequiredstring
objectrequired"llm_route"
phone_number_idrequiredstring | null
providerrequired"anthropic" | "openai"
modelrequiredstring
environmentrequired"sandbox" | "production"
system_promptrequiredstring
current_prompt_versionrequiredinteger
range -∞..9007199254740991
max_tokensrequiredinteger
range -∞..9007199254740991
temperaturerequiredstring
daily_cost_cap_brlrequiredstring | null
handoff_phrasesrequiredstring[]
blocked_topicsrequiredobject[]
blocked_topic_fallback_responserequiredstring
max_context_messagesrequiredinteger
range -∞..9007199254740991
max_context_age_secondsrequiredinteger | null
memory_persistencerequired"disabled" | "opt_in" | "opt_out"
enabledrequiredboolean
api_key_suffixrequiredstring
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

Get route

GET/v1/llm-routes

Query

FieldTypeNotes
phone_number_idstring
len 1..∞

Response

FieldTypeNotes
idrequiredstring
objectrequired"llm_route"
phone_number_idrequiredstring | null
providerrequired"anthropic" | "openai"
modelrequiredstring
environmentrequired"sandbox" | "production"
system_promptrequiredstring
current_prompt_versionrequiredinteger
range -∞..9007199254740991
max_tokensrequiredinteger
range -∞..9007199254740991
temperaturerequiredstring
daily_cost_cap_brlrequiredstring | null
handoff_phrasesrequiredstring[]
blocked_topicsrequiredobject[]
blocked_topic_fallback_responserequiredstring
max_context_messagesrequiredinteger
range -∞..9007199254740991
max_context_age_secondsrequiredinteger | null
memory_persistencerequired"disabled" | "opt_in" | "opt_out"
enabledrequiredboolean
api_key_suffixrequiredstring
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

Update route

PATCH/v1/llm-routes

Updates only the supplied fields. Use phone_number_id to target a number-specific route; omit it for the environment default.

Query

FieldTypeNotes
phone_number_idstring
len 1..∞

Request body

FieldTypeNotes
modelstring
len 1..∞
api_keystring
len 10..∞
system_promptstring
len 40..∞
max_tokensinteger
range 1..4096
temperaturenumber
range 0..2
daily_cost_cap_brlstring | null
handoff_phrasesstring[]
blocked_topicsobject[]
blocked_topic_fallback_responsestring
len 1..1000
max_context_messagesinteger
range 1..100
max_context_age_secondsinteger | null
memory_persistence"disabled" | "opt_in" | "opt_out"
enabledboolean

Response

FieldTypeNotes
idrequiredstring
objectrequired"llm_route"
phone_number_idrequiredstring | null
providerrequired"anthropic" | "openai"
modelrequiredstring
environmentrequired"sandbox" | "production"
system_promptrequiredstring
current_prompt_versionrequiredinteger
range -∞..9007199254740991
max_tokensrequiredinteger
range -∞..9007199254740991
temperaturerequiredstring
daily_cost_cap_brlrequiredstring | null
handoff_phrasesrequiredstring[]
blocked_topicsrequiredobject[]
blocked_topic_fallback_responserequiredstring
max_context_messagesrequiredinteger
range -∞..9007199254740991
max_context_age_secondsrequiredinteger | null
memory_persistencerequired"disabled" | "opt_in" | "opt_out"
enabledrequiredboolean
api_key_suffixrequiredstring
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

Prompt-version history

GET/v1/llm-routes/prompt-versions

Returns the immutable system-prompt revision history for the selected route without exposing the provider API key.

Query

FieldTypeNotes
limitrequiredinteger
Maximum number of items to return. Defaults to 20; maximum 100.
range 1..100
starting_afterstring
Opaque cursor from the previous response next_cursor.
phone_number_idstring
len 1..∞

Response

FieldTypeNotes
objectrequired"list"
datarequiredobject[]
has_morerequiredboolean
next_cursorrequiredstring | null

Delete route

DELETE/v1/llm-routes

Request a completion

POST/v1/llm/completions

Request body

FieldTypeNotes
messagesrequiredobject[]
contact_phonestring
pattern: ^\+\d{8,15}$
phone_number_idstring
len 1..∞
trace_idstring

Response

FieldTypeNotes
objectrequired"llm_completion"
contentrequiredstring
modelrequiredstring
tokens_inrequiredinteger
range 0..9007199254740991
tokens_outrequiredinteger
range 0..9007199254740991
cost_brlrequiredstring
provider_cost_usd_estimaterequiredstring | null
handoffrequiredboolean
trace_idrequiredstring

Completion audit log

GET/v1/llm/responses

Lists persisted completion evidence with the exact prompt version, token counts, cost, and trace identifier used for each call.

Query

FieldTypeNotes
limitrequiredinteger
Maximum number of items to return. Defaults to 20; maximum 100.
range 1..100
starting_afterstring
Opaque cursor from the previous response next_cursor.

Response

FieldTypeNotes
objectrequired"list"
datarequiredobject[]
has_morerequiredboolean
next_cursorrequiredstring | null

Provider errors

Provider failures are normalized to stable Tyxter error codes. Correct invalid credentials before retrying; transient provider failures can be retried with the same idempotency key.

HTTPerror.codeMeaning
400llm_provider_auth_failedThe provider rejected the route's BYOK API key with 401 or 403.
502provider_errorThe provider request failed for another reason, such as a network or 5xx error.