API Reference¶
Speakr provides a comprehensive REST API (v1) for automation tools, dashboard widgets, and custom integrations. This reference documents all available endpoints.
Interactive Documentation
Access the interactive Swagger UI documentation at /api/v1/docs on your Speakr instance. You can test endpoints directly from your browser.
Base URL¶
All API v1 endpoints are prefixed with /api/v1:
Authentication¶
All endpoints require authentication. See API Tokens for details on creating and managing tokens.
OpenAPI Specification¶
| Endpoint | Description |
|---|---|
GET /api/v1/docs | Interactive Swagger UI |
GET /api/v1/openapi.json | OpenAPI 3.0 specification |
Interactive API documentation with Swagger UI at /api/v1/docs
Stats¶
Dashboard-compatible statistics endpoint, designed for integration with homepage widgets like gethomepage.dev.
Get Statistics¶
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
scope | string | user | user for personal stats, all for global (admin only) |
Response:
{
"recordings": {
"total": 150,
"completed": 120,
"processing": 5,
"pending": 20,
"failed": 5
},
"storage": {
"used_bytes": 5368709120,
"used_human": "5.0 GB"
},
"queue": {
"jobs_queued": 3,
"jobs_processing": 1
},
"tokens": {
"used_this_month": 450000,
"budget": 1000000,
"percentage": 45.0
},
"activity": {
"recordings_today": 3,
"last_transcription": "2024-01-15T14:30:00Z"
}
}
gethomepage.dev Widget Configuration
- Speakr:
widget:
type: customapi
url: https://speakr.example.com/api/v1/stats
headers:
Authorization: Bearer YOUR_TOKEN
mappings:
- field: recordings.completed
label: Completed
- field: storage.used_human
label: Storage
- field: tokens.percentage
label: Token Usage
format: percent
- field: activity.recordings_today
label: Today
Recordings¶
List Recordings¶
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
per_page | integer | 25 | Items per page (max: 100) |
status | string | all | Filter: all, pending, processing, completed, failed |
sort_by | string | created_at | Sort field: created_at, meeting_date, title, file_size |
sort_order | string | desc | Sort order: asc, desc |
date_from | string | - | Filter from date (ISO format) |
date_to | string | - | Filter to date (ISO format) |
tag_id | integer | - | Filter by tag ID |
q | string | - | Search query (title, participants) |
inbox | boolean | - | Filter by inbox status |
starred | boolean | - | Filter by starred status |
Response:
{
"recordings": [
{
"id": 123,
"title": "Team Meeting",
"status": "COMPLETED",
"created_at": "2024-01-15T10:00:00Z",
"meeting_date": "2024-01-15T09:00:00Z",
"file_size": 15728640,
"original_filename": "meeting.mp3",
"participants": "Alice, Bob",
"is_inbox": false,
"is_highlighted": true,
"audio_available": true,
"has_transcription": true,
"has_summary": true,
"tags": [
{"id": 1, "name": "Work", "color": "#3B82F6"}
]
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 150,
"total_pages": 6,
"has_next": true,
"has_prev": false
}
}
Get Recording Details¶
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
format | string | full | full or minimal (excludes large text fields) |
include | string | transcription,summary,notes | Comma-separated fields to include |
Response:
{
"id": 123,
"title": "Team Meeting",
"status": "COMPLETED",
"participants": "Alice, Bob",
"created_at": "2024-01-15T10:00:00Z",
"meeting_date": "2024-01-15T09:00:00Z",
"completed_at": "2024-01-15T10:05:00Z",
"file_size": 15728640,
"original_filename": "meeting.mp3",
"mime_type": "audio/mpeg",
"is_inbox": false,
"is_highlighted": true,
"audio_available": true,
"processing_time_seconds": 45.2,
"transcription": "Alice: Hello everyone...",
"summary": "## Meeting Summary\n- Key point 1...",
"notes": "Personal notes...",
"tags": [{"id": 1, "name": "Work", "color": "#3B82F6"}]
}
Transcript Formatting
The transcription field is automatically formatted using your default transcript template. Configure templates in Account Settings → Transcript Templates.
Get Transcript¶
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
format | string | json | Output format: json, text, srt, vtt |
Uses your default transcript template:
Get Summary¶
Response:
Get Notes¶
Response:
Get Processing Status¶
Response:
{
"id": 123,
"status": "PROCESSING",
"queue_position": 2,
"error_message": null,
"completed_at": null
}
Status Values:
| Status | Description |
|---|---|
PENDING | Waiting in queue |
PROCESSING | Transcription in progress |
SUMMARIZING | Summary generation in progress |
COMPLETED | Processing finished successfully |
FAILED | Processing failed (check error_message) |
Update Recording¶
Request Body:
{
"title": "Updated Title",
"participants": "Alice, Bob, Charlie",
"notes": "Updated notes...",
"summary": "Updated summary...",
"meeting_date": "2024-01-15T09:00:00Z",
"is_inbox": false,
"is_highlighted": true
}
All fields are optional.
Replace Notes¶
Request Body:
Replace Summary¶
Request Body:
Delete Recording¶
Response:
Tags¶
List Tags¶
Returns both personal tags and group tags you have access to.
Response:
{
"tags": [
{
"id": 1,
"name": "Work Meetings",
"color": "#3B82F6",
"is_group_tag": false,
"group_id": null,
"custom_prompt": "Focus on action items...",
"default_language": "en",
"default_min_speakers": 2,
"default_max_speakers": 10,
"protect_from_deletion": false,
"can_edit": true
}
]
}
Create Tag¶
Request Body:
{
"name": "Interviews",
"color": "#10B981",
"custom_prompt": "Extract candidate qualifications...",
"default_language": "en",
"default_min_speakers": 2,
"default_max_speakers": 3,
"group_id": null
}
Update Tag¶
Request Body:
Delete Tag¶
Add Tags to Recording¶
Request Body:
Remove Tag from Recording¶
Speakers¶
List Speakers¶
Response:
{
"speakers": [
{
"id": 1,
"name": "John Doe",
"use_count": 45,
"last_used": "2024-01-15T14:30:00Z",
"confidence_score": 0.87,
"has_voice_profile": true
}
]
}
Create Speaker¶
Request Body:
Update Speaker¶
Updates the speaker name and cascades changes to all recordings.
Request Body:
Delete Speaker¶
Get Recording Speakers¶
Returns speakers in the recording with voice-based identification suggestions.
Response:
{
"speakers": [
{
"label": "SPEAKER_00",
"identified_name": "John Doe",
"speaker_id": 1,
"segment_count": 23
}
],
"suggestions": {
"SPEAKER_01": [
{"speaker_id": 2, "name": "Jane Smith", "similarity": 89.5}
]
}
}
Processing Operations¶
Queue Transcription¶
Request Body:
All parameters are optional.
Response:
Queue Summarization¶
Request Body:
The custom prompt overrides the recording's tag prompts and user defaults.
Chat¶
Chat with Recording¶
Ask questions about a recording's content using AI.
Request Body:
{
"message": "What were the main action items discussed?",
"conversation_history": [
{"role": "user", "content": "Who attended?"},
{"role": "assistant", "content": "John and Jane attended..."}
]
}
Response:
{
"response": "The main action items were:\n1. Complete the report by Friday\n2. Schedule follow-up meeting...",
"sources": []
}
Events¶
Get Calendar Events¶
Returns calendar events extracted from the recording.
Response:
{
"events": [
{
"id": 1,
"title": "Follow-up Meeting",
"start_datetime": "2024-01-22T10:00:00Z",
"end_datetime": "2024-01-22T11:00:00Z",
"description": "Discuss project progress",
"location": "Conference Room A"
}
]
}
Download Events as ICS¶
Returns an ICS file containing all events from the recording.
Audio¶
Download Audio¶
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
download | boolean | false | true to force download, false to stream |
Batch Operations¶
Batch Update Recordings¶
Request Body:
{
"recording_ids": [1, 2, 3],
"updates": {
"is_inbox": false,
"is_highlighted": true,
"add_tag_ids": [5],
"remove_tag_ids": [2]
}
}
Response:
{
"success": true,
"updated": 3,
"failed": 0,
"results": [
{"id": 1, "success": true},
{"id": 2, "success": true},
{"id": 3, "success": true}
]
}
Batch Delete Recordings¶
Request Body:
Batch Queue Transcriptions¶
Request Body:
Error Responses¶
All endpoints return consistent error responses:
Common HTTP Status Codes:
| Code | Description |
|---|---|
200 | Success |
201 | Created |
400 | Bad Request - Invalid parameters |
401 | Unauthorized - Invalid or missing token |
403 | Forbidden - No permission for this resource |
404 | Not Found - Resource doesn't exist |
500 | Internal Server Error |
Rate Limits¶
API endpoints are rate-limited to prevent abuse:
| Endpoint Type | Limit |
|---|---|
| Stats | 60 requests/minute |
| GET endpoints | 100 requests/minute |
| PATCH/DELETE | 30 requests/minute |
| Processing operations | 10 requests/minute |
| Batch operations | 10 requests/minute |
Integration Examples¶
Python SDK Pattern¶
import requests
class SpeakrAPI:
def __init__(self, base_url, token):
self.base_url = base_url.rstrip('/')
self.session = requests.Session()
self.session.headers['Authorization'] = f'Bearer {token}'
def get_stats(self):
return self.session.get(f'{self.base_url}/api/v1/stats').json()
def list_recordings(self, status='all', page=1):
return self.session.get(
f'{self.base_url}/api/v1/recordings',
params={'status': status, 'page': page}
).json()
def get_transcript(self, recording_id, format='text'):
return self.session.get(
f'{self.base_url}/api/v1/recordings/{recording_id}/transcript',
params={'format': format}
).json()
# Usage
api = SpeakrAPI('https://speakr.example.com', 'YOUR_TOKEN')
stats = api.get_stats()
print(f"Total recordings: {stats['recordings']['total']}")
n8n Workflow¶
- Use HTTP Request node
- Set Method to
GET - Set URL to
https://your-instance/api/v1/recordings - In Authentication, select Header Auth
- Add header:
Authorization=Bearer YOUR_TOKEN
Zapier Integration¶
Use the Webhooks by Zapier app with:
- Trigger: Custom webhook
- Action: GET request to
/api/v1/recordings - Headers:
Authorization: Bearer YOUR_TOKEN
Next: Learn about API Tokens for authentication setup.