Core REST API
REST API contracts for the Core service.
Core REST API
GET /meetings/{id}/audio-url
Returns a short-lived signed URL for direct audio playback from Cloud Storage.
| Auth | bearerAuth |
| Cache-Control | private, no-store |
| Response | 200 { url: string, expires_at: string } |
| Errors | 404 meeting not found; 404 meeting has no audio |
POST /meetings
Creates a meeting. Set source_type: "recording" for live recordings.
| Auth | bearerAuth |
| Idempotency | Idempotency-Key: <uuid> header required |
| Echo suppression | X-Client-Id: <uuid> header |
| Response | 201 Created with full Meeting body |
PATCH /meetings/{id}
Partially updates meeting metadata. Used by ML to set the headline after post-meeting processing.
| Auth | bearerAuth or serviceAuth |
| Echo suppression | X-Client-Id: <uuid> header |
| Response | 200 with full Meeting body |
| Side effects | Broadcasts EntityChanged { entity: meeting, action: updated } |
POST /meetings/{id}/speaker-labels
Action endpoint that associates an AssemblyAI speaker label with a known Person. Triggers a bulk person_id update across all segments sharing that label and enriches the Person's voice embedding.
| Auth | bearerAuth |
| Idempotency | Idempotency-Key: <uuid> header required |
| Echo suppression | X-Client-Id: <uuid> header |
| Response | 200 { updated_count: integer } |
| Errors | 404 meeting not found; 422 person_id does not exist; 422 speaker_label not found in this meeting's transcript |
Request body:
{
"speaker_label": "Speaker A",
"person_id": "uuid"
}Side effects:
- All
transcript_segmentswithspeaker_label = "Speaker A"receiveperson_id - Person's
voice_vectorupdated from aggregated segmentfeature_vectorvalues EntityChanged { entity: transcript_segment, action: updated }broadcast (echo-suppressed)EntityChanged { entity: person, action: updated }broadcast (echo-suppressed)
PUT /meetings/{id}/synthesis
Atomically replaces the meeting's AI-generated synthesis. Called by ML after post-meeting processing.
| Auth | serviceAuth |
| Echo suppression | X-Client-Id: <uuid> header |
| Response | 204 No Content |
| Side effects | Broadcasts EntityChanged { entity: meeting, action: updated } |
POST /meetings/{id}/talking-points
Creates a talking point for a meeting. Called by ML to deliver live insights per finalised segment.
| Auth | serviceAuth |
| Idempotency | Idempotency-Key: <uuid> header required |
| Echo suppression | X-Client-Id: <uuid> header |
| Response | 201 Created with full TalkingPoint body |
| Side effects | Broadcasts TalkingPointEvent on WebSocket |
POST /transcriptions/{transcriptionId}/segments
Appends transcript segments to a transcription. Used on the live path.
| Auth | serviceAuth |
| Response | 204 No Content |
| Side effects | Broadcasts TranscriptSegmentEvent on WebSocket for each final segment |
PUT /transcriptions/{transcriptionId}/segments
Atomically replaces all segments for a transcription. Used by the post-meeting batch worker.
| Auth | serviceAuth |
| Response | 204 No Content |
| Errors | 404 transcription not found; 409 transcription is still in processing state |
| Side effects | Deletes existing segments, inserts new set, broadcasts EntityChanged { entity: transcript_segment } |
DELETE /meetings/{meetingId}/tasks?source=system
Deletes all system-generated tasks for a meeting. Used by the post-meeting worker when re-extracting tasks.
| Auth | serviceAuth |
| Response | 204 No Content |