v1.0.0

Referencia API

Integra la traducción y transcripción de Morlivo en tu aplicación con unas pocas líneas de código.

URL Base: 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.

Encabezado
Authorization: Bearer mrl_your_api_key_here

Las claves API comienzan con mrl_. Mantenlas en secreto. Rotalas desde el panel si se ven comprometidas.

POST

/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

CampoTipoRequeridoDescripción
textstringTexto para traducir
target_languagestringCódigo ISO 639-1 (ej. es, fr, de)
source_languagestringnoDetección automática si se omite
project_idintegernoAplicar glosario y estilo del proyecto
formalitystringnoRegister: formal, informal, or default

Respuesta 200

CampoTipoDescripción
translated_textstringEl texto traducido
source_languagestringIdioma de origen detectado o proporcionado
target_languagestringCódigo de idioma de destino
confidencefloatPuntuación de calidad 0.0 - 1.0
validationobjectResultados de validación de calidad

Ejemplos

curl
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"
  }'
Python
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!"
JavaScript
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!"
Respuesta
{
  "translated_text": "¡Hola, mundo!",
  "source_language": "en",
  "target_language": "es",
  "confidence": 0.98,
  "validation": {
    "length_ratio": 1.08,
    "language_match": true,
    "passed": true
  }
}
POST

/v1/transcribe

Transcribe un archivo de audio o video a texto. Soporta hasta 100 MB.

Cuerpo de la solicitud multipart/form-data

CampoTipoRequeridoDescripción
filefileArchivo de audio/video (mp3, wav, mp4, webm, etc.)
languagestringnoCódigo ISO, detección automática si se omite
project_idintegernoVincular a un proyecto para seguimiento
response_formatstringnoOutput format: json, verbose_json, text, srt, vtt
punctuatebooleannoInclude punctuation (default true)

Respuesta 200

CampoTipoDescripción
textstringTexto completo transcrito
languagestringIdioma detectado
duration_secondsfloatDuración del audio
confidencefloatPuntuación de calidad 0.0 - 1.0
language_confidencefloatConfidence of auto-detected language (null if language was specified)
segmentsarraySegmentos con marca de tiempo
validationobjectVerificaciones de calidad

Ejemplos

curl
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
  -H "Authorization: Bearer mrl_your_key" \
  -F "file=@meeting.mp3" \
  -F "language=en"
Python
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"])
Respuesta
{
  "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
  }
}
WebSocket

/v1/live/transcribe

Transmita audio en tiempo real y reciba resultados de transcripción en vivo.

Conexión

ParámetroTipoRequeridoDescripción
tokenstringClave API como parámetro de consulta
languagestringnoIndicación de idioma de origen (p. ej. en, fr). Se detecta automáticamente si se omite.

Protocolo

Enviar

Tramas de audio PCM binario (16 bits, 16 kHz mono)

Recibir

Mensajes JSON con campo type: transcript (texto parcial/final), status (eventos de sesión), error

Mensajes recibidos

CampoTipoDescripción
typestring"transcript" | "status" | "error"
textstringTexto transcrito (en mensajes de transcripción)
is_finalbooleanVerdadero cuando el segmento está completo
languagestringCódigo de idioma detectado

Ejemplos

JavaScript
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);
  }
};
Python
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())
Ejemplos de mensajes
// 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}
WebSocket

/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ámetroTipoRequeridoDescripción
tokenstringClave API como parámetro de consulta
target_languagestringIdioma del texto de salida (p. ej. en, es, fr)
source_languagestringnoIdioma del audio de origen. Se detecta automáticamente si se omite.

Protocolo

Enviar

Tramas de audio PCM binario (16 bits, 16 kHz mono)

Recibir

Mensajes JSON con texto traducido en target_language. Incluye tanto la transcripción del discurso original como la salida traducida.

Mensajes recibidos

CampoTipoDescripción
typestring"transcript" | "status" | "error"
textstringTexto traducido en el idioma de destino
is_finalbooleanVerdadero cuando el segmento está completo
source_languagestringIdioma de origen detectado
target_languagestringCódigo de idioma de destino

Ejemplos

JavaScript
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);
  }
};
Python
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())
Ejemplos de mensajes
// 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}
POST

/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

CampoTipoRequeridoDescripción
languagesobjectParticipant ID to language mapping
bridge_languagestringnoHub language, default en
max_participantsintnoMax participants 2-10, default 10
modestringnointerpreter or inline

Respuesta 200

CampoTipoDescripción
room_idstringUnique room identifier
statusstringRoom status
languagesobjectParticipant ID to language mapping
bridge_languagestringHub language used for translation
modestringTranslation mode
max_participantsintMaximum number of participants

Ejemplos

curl
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"
  }'
Respuesta
{
  "room_id": "room_abc123",
  "status": "active",
  "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
  "bridge_language": "en",
  "mode": "interpreter",
  "max_participants": 10
}
WebSocket

/v1/live/speech/{room_id}

Connect a participant to a room for real-time speech translation.

Conexión

ParámetroTipoRequeridoDescripción
room_idstringRoom ID from create room response (path param)
participantstringParticipant ID (query param)
tokenstringClave API como parámetro de consulta

Ejemplo

JavaScript
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);
  }
};
POST

/v1/live/rooms/{room_id}/participants

Add a participant to an existing room after creation.

Cuerpo de la solicitud JSON

CampoTipoRequeridoDescripción
participant_idstringUnique participant identifier
languagestringParticipant's language code

Ejemplo

curl
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"
  }'
GET

/v1/languages

List all supported languages with locale, name, and availability status.

Respuesta 200

CampoTipoDescripción
languagesarrayList of supported languages
languages[].localestringLocale code e.g. fr-CA
languages[].namestringEnglish name
languages[].native_namestringNative name
languages[].countrystringCountry/region
languages[].statusstringga or beta

Ejemplo

curl
curl https://api.morlivo.ai/api/v1/languages \
  -H "Authorization: Bearer mrl_your_key"
Respuesta
{
  "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"}
  ]
}
GET

/v1/health

Check API status and database health. No authentication required.

Respuesta 200

CampoTipoDescripción
statusstringsaludable o degradado

Ejemplo

curl
curl https://api.morlivo.ai/api/v1/health
Respuesta
{
  "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.

DL

DeepL

Traducción
POST /api/compat/deepl/v2/translate

Reemplazo directo para api-free.deepl.com

G

Google Cloud Translation

Traducción
POST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText

Reemplazo directo para translation.googleapis.com

A

AWS Translate

Traducción
POST /api/compat/aws/translate

Reemplazo directo para translate.amazonaws.com

OA

OpenAI Whisper

Transcripción
POST /api/compat/openai/v1/audio/transcriptions

Reemplazo directo para api.openai.com

DG

Deepgram

Transcripción
POST /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ódigoSignificadoCuá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.
Formato de respuesta de error
{
  "detail": "Field 'text' must not be empty."
}
POST

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.

POST /v1/translate POST /v1/transcribe

Cuerpo de la solicitud JSON

CampoTipoRequeridoDescripción
textstringTexto para traducir
source_languagestringnoDetección automática si se omite
target_languagestringCódigo ISO 639-1 (ej. es, fr, de)
redactstring[]noTipos de entidades a redactar (p. ej. email, teléfono, nombre)

Respuesta 200

CampoTipoDescripción
translated_textstringTexto traducido con PII redactada
source_languagestringIdioma de origen detectado o proporcionado
target_languagestringCódigo de idioma de destino
confidencefloatPuntuación de calidad 0.0 - 1.0
redactionsarrayLista de redacciones aplicadas (tipo y reemplazo)

Ejemplos

curl
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"]
  }'
Python
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]"
JavaScript
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]"
Respuesta
{
  "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

EntidadDescripciónDetecció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.