Developers
Tõlk.fm Public API
Tõlk.fm Public API is a REST interface for partner products to programmatically create translation events, launch live sessions, and retrieve public listener links for audiences. Integrate real-time voice translation into your applications and automated workflows without building interpretation infrastructure yourself. Keys are profile-scoped and billed against your existing prepaid wallet.
How do I authenticate?
Create an API key in the dashboard under Developers. Send it on every request with a Bearer token. Use server-to-server calls only — do not embed keys in browser apps.
Authorization: Bearer sk_live_...
| Scope | Access |
|---|---|
| events:read | List/get events, read session status |
| events:write | Create events, add language channels |
| sessions:launch | Launch and stop translation sessions |
What can you build?
Use the API to wire Tõlk.fm into registration flows, venue apps, AV automation, partner dashboards, and bespoke multilingual experiences. Each launch returns a streamUrl — the public browser page where listeners pick a language and hear translated audio in real time.
For livestreams and broadcast-style programs, use streamDelivery: "both" on launch to receive browser streamUrl links and tokenized directStreamLinks (WebSocket PCM16, HLS/AAC, RTMP pull) for OBS, vMix, and Castr.
How do I get started?
1. Create an event
curl -X POST https://api.tolk.fm//v1/events \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Product launch",
"sourceLanguage": "en",
"targetLanguages": ["es", "de"],
"translationProvider": "openai"
}'2. Launch translation
curl -X POST https://api.tolk.fm//v1/events/{eventId}/launch \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "mode": "live", "streamDelivery": "both" }'Returns streamUrl (browser listeners) and/or directStreamLinks (WebSocket, HLS, RTMP on the media worker).
What endpoints are available?
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /v1/whoami | events:read | Introspect current key |
| GET | /v1/events | events:read | List events |
| POST | /v1/events | events:write | Create event |
| GET | /v1/events/{id} | events:read | Get event |
| POST | /v1/events/{id}/channels | events:write | Add target language |
| POST | /v1/events/{id}/launch | sessions:launch | Go live; streamUrl and/or directStreamLinks |
| POST | /v1/events/{id}/direct-stream-links | events:read | Mint WebSocket/HLS/RTMP links |
| POST | /v1/events/{id}/stop | sessions:launch | Stop session |
| GET | /v1/events/{id}/status | events:read | Status; optional directStreamLinks |
How are errors returned?
{
"error": {
"code": "insufficient_balance",
"message": "Insufficient wallet balance...",
"requestId": "uuid"
}
}Common codes: unauthorized, insufficient_scope, insufficient_balance, validation_error, rate_limit_exceeded.
Rate limits & billing
Each API key has a requests-per-minute limit (default 60) and a max concurrent live events limit (default 3). API-launched sessions use the same prepaid wallet and per-channel-minute pricing as dashboard launches.