OpenPlaud API reference for all endpoints.
http://localhost:3000/api
All authenticated endpoints require a valid session cookie set by Better Auth.
Health check endpoint.
Response:
{
"status": "ok",
"timestamp": "2025-01-22T12:00:00.000Z"
}Create a new user account.
Body:
{
"email": "user@example.com",
"password": "securepassword",
"name": "John Doe"
}Sign in to existing account.
Body:
{
"email": "user@example.com",
"password": "securepassword"
}Sign out current user.
Connect Plaud device using bearer token.
Body:
{
"bearerToken": "Bearer eyJhbGc..."
}Response:
{
"success": true,
"devices": [...]
}Get current Plaud connection status.
Response:
{
"connected": true,
"lastSync": "2025-01-22T12:00:00.000Z",
"devices": [...]
}Manually trigger sync of recordings from Plaud device.
Response:
{
"success": true,
"newRecordings": 5,
"updatedRecordings": 2,
"errors": []
}List all recordings for current user.
Query Parameters:
limit(optional): Number of results (default: 50)offset(optional): Pagination offset (default: 0)
Response:
{
"recordings": [
{
"id": "abc123",
"filename": "Meeting Notes",
"duration": 3600000,
"startTime": "2025-01-22T10:00:00.000Z",
"filesize": 15728640,
"deviceSn": "888317426694681884"
}
],
"total": 100
}Get single recording by ID.
Response:
{
"id": "abc123",
"filename": "Meeting Notes",
"duration": 3600000,
"startTime": "2025-01-22T10:00:00.000Z",
"transcription": {...},
"aiEnhancements": {...}
}Stream audio file.
Headers:
Range: Optional byte range (e.g.,bytes=0-1023)
Response:
- Content-Type: audio/mpeg, audio/opus, etc.
- Supports HTTP range requests (206 Partial Content)
Transcribe a recording.
Body:
{
"provider": "openai",
"model": "whisper-1"
}Response:
{
"success": true,
"transcriptionId": "xyz789",
"text": "Transcribed text...",
"detectedLanguage": "en"
}Get user settings.
Response:
{
"autoTranscribe": false,
"emailNotifications": true,
"notificationEmail": "user@example.com",
"syncInterval": 300000,
"defaultPlaybackSpeed": 1.0
}Update user settings.
Body:
{
"autoTranscribe": true,
"emailNotifications": true
}Configure storage provider.
Body:
{
"storageType": "s3",
"s3Config": {
"endpoint": "https://...",
"bucket": "openplaud",
"region": "us-east-1",
"accessKeyId": "...",
"secretAccessKey": "..."
}
}List AI providers.
Response:
{
"providers": [
{
"id": "xyz",
"provider": "openai",
"baseUrl": null,
"defaultModel": "whisper-1",
"isDefaultTranscription": true
}
]
}Add new AI provider.
Body:
{
"provider": "groq",
"apiKey": "gsk_...",
"baseUrl": "https://api.groq.com/openai/v1",
"defaultModel": "whisper-large-v3",
"isDefaultTranscription": true
}Update AI provider.
Delete AI provider.
Send test email to verify SMTP configuration.
Body:
{
"email": "user@example.com"
}Export recordings in various formats.
Query Parameters:
format: json | txt | srt | vtt
Response:
- File download
Create backup of all user data.
Response:
{
"success": true,
"backupUrl": "/backups/user_20250122_120000.zip"
}All errors follow this format:
{
"error": "Error message",
"code": "ERROR_CODE"
}UNAUTHORIZED: Not authenticatedFORBIDDEN: Insufficient permissionsNOT_FOUND: Resource not foundINVALID_INPUT: Validation failedPLAUD_API_ERROR: Plaud API failureTRANSCRIPTION_FAILED: Transcription errorSTORAGE_ERROR: Storage operation failedEMAIL_SEND_FAILED: Email notification failedINTERNAL_ERROR: Server error
Rate limiting is not currently enforced but may be added in future versions.
Webhooks are not currently supported but are planned for a future release.
Currently, no official SDK is available. The API is RESTful and can be consumed by any HTTP client.
Example with JavaScript:
// Fetch recordings
const response = await fetch('/api/recordings', {
credentials: 'include' // Include session cookie
});
const data = await response.json();For more details, see the source code in src/app/api/.