Integrate Interprivo real-time voice translation into your applications.
All API requests must include an Authorization header with a Bearer token. Generate API keys in Settings → Developer.
Authorization: Bearer ip_live_•••••••••••••••• # Keys are prefixed: ip_live_ (production) or ip_test_ (testing)
X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.| HTTP Status | code | Meaning |
|---|---|---|
| 400 | BAD_REQUEST | Missing or invalid request body / parameters |
| 401 | UNAUTHORIZED | Missing or invalid API key / session token |
| 403 | FORBIDDEN | Authenticated but lacking required org role |
| 404 | NOT_FOUND | Resource does not exist or is not accessible |
| 409 | CONFLICT | Resource state conflict (e.g. session already ended) |
| 422 | UNPROCESSABLE | Request understood but semantically invalid |
| 429 | RATE_LIMITED | Rate limit exceeded — back off and retry |
| 500 | INTERNAL_ERROR | Server-side failure — contact support |
| 501 | NOT_IMPLEMENTED | Feature planned but not yet available |
// Error response shape
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after 30 seconds."
}
}Create a new real-time translation session. Returns a LiveKit room token for WebRTC audio connection.
source_lang(string, required)— BCP-47 language code for the speaker (e.g. "en", "es-MX")target_lang(string, required)— BCP-47 language code for the translation outputspeaker_name(string, optional)— Display name shown in transcript (default: "Speaker")organization_id(string, optional)— Target org if the user belongs to multiple organizations{
"sessionId": "sess_01j9x...",
"roomToken": "eyJ...",
"liveKitUrl": "wss://your-project.livekit.cloud"
}Each minute of real-time translation counts against your plan quota. Overage is metered via Stripe.
List sessions for the authenticated user's organization. Supports pagination.
limit(number, optional)— Max results to return (default 20, max 100)offset(number, optional)— Offset for pagination (default 0){
"sessions": [
{
"id": "sess_01j9x...",
"status": "completed",
"source_lang": "en",
"target_lang": "es",
"started_at": "2026-04-11T14:00:00Z",
"ended_at": "2026-04-11T14:22:00Z",
"duration_seconds": 1320
}
],
"total": 42
}Retrieve AI-generated intelligence for a completed session: sentiment, topics, action items, confidence metrics.
id(string, required)— Session ID{
"overallSentiment": "positive",
"sentimentScore": 0.6,
"extractedTopics": ["contract", "deadline", "friday"],
"actionItems": ["Finalize the contract by Friday."],
"urgencyLevel": "standard",
"transcriptCount": 24,
"speakerCount": 2,
"averageConfidence": 0.94,
"averageLatencyMs": 312,
"durationSeconds": 1320
}Initiate an outbound PSTN call for a live session via Vapi. Requires owner or admin role. Beta — API workflow only.
id(string, required)— Active session IDphoneNumber(string, required)— E.164 format (e.g. "+14155550199")assistantId(string, optional)— Override the default Vapi assistant for this call{ "callId": "vapi_call_01j9x...", "status": "initiated" }VAPI_API_KEY and VAPI_ASSISTANT_ID must be configured in environment variables.
Escalate a live session to a human interpreter queue. Triggers Slack notification if configured.
id(string, required)— Active session IDreason(string, optional)— Escalation reason (stored in audit log){ "escalationId": "esc_01j9x...", "queuePosition": 1 }List all currently active sessions in the authenticated user's organization.
{
"sessions": [
{
"id": "sess_01j9x...",
"status": "active",
"source_lang": "en",
"target_lang": "fr",
"started_at": "2026-04-11T14:00:00Z",
"participants": [{ "user_id": "usr_...", "role": "member" }]
}
]
}Remove a participant from an active session. Requires owner or admin role. The participant is disconnected from the LiveKit room.
id(string, required)— Session IDparticipantId(string, required)— User ID of the participant to revoke{ "success": true }Custom glossary terms improve STT accuracy for industry-specific vocabulary (medical, legal, technical).
List all glossary terms for the authenticated organization.
{
"terms": [
{ "id": "gloss_01j9x...", "source_term": "myocardial", "target_term": "miocardial", "language_pair": "en-es" }
]
}Create a new glossary term.
source_term(string, required)— Term in the source languagetarget_term(string, required)— Translation in the target languagelanguage_pair(string, required)— BCP-47 pair (e.g. "en-es"){ "id": "gloss_01j9x...", "source_term": "myocardial", "target_term": "miocardial" }Update an existing glossary term.
id(string, required)— Glossary term IDsource_term(string, optional)— Updated source termtarget_term(string, optional)— Updated translation{ "id": "gloss_01j9x...", "source_term": "...", "target_term": "..." }Delete a glossary term.
id(string, required)— Glossary term ID{ "success": true }Bulk-import glossary terms from a CSV or TXT file. Max 5,000 rows, 1 MB. Requires admin or owner role.
file(File (multipart/form-data), required)— CSV with columns: source_term, target_term, language_pair{ "imported": 142, "skipped": 3, "errors": [] }List all API keys for the authenticated organization (key values are masked after creation).
{
"keys": [
{ "id": "key_01j9x...", "name": "Production Key", "key_prefix": "ip_live_••••", "created_at": "2026-04-01T00:00:00Z", "last_used_at": null }
]
}Create a new API key. The full key value is returned only once — store it securely.
name(string, required)— Human-readable label (e.g. "Production Key"){ "id": "key_01j9x...", "name": "Production Key", "key": "ip_live_..." }The key value is shown only at creation time. If lost, delete and create a new key.
Rotate an API key: invalidates the current key and returns a new one with the same name. Requires owner or admin role.
id(string, required)— Key ID to rotate{ "id": "key_01j9x...", "name": "Production Key", "key": "ip_live_..." }Revoke and permanently delete an API key. Any requests using this key will immediately return 401.
id(string, required)— Key ID to delete{ "success": true }List up to 24 recent invoices for the organization. Requires owner or admin role.
{
"invoices": [
{
"id": "in_1...",
"number": "INV-0001",
"status": "paid",
"amountPaid": 49.00,
"currency": "USD",
"createdAt": "2026-04-01T00:00:00Z",
"hostedInvoiceUrl": "https://invoice.stripe.com/...",
"invoicePdf": "https://pay.stripe.com/..."
}
]
}Interprivo accepts inbound webhooks from Stripe and Vapi. Configure the endpoints in each provider's dashboard.
| Endpoint | Provider | Events handled |
|---|---|---|
| /api/webhooks/stripe | Stripe | checkout.session.completed, invoice.payment_succeeded, invoice.payment_failed, customer.subscription.deleted, customer.subscription.updated |
| /api/webhooks/vapi | Vapi | call-started, call-ended, transcript, hang (PSTN call lifecycle events) |
Webhook security: Stripe uses signature verification via STRIPE_WEBHOOK_SECRET. Vapi uses a shared secret via VAPI_WEBHOOK_SECRET in the x-vapi-secret header.
Basic liveness probe. Returns 200 when the service is running. No authentication required.
{ "status": "ok", "version": "1.0.0", "timestamp": "2026-04-11T14:00:00Z" }Readiness probe checking database connectivity and environment configuration. Returns 503 if any dependency is unhealthy.
{
"status": "healthy",
"checks": {
"database": "ok",
"environment": "ok"
},
"timestamp": "2026-04-11T14:00:00Z"
}// Create a session and connect to the LiveKit room
const response = await fetch('https://interprivo.net/api/sessions', {
method: 'POST',
headers: {
'Authorization': 'Bearer ip_live_<your_key>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
source_lang: 'en',
target_lang: 'es',
speaker_name: 'Dr. Smith',
}),
});
const { sessionId, roomToken, liveKitUrl } = await response.json();
// Use the LiveKit SDK to join the room
const room = new Room();
await room.connect(liveKitUrl, roomToken);
console.log('Connected to translation room:', sessionId);For complete SDK examples and language bindings, see the LiveKit documentation. For questions or API access, contact support@interprivo.net.