Skip to main content

Characters API

Create and manage AI characters. Characters define the persona, voice, language model, and actions for a conversational AI agent.

Base path: /api/v1/characters


Create a Character

POST /api/v1/characters

All configuration sections are optional -- sensible defaults are applied.

Request Body

{
"persona": {
"name": "Axiom",
"tagline": "Curious marine researcher",
"personality": "You are Axiom, an enthusiastic axolotl and marine researcher.",
"background": "Axiom has spent three years studying bioluminescent organisms."
},
"llm": {
"model": "gpt-5-mini",
"temperature": 0.8
},
"tts": {
"voice_preset": "MF3mGyEYCl7XYWbV9V6O"
},
"actions": [
{ "name": "follow_user", "description": "Start following the user" },
{ "name": "stop_following_user", "description": "Stop following the user" }
]
}

persona object

FieldTypeDefaultDescription
namestring"New Character"Display name (1-255 chars)
taglinestringnullShort description (max 500 chars)
personalitystringnullHow the character speaks and behaves (max 5000 chars)
backgroundstringnullBackstory and lore (max 32000 chars)
system_promptstringnullFull system prompt override -- replaces the auto-generated prompt

llm object

FieldTypeDefaultDescription
providerstring"openai"LLM provider
modelstring"gpt-5-mini"Model name
temperaturenumber0.7Sampling temperature (0-2)
max_tokensinteger2048Max response tokens (1-4096)
verbositystring"medium"Response length: "short", "medium", "long"

tts object

FieldTypeDefaultDescription
providerstring"elevenlabs"TTS provider
modelstring"eleven_flash_v2_5"TTS model
voicestringnullElevenLabs voice ID
voice_presetstringnullVoice preset ID (takes priority over voice)
speednumber1.0Playback speed (0.5-2.0)

stt object

FieldTypeDefaultDescription
providerstring"deepgram"STT provider
languagestring"en"Language code (ISO 639-1)

vad object

FieldTypeDefaultDescription
sensitivitynumber0.5VAD sensitivity (0-1)
min_speech_duration_msinteger250Min speech duration in ms (50-2000)

vlm object

FieldTypeDefaultDescription
modelstring"gpt-4.1-mini"Vision-language model for image understanding

Top-level fields

FieldTypeDefaultDescription
text_onlybooleanautoSkip TTS. Auto-detected from voice config if omitted
verbosebooleanfalseEnable verbose logging
is_publicbooleanfalseWhether the character is publicly listed
avatarstringnullAvatar identifier or URL
actionsarraynullActions the character can invoke
document_idsarraynullIDs of uploaded PDFs to attach as a knowledge bank

actions array

Each action object:

FieldTypeRequiredDescription
namestringYesAction identifier (snake_case)
descriptionstringNoWhat the action does
parametersarrayNoParameters the action accepts

Each parameter object:

FieldTypeDefaultDescription
namestringrequiredParameter name
typestring"string""string", "number", or "boolean"
requiredbooleanfalseWhether the parameter is required
descriptionstringnullParameter description

Response

Status: 201 Created

Returns a Character object.

Examples

curl -X POST https://api.estuary-ai.com/api/v1/characters \
-H "X-API-Key: est_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"persona": {
"name": "Sage",
"personality": "A wise and patient mentor who speaks in calm, measured tones."
},
"tts": { "voice_preset": "MF3mGyEYCl7XYWbV9V6O" },
"llm": { "temperature": 0.6 }
}'
const res = await fetch("https://api.estuary-ai.com/api/v1/characters", {
method: "POST",
headers: {
"X-API-Key": "est_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
persona: {
name: "Sage",
personality: "A wise and patient mentor who speaks in calm, measured tones.",
},
tts: { voice_preset: "MF3mGyEYCl7XYWbV9V6O" },
llm: { temperature: 0.6 },
}),
});
const character = await res.json();
console.log(character.id); // use this as character_id

List Characters

GET /api/v1/characters

Returns a paginated list of your characters, ordered by creation date (newest first).

ParameterTypeDefaultDescription
limitinteger20Results per page (1-100)
offsetinteger0Number of results to skip

Response

{
"characters": [ /* Character objects */ ],
"total": 42,
"limit": 20,
"offset": 0
}

Example

curl "https://api.estuary-ai.com/api/v1/characters?limit=10" \
-H "X-API-Key: est_your_api_key"

Get a Character

GET /api/v1/characters/{character_id}

Example

curl https://api.estuary-ai.com/api/v1/characters/550e8400-e29b-41d4-a716-446655440000 \
-H "X-API-Key: est_your_api_key"

Response

Returns a Character object.


Update a Character

PUT /api/v1/characters/{character_id}

Only provided fields are updated -- omitted fields keep their current values. The request body accepts the same fields as Create.

Example

curl -X PUT https://api.estuary-ai.com/api/v1/characters/550e8400-e29b-41d4-a716-446655440000 \
-H "X-API-Key: est_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"persona": { "name": "Sage v2" },
"llm": { "temperature": 0.9 }
}'

Response

Status: 200 OK

Returns the updated Character object.


Delete a Character

DELETE /api/v1/characters/{character_id}

Permanently deletes a character and all associated data (conversations, messages, documents).

Example

curl -X DELETE https://api.estuary-ai.com/api/v1/characters/550e8400-e29b-41d4-a716-446655440000 \
-H "X-API-Key: est_your_api_key"

Response

{
"deleted": true,
"id": "550e8400-e29b-41d4-a716-446655440000"
}

Character Object

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Sage",
"tagline": "A wise mentor",
"personality": "A wise and patient mentor...",
"background": null,
"avatar": null,
"system_prompt": null,
"voice_preset": "MF3mGyEYCl7XYWbV9V6O",
"tts_provider": "elevenlabs",
"tts_model": "eleven_flash_v2_5",
"tts_voice": null,
"tts_speed": 1.0,
"vlm_model": "gpt-4.1-mini",
"llm_provider": "openai",
"llm_model": "gpt-5-mini",
"llm_temperature": 0.6,
"llm_max_tokens": 2048,
"llm_verbosity": "medium",
"stt_provider": "deepgram",
"stt_language": "en",
"vad_sensitivity": 0.5,
"vad_min_speech_duration_ms": 250,
"text_only": false,
"verbose": false,
"actions": [
{
"name": "wave",
"description": "Wave at the user"
}
],
"is_public": false,
"is_active": false,
"launch_status": "stopped",
"created_at": "2026-01-15T10:30:00",
"updated_at": "2026-01-15T10:30:00"
}
FieldTypeDescription
idstringCharacter UUID -- use as character_id in SDK connections and as agent_id in Conversations/Memories APIs
namestringDisplay name
taglinestring | nullShort description
personalitystring | nullPersonality description
backgroundstring | nullBackstory
avatarstring | nullAvatar URL
system_promptstring | nullSystem prompt override
voice_presetstring | nullVoice preset ID
tts_providerstringTTS provider
tts_modelstringTTS model
tts_voicestring | nullTTS voice ID
tts_speednumberPlayback speed
vlm_modelstringVision model
llm_providerstringLLM provider
llm_modelstringLLM model
llm_temperaturenumberSampling temperature
llm_max_tokensintegerMax tokens
llm_verbositystringResponse length preference
stt_providerstringSTT provider
stt_languagestringLanguage code
vad_sensitivitynumberVAD sensitivity
vad_min_speech_duration_msintegerMin speech duration
text_onlybooleanWhether TTS is disabled
verbosebooleanVerbose logging
actionsarrayConfigured actions
is_publicbooleanPublicly listed
is_activebooleanCurrently running
launch_statusstring"stopped", "starting", or "running"
created_atstringISO 8601 timestamp
updated_atstringISO 8601 timestamp