Referencia API
Integra la traducción y transcripción de Morlivo en tu aplicación con unas pocas líneas de código.
https://api.morlivo.ai
Autenticación: Authorization: Bearer mrl_...
Autenticación
Todas las solicitudes API requieren un token Bearer. Obtén tu clave API desde el panel en Configuración.
Authorization: Bearer mrl_your_api_key_here
Las claves API comienzan con mrl_. Mantenlas en secreto. Rotalas desde el panel si se ven comprometidas.
/v1/translate
Traduce texto de un idioma a otro. El idioma de origen se detecta automáticamente si se omite.
Cuerpo de la solicitud JSON
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
text | string | sí | Texto para traducir |
target_language | string | sí | Código ISO 639-1 (ej. es, fr, de) |
source_language | string | no | Detección automática si se omite |
project_id | integer | no | Aplicar glosario y estilo del proyecto |
formality | string | no | Register: formal, informal, or default |
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
translated_text | string | El texto traducido |
source_language | string | Idioma de origen detectado o proporcionado |
target_language | string | Código de idioma de destino |
confidence | float | Puntuación de calidad 0.0 - 1.0 |
validation | object | Resultados de validación de calidad |
Ejemplos
curl -X POST https://api.morlivo.ai/api/v1/translate \
-H "Authorization: Bearer mrl_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, world!",
"target_language": "es"
}'
import httpx
resp = httpx.post(
"https://api.morlivo.ai/api/v1/translate",
headers={"Authorization": "Bearer mrl_your_key"},
json={
"text": "Hello, world!",
"target_language": "es",
},
)
data = resp.json()
print(data["translated_text"])
# → "¡Hola, mundo!"
const resp = await fetch(
"https://api.morlivo.ai/api/v1/translate",
{
method: "POST",
headers: {
"Authorization": "Bearer mrl_your_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "Hello, world!",
target_language: "es",
}),
}
);
const data = await resp.json();
console.log(data.translated_text);
// → "¡Hola, mundo!"
{
"translated_text": "¡Hola, mundo!",
"source_language": "en",
"target_language": "es",
"confidence": 0.98,
"validation": {
"length_ratio": 1.08,
"language_match": true,
"passed": true
}
}
/v1/transcribe
Transcribe un archivo de audio o video a texto. Soporta hasta 100 MB.
Cuerpo de la solicitud multipart/form-data
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
file | file | sí | Archivo de audio/video (mp3, wav, mp4, webm, etc.) |
language | string | no | Código ISO, detección automática si se omite |
project_id | integer | no | Vincular a un proyecto para seguimiento |
response_format | string | no | Output format: json, verbose_json, text, srt, vtt |
punctuate | boolean | no | Include punctuation (default true) |
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
text | string | Texto completo transcrito |
language | string | Idioma detectado |
duration_seconds | float | Duración del audio |
confidence | float | Puntuación de calidad 0.0 - 1.0 |
language_confidence | float | Confidence of auto-detected language (null if language was specified) |
segments | array | Segmentos con marca de tiempo |
validation | object | Verificaciones de calidad |
Ejemplos
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
-H "Authorization: Bearer mrl_your_key" \
-F "file=@meeting.mp3" \
-F "language=en"
import httpx
with open("meeting.mp3", "rb") as f:
resp = httpx.post(
"https://api.morlivo.ai/api/v1/transcribe",
headers={"Authorization": "Bearer mrl_your_key"},
files={"file": ("meeting.mp3", f, "audio/mpeg")},
data={"language": "en"},
)
data = resp.json()
print(data["text"])
{
"text": "Welcome everyone to today's meeting...",
"language": "en",
"duration_seconds": 342.5,
"confidence": 0.95,
"language_confidence": 0.95,
"segments": [
{"start": 0.0, "end": 3.2, "text": "Welcome everyone"},
{"start": 3.2, "end": 6.8, "text": "to today's meeting."}
],
"validation": {
"words_per_minute": 148,
"repetition_detected": false,
"passed": true
}
}
/v1/live/transcribe
Transmita audio en tiempo real y reciba resultados de transcripción en vivo.
Conexión
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
token | string | sí | Clave API como parámetro de consulta |
language | string | no | Indicación de idioma de origen (p. ej. en, fr). Se detecta automáticamente si se omite. |
Protocolo
Tramas de audio PCM binario (16 bits, 16 kHz mono)
Mensajes JSON con campo type: transcript (texto parcial/final), status (eventos de sesión), error
Mensajes recibidos
| Campo | Tipo | Descripción |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Texto transcrito (en mensajes de transcripción) |
is_final | boolean | Verdadero cuando el segmento está completo |
language | string | Código de idioma detectado |
Ejemplos
const ws = new WebSocket(
"wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key&language=en"
);
navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
const ctx = new AudioContext({ sampleRate: 16000 });
const source = ctx.createMediaStreamSource(stream);
const processor = ctx.createScriptProcessor(4096, 1, 1);
source.connect(processor);
processor.connect(ctx.destination);
processor.onaudioprocess = (e) => {
const pcm = e.inputBuffer.getChannelData(0);
const int16 = new Int16Array(pcm.length);
for (let i = 0; i < pcm.length; i++)
int16[i] = Math.max(-1, Math.min(1, pcm[i])) * 0x7FFF;
ws.send(int16.buffer);
};
});
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === "transcript") {
console.log(msg.is_final ? "FINAL:" : "partial:", msg.text);
}
};
import asyncio, json, websockets
async def live_transcribe():
uri = "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key"
async with websockets.connect(uri) as ws:
# Send audio chunks (PCM 16-bit 16kHz mono)
with open("audio.pcm", "rb") as f:
while chunk := f.read(4096):
await ws.send(chunk)
msg = json.loads(await ws.recv())
if msg["type"] == "transcript":
print(msg["text"], end="\r" if not msg["is_final"] else "\n")
asyncio.run(live_transcribe())
// Session started
{"type": "status", "message": "session_started"}
// Partial transcript (still speaking)
{"type": "transcript", "text": "Hello every", "is_final": false}
// Final transcript (segment complete)
{"type": "transcript", "text": "Hello everyone, welcome to the meeting.",
"is_final": true, "language": "en"}
// Session ended
{"type": "status", "message": "session_ended",
"duration_seconds": 45.2}
/v1/live/translate
Transmita audio en un idioma y reciba texto traducido en otro idioma en tiempo real. Admite traducción de voz a texto con detección automática de idioma.
Conexión
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
token | string | sí | Clave API como parámetro de consulta |
target_language | string | sí | Idioma del texto de salida (p. ej. en, es, fr) |
source_language | string | no | Idioma del audio de origen. Se detecta automáticamente si se omite. |
Protocolo
Tramas de audio PCM binario (16 bits, 16 kHz mono)
Mensajes JSON con texto traducido en target_language. Incluye tanto la transcripción del discurso original como la salida traducida.
Mensajes recibidos
| Campo | Tipo | Descripción |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Texto traducido en el idioma de destino |
is_final | boolean | Verdadero cuando el segmento está completo |
source_language | string | Idioma de origen detectado |
target_language | string | Código de idioma de destino |
Ejemplos
const ws = new WebSocket(
"wss://live.morlivo.ai/v1/live/translate" +
"?token=mrl_your_key&target_language=es&source_language=en"
);
// Stream microphone audio (same setup as live transcribe)
// ...
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === "transcript" && msg.is_final) {
console.log(`[${msg.source_language} → ${msg.target_language}]`);
console.log(msg.text);
}
};
import asyncio, json, websockets
async def live_translate():
uri = (
"wss://live.morlivo.ai/v1/live/translate"
"?token=mrl_your_key"
"&source_language=fr&target_language=en"
)
async with websockets.connect(uri) as ws:
with open("french_audio.pcm", "rb") as f:
while chunk := f.read(4096):
await ws.send(chunk)
msg = json.loads(await ws.recv())
if msg["type"] == "transcript" and msg["is_final"]:
print(f"Translation: {msg['text']}")
asyncio.run(live_translate())
// Partial translation
{"type": "transcript", "text": "Hello every",
"is_final": false, "source_language": "fr", "target_language": "en"}
// Final translated segment
{"type": "transcript",
"text": "Hello everyone, welcome to the meeting.",
"is_final": true,
"source_language": "fr", "target_language": "en"}
// Session summary
{"type": "status", "message": "session_ended",
"duration_seconds": 120.5}
/v1/live/rooms
Create a multi-participant translation room. Each participant speaks their own language and receives translated text from other participants.
Cuerpo de la solicitud JSON
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
languages | object | sí | Participant ID to language mapping |
bridge_language | string | no | Hub language, default en |
max_participants | int | no | Max participants 2-10, default 10 |
mode | string | no | interpreter or inline |
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
room_id | string | Unique room identifier |
status | string | Room status |
languages | object | Participant ID to language mapping |
bridge_language | string | Hub language used for translation |
mode | string | Translation mode |
max_participants | int | Maximum number of participants |
Ejemplos
curl -X POST https://api.morlivo.ai/api/v1/live/rooms \
-H "Authorization: Bearer mrl_your_key" \
-H "Content-Type: application/json" \
-d '{
"languages": {"alice": "en", "bob": "fr", "carlos": "es"},
"bridge_language": "en",
"mode": "interpreter"
}'
{
"room_id": "room_abc123",
"status": "active",
"languages": {"alice": "en", "bob": "fr", "carlos": "es"},
"bridge_language": "en",
"mode": "interpreter",
"max_participants": 10
}
/v1/live/speech/{room_id}
Connect a participant to a room for real-time speech translation.
Conexión
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
room_id | string | sí | Room ID from create room response (path param) |
participant | string | sí | Participant ID (query param) |
token | string | sí | Clave API como parámetro de consulta |
Ejemplo
const ws = new WebSocket(
"wss://live.morlivo.ai/v1/live/speech/room_abc123" +
"?token=mrl_your_key&participant=alice"
);
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === "transcript" && msg.is_final) {
console.log(`[${msg.source_language} → ${msg.target_language}]`);
console.log(msg.text);
}
};
/v1/live/rooms/{room_id}/participants
Add a participant to an existing room after creation.
Cuerpo de la solicitud JSON
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
participant_id | string | sí | Unique participant identifier |
language | string | sí | Participant's language code |
Ejemplo
curl -X POST https://api.morlivo.ai/api/v1/live/rooms/room_abc123/participants \
-H "Authorization: Bearer mrl_your_key" \
-H "Content-Type: application/json" \
-d '{
"participant_id": "diana",
"language": "de"
}'
/v1/languages
List all supported languages with locale, name, and availability status.
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
languages | array | List of supported languages |
languages[].locale | string | Locale code e.g. fr-CA |
languages[].name | string | English name |
languages[].native_name | string | Native name |
languages[].country | string | Country/region |
languages[].status | string | ga or beta |
Ejemplo
curl https://api.morlivo.ai/api/v1/languages \
-H "Authorization: Bearer mrl_your_key"
{
"languages": [
{"locale": "en-US", "name": "English", "native_name": "English", "country": "United States", "status": "ga"},
{"locale": "fr-CA", "name": "French", "native_name": "Français", "country": "Canada", "status": "ga"},
{"locale": "sw-KE", "name": "Swahili", "native_name": "Kiswahili", "country": "Kenya", "status": "beta"}
]
}
/v1/health
Check API status and database health. No authentication required.
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
status | string | saludable o degradado |
Ejemplo
curl https://api.morlivo.ai/api/v1/health
{
"status": "healthy"
}
Endpoints de Compatibilidad
¿Ya usas otro proveedor? Cambia una URL y mantén tu código existente. Estos endpoints replican los formatos de solicitud y respuesta de las principales APIs de traducción y transcripción.
DeepL
TraducciónPOST /api/compat/deepl/v2/translate
Reemplazo directo para api-free.deepl.com
Google Cloud Translation
TraducciónPOST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText
Reemplazo directo para translation.googleapis.com
AWS Translate
TraducciónPOST /api/compat/aws/translate
Reemplazo directo para translate.amazonaws.com
OpenAI Whisper
TranscripciónPOST /api/compat/openai/v1/audio/transcriptions
Reemplazo directo para api.openai.com
Deepgram
TranscripciónPOST /api/compat/deepgram/v1/listen
Reemplazo directo para api.deepgram.com
Los endpoints de compatibilidad aceptan el mismo formato de solicitud y devuelven la misma estructura de respuesta que el proveedor original. Consulta la documentación de cada proveedor para sus esquemas de solicitud/respuesta.
Errores
Todos los errores devuelven un objeto JSON con un campo de detalle.
| Código | Significado | Cuándo sucede |
|---|---|---|
| 400 | Solicitud Incorrecta | Campos requeridos faltantes, texto vacío, tipo de archivo no soportado |
| 401 | No Autorizado | Clave API faltante o inválida |
| 403 | Prohibido | Clave API válida pero permisos insuficientes o cuota excedida |
| 413 | Carga Demasiado Grande | El archivo excede el límite de carga de 100 MB |
| 429 | Límite de Tasa | Demasiadas solicitudes. Reintenta con retroceso exponencial. |
| 500 | Error Interno | Error inesperado del servidor. Contacta soporte si persiste. |
| 503 | Servicio No Disponible | Modelo de IA temporalmente no disponible (circuit breaker abierto). Reintente en breve. |
{
"detail": "Field 'text' must not be empty."
}
Redacción de PII
Añada redacción de PII a cualquier solicitud de traducción o transcripción. Especifique qué tipos de entidades detectar y redactar.
Cuerpo de la solicitud JSON
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
text | string | sí | Texto para traducir |
source_language | string | no | Detección automática si se omite |
target_language | string | sí | Código ISO 639-1 (ej. es, fr, de) |
redact | string[] | no | Tipos de entidades a redactar (p. ej. email, teléfono, nombre) |
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
translated_text | string | Texto traducido con PII redactada |
source_language | string | Idioma de origen detectado o proporcionado |
target_language | string | Código de idioma de destino |
confidence | float | Puntuación de calidad 0.0 - 1.0 |
redactions | array | Lista de redacciones aplicadas (tipo y reemplazo) |
Ejemplos
curl -X POST https://api.morlivo.ai/api/v1/translate \
-H "Authorization: Bearer mrl_your_key" \
-H "Content-Type: application/json" \
-d '{
"text": "Contact John Smith at john@example.com or 555-123-4567",
"source_language": "en",
"target_language": "fr",
"redact": ["email", "phone", "name"]
}'
import httpx
resp = httpx.post(
"https://api.morlivo.ai/api/v1/translate",
headers={"Authorization": "Bearer mrl_your_key"},
json={
"text": "Contact John Smith at john@example.com or 555-123-4567",
"source_language": "en",
"target_language": "fr",
"redact": ["email", "phone", "name"],
},
)
data = resp.json()
print(data["translated_text"])
# → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
const resp = await fetch(
"https://api.morlivo.ai/api/v1/translate",
{
method: "POST",
headers: {
"Authorization": "Bearer mrl_your_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "Contact John Smith at john@example.com or 555-123-4567",
source_language: "en",
target_language: "fr",
redact: ["email", "phone", "name"],
}),
}
);
const data = await resp.json();
console.log(data.translated_text);
// → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
{
"translated_text": "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]",
"source_language": "en",
"target_language": "fr",
"confidence": 0.95,
"redactions": [
{"type": "name", "replacement": "[NAME_REDACTED]"},
{"type": "email", "replacement": "[EMAIL_REDACTED]"},
{"type": "phone", "replacement": "[PHONE_REDACTED]"}
]
}
Tipos de Entidades Admitidos
| Entidad | Descripción | Detección |
|---|---|---|
email |
Direcciones de correo | Basado en patrones (incluido) |
phone |
Números de teléfono | Basado en patrones (incluido) |
ssn |
Números de Seguro Social | Basado en patrones (incluido) |
credit_card |
Números de tarjetas de crédito | Basado en patrones (incluido) |
ip_address |
Direcciones IP | Basado en patrones (incluido) |
name |
Nombres de personas | Impulsado por IA (costo adicional) |
address |
Direcciones físicas | Impulsado por IA (costo adicional) |
medical |
Información médica | Impulsado por IA (costo adicional) |
Las entidades basadas en formato (email, teléfono, SSN, tarjeta de crédito, IP) se detectan mediante coincidencia de patrones sin costo adicional. Las entidades contextuales (nombre, dirección, médico) utilizan detección impulsada por IA e implican un pequeño cargo adicional por solicitud.
¿Listo para integrar?
Crea una cuenta gratuita para obtener tu clave API y comenzar a traducir.