LLM
BYOK Anthropic/OpenAI route + completion endpoint.
Upsert route
PUT/v1/llm-routes
Request body
| Field | Type | Notes |
|---|---|---|
phone_number_id | string | len 1..∞ |
providerrequired | "anthropic" | "openai" | |
modelrequired | string | len 1..∞ |
api_keyrequired | string | len 10..∞ |
system_promptrequired | string | len 40..∞ |
max_tokens | integer | range 1..4096 |
temperature | number | range 0..2 |
daily_cost_cap_brl | string | pattern: ^\d+(\.\d{1,2})?$ |
handoff_phrases | string[] | |
blocked_topics | object[] | |
blocked_topic_fallback_response | string | len 1..1000 |
max_context_messages | integer | range 1..100 |
max_context_age_seconds | integer | null | |
memory_persistence | "disabled" | "opt_in" | "opt_out" | |
enabled | boolean |
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "llm_route" | |
phone_number_idrequired | string | null | |
providerrequired | "anthropic" | "openai" | |
modelrequired | string | |
environmentrequired | "sandbox" | "production" | |
system_promptrequired | string | |
current_prompt_versionrequired | integer | range -∞..9007199254740991 |
max_tokensrequired | integer | range -∞..9007199254740991 |
temperaturerequired | string | |
daily_cost_cap_brlrequired | string | null | |
handoff_phrasesrequired | string[] | |
blocked_topicsrequired | object[] | |
blocked_topic_fallback_responserequired | string | |
max_context_messagesrequired | integer | range -∞..9007199254740991 |
max_context_age_secondsrequired | integer | null | |
memory_persistencerequired | "disabled" | "opt_in" | "opt_out" | |
enabledrequired | boolean | |
api_key_suffixrequired | string | |
created_atrequired | string<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_atrequired | string<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
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "llm_route" | |
phone_number_idrequired | string | null | |
providerrequired | "anthropic" | "openai" | |
modelrequired | string | |
environmentrequired | "sandbox" | "production" | |
system_promptrequired | string | |
current_prompt_versionrequired | integer | range -∞..9007199254740991 |
max_tokensrequired | integer | range -∞..9007199254740991 |
temperaturerequired | string | |
daily_cost_cap_brlrequired | string | null | |
handoff_phrasesrequired | string[] | |
blocked_topicsrequired | object[] | |
blocked_topic_fallback_responserequired | string | |
max_context_messagesrequired | integer | range -∞..9007199254740991 |
max_context_age_secondsrequired | integer | null | |
memory_persistencerequired | "disabled" | "opt_in" | "opt_out" | |
enabledrequired | boolean | |
api_key_suffixrequired | string | |
created_atrequired | string<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_atrequired | string<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)))$ |
Delete route
DELETE/v1/llm-routes
Request a completion
POST/v1/llm/completions
Request body
| Field | Type | Notes |
|---|---|---|
messagesrequired | object[] | |
contact_phone | string | pattern: ^\+\d{8,15}$ |
phone_number_id | string | len 1..∞ |
trace_id | string |
Response
| Field | Type | Notes |
|---|---|---|
objectrequired | "llm_completion" | |
contentrequired | string | |
modelrequired | string | |
tokens_inrequired | integer | range 0..9007199254740991 |
tokens_outrequired | integer | range 0..9007199254740991 |
cost_brlrequired | string | |
provider_cost_usd_estimaterequired | string | null | |
handoffrequired | boolean | |
trace_idrequired | string |
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.
| HTTP | error.code | Meaning |
|---|---|---|
| 400 | llm_provider_auth_failed | The provider rejected the route's BYOK API key with 401 or 403. |
| 502 | provider_error | The provider request failed for another reason, such as a network or 5xx error. |