Projects
A project partitions the workspace. Calls, customers, and segments all belong to one, and the active project decides which set you are working in — most endpoints operate on it implicitly rather than taking a project parameter.
List projects
GET /api/projects
{
"projects": [
{
"id": 1,
"uuid": "p1a2b3c4-d5e6-7890-abcd-ef1234567890",
"name": "Inside sales",
"description": "Outbound SDR calls",
"call_context": "Outbound calls selling ergonomic office furniture to SMBs.",
"is_default": true,
"is_active": true,
"created_at": "2026-08-01T09:00:00Z",
"updated_at": "2026-09-18T11:02:10Z"
}
],
"active_project_uuid": "p1a2b3c4-d5e6-7890-abcd-ef1234567890"
}
active_project_uuid is the caller's own active project, stored per user —
two teammates can work in different projects at the same time.
Create a project
POST /api/projects
{
"name": "Renewals",
"description": "Q4 renewal conversations"
}
201 Created returns the project.
| Status | Cause |
|---|---|
400 | {"detail": "A project with this name already exists"} |
Set the active project
PUT /api/projects/active
{ "project_uuid": "p1a2b3c4-d5e6-7890-abcd-ef1234567890" }
project_uuid is required. Everything that follows — uploads, call lists,
dashboards, reports — operates on this project until it is changed again.
GET /api/calls does not take a project parameter; it returns the active
project's calls. A client that caches results across a project switch will show
the wrong set.
Update a project
PATCH /api/projects/{id}
{
"name": "Renewals FY27",
"description": "Renewal conversations",
"call_context": "Renewal calls to existing customers approaching contract end.",
"is_active": true
}
All four fields are optional; send only what changes. Setting is_active to
false retires a project without deleting its calls.
call_context
The most consequential field. It tells the analysis pipeline what this project's calls are about, and it is fed into extraction and scoring.
Without it, the model has to infer the purpose of the conversation from the transcript alone, and it will infer wrongly on the calls that matter least — short ones, voicemails, wrong numbers. A sentence or two is enough:
Outbound calls selling ergonomic office furniture to small businesses. Reps should qualify budget and identify the decision maker.
Delete a project
DELETE /api/projects/{id} → 204
Deleting a project takes its calls, customers, and segments with it. The default project cannot be removed.
The default project
Every organization gets one on first use, flagged is_default. It exists so
uploads work before anyone has thought about project structure — there is
always somewhere for a call to land.