05Observe
Storage
Where calls are kept — SQLite, Postgres or MySQL, recordings on disk — and the JSON API over them.
Every call is saved by default: the session, its turns, every event, the summary and both audio channels, in a database and folder you control.
Configure the store
store:
url: sqlite://cuelo.db # or postgres://, mysql://
audio: ./recordings
summary: true # LLM summary when each call ends- SQLite works out of the box. Postgres needs
cuelo[postgres], and MySQL needscuelo[mysql]. - Put passwords in
.envand reference them:postgres://app:${DB_PASSWORD}@db.internal/cuelo. - The store holds sessions, turns, events and summaries. Recordings are WAV
files per side (
user.wav,agent.wav) understore.audio, aligned on the call's timeline.
The dashboard API
The same server exposes read-only JSON over the store. The dashboard uses it, and so can you:
| Route | Returns |
|---|---|
GET /api/sessions?limit=300 | recent sessions |
GET /api/sessions/{id} | one session |
GET /api/sessions/{id}/turns | turns with text and timing |
GET /api/sessions/{id}/events?since=<seq> | events, incrementally |
GET /api/sessions/{id}/metrics | latency distributions and per-turn stats |
GET /api/sessions/{id}/summaries | call summaries |
GET /api/sessions/{id}/audio | recordings |
GET /api/sessions/{id}/audio/{side}.wav | one recording |
GET /api/sessions/{id}/audio/{side}/peaks?buckets=… | waveform peaks |
With API keys configured, these need a key like every other route.
Retention
Cuelo doesn't delete anything on its own. Calls hold audio, transcripts and
tool arguments, which may include personal data, so delete old sessions from
the database and store.audio according to your retention policy. Set
summary: false to skip LLM summaries.