Próximamente Recibir notificaciones
Funciones Precios Referencia de API Acerca de
Iniciar sesión Próximamente
v1.0.0

Referencia de API

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

URL base: https://api.morlivo.ai Auth: Authorization: Bearer mrl_...

Autenticación

Todas las solicitudes API requieren un token de portador. Obtenga su clave API desde el panel en Configuración.

Encabezado
Authorization: Bearer mrl_your_api_key_here

Las claves de API comienzan con mrl_. Manténgalas en secreto. Rótelas desde el panel si se ven comprometidas.

POST

/v1/translate

Traducir 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 a traducir
target_languagestringCódigo ISO 639-1 (p. ej. es, fr, de)
source_languagestringnoDetectado automáticamente si se omite
project_idintegernoAplicar glosario y estilo del proyecto
formalitystringnoRegistro: formal, informal o predeterminado

Respuesta 200

CampoTipoDescripción
translated_textstringEl texto traducido
source_languagestringIdioma de origen detectado o proporcionado
target_languagestringCódigo de idioma 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

Transcriba un archivo de audio o video a texto. Admite hasta 100 MB.

Cuerpo de la solicitud multipart/form-data

CampoTipoRequeridoDescripción
filefileArchivo de audio/video (mp3, wav, mp4, webm, etc.)
languagestringnoCódigo ISO, detectado automáticamente si se omite
project_idintegernoVincular a un proyecto para seguimiento
response_formatstringnoFormato de salida: json, verbose_json, text, srt, vtt
punctuatebooleannoIncluir puntuación (predeterminado: verdadero)

Respuesta 200

CampoTipoDescripción
textstringTexto transcrito completo
languagestringIdioma detectado
duration_secondsfloatDuración del audio
confidencefloatPuntuación de calidad 0,0 - 1,0
language_confidencefloatConfianza del idioma detectado automáticamente (nulo si se especificó el idioma)
segmentsarraySegmentos con marca de tiempo
validationobjectControles 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
languagestringnoSugerencia del idioma de origen (por ejemplo, en, fr). Detectado automáticamente si se omite.

Protocolo

Enviar

Cuadros de audio PCM binarios (16 bits, 16 kHz mono)

Recibir

Mensajes JSON con campo tipo: transcripción (texto parcial/final), estado (eventos de sesión), error

Mensajes recibidos

CampoTipoDescripción
typestring"transcript" | "status" | "error"
textstringTexto transcrito (en mensajes transcritos)
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 (por ejemplo, en, es, fr)
source_languagestringnoIdioma de audio de origen. Detectado automáticamente si se omite.

Protocolo

Enviar

Cuadros de audio PCM binarios (16 bits, 16 kHz mono)

Recibir

Mensajes JSON con texto traducido en idioma_destino. Incluye tanto la transcripción del discurso original como la traducción.

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 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

/api/v1/live/shared-device/token

Crea un token compartido de dispositivo de corta duración y luego abre la URL de WebSocket devuelta. No se requiere aprovisionamiento previo de salas ni enrutamiento persistente.

Cuerpo de la solicitud JSON

CampoTipoRequeridoDescripción
languagesobjectID de participante a asignación de idiomas
max_participantsintnoMáximo de participantes 2-10, predeterminado 10
modestringnointérprete o en línea

Respuesta 200

CampoTipoDescripción
tokenstringToken WebSocket firmado de corta duración
ws_urlstringURL de WebSocket compartida para dispositivos sin sala
session_idstringIdentificador de sesión efímera
participant_idstringId. de participante generado

Ejemplos

curl
curl -X POST https://api.morlivo.ai/api/v1/live/shared-device/token \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "language_a": "en",
    "language_b": "es"
  }'
Respuesta
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "ws_url": "wss://live.morlivo.ai/v1/live/shared-device/speech?token=...",
  "session_id": "shared_abc123",
  "participant_id": "shared-a1b2c3d4",
  "language_a": "en",
  "language_b": "es"
}
WebSocket

/v1/live/shared-device/speech

Conéctate con el token firmado, envía tramas PCM mono de 16 kHz y recibe audio traducido además de eventos de transcripción del hablante/intérprete.

Conexión

ParámetroTipoRequeridoDescripción
tokenstringToken firmado devuelto por /api/v1/live/shared-device/token

Ejemplo

JavaScript
const ws = new WebSocket(tokenResponse.ws_url);

ws.onmessage = (event) => {
  if (event.data instanceof Blob) {
    return playTranslatedAudio(event.data);
  }
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript_input") renderSpeakerTranscript(msg);
  if (msg.type === "transcript_output") renderInterpreterTranscript(msg);
  if (msg.type === "interpreter_speaking") setInterpreterSpeaking(msg.active);
};
GET

/v1/languages

Enumere todos los idiomas admitidos con configuración regional, nombre y estado de disponibilidad.

Respuesta 200

CampoTipoDescripción
languagesarrayLista de idiomas admitidos
languages[].localestringCódigo local, p. fr-CA
languages[].namestringnombre en ingles
languages[].native_namestringnombre nativo
languages[].countrystringPaís/región
languages[].statusstringga o 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

Verifique el estado de API y el estado de la base de datos. No se requiere autenticación.

Respuesta 200

CampoTipoDescripción
statusstringsano o degradado

Ejemplo

curl
curl https://api.morlivo.ai/api/v1/health
Respuesta
{
  "status": "healthy"
}

Puntos finales de compatibilidad

¿Ya utilizas otro proveedor? Cambie un URL y conserve su código existente. Estos puntos finales reflejan los formatos de solicitud y respuesta de las principales API 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 puntos finales de compatibilidad aceptan el mismo formato de solicitud y devuelven la misma estructura de respuesta que el proveedor original. Consulte la documentación de cada proveedor para conocer sus esquemas de solicitud/respuesta.

Errores

Todos los errores devuelven un objeto JSON con un campo de detalle.

CódigoSignificadocuando sucede
400 Solicitud incorrecta Faltan campos obligatorios, texto vacío, tipo de archivo no compatible
401 No autorizado Clave API faltante o no válida
403 Prohibido La clave de API es válida, pero le falta el alcance requerido o el permiso de tenant
402 Pago requerido Créditos insuficientes o se requiere verificación de tarjeta. La respuesta incluye billing_url y los encabezados X-Credits-* cuando están disponibles.
413 Carga útil demasiado grande El archivo supera el límite de carga de 100 MB
429 Tarifa limitada Demasiadas solicitudes. Vuelva a intentarlo con retroceso exponencial.
500 Error interno Error inesperado del servidor. Póngase en contacto con el soporte si persiste.
503 Servicio No Disponible Modelo AI no disponible temporalmente (disyuntor abierto). Vuelva a intentarlo en breve.
Formato de respuesta de error
{
  "detail": "Field 'text' must not be empty."
}
402Agotamiento de créditos
{
  "error": "insufficient_credits",
  "detail": "Insufficient credits",
  "billing_url": "/app/billing"
}

Las respuestas correctas de API incluyen los encabezados X-Credits-Spent y X-Credits-Remaining. Cuando se agoten los créditos, los clientes deben dejar de reintentar y enviar al usuario a billing_url.

POST

Redacción PII

Agregue redacción 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 a traducir
source_languagestringnoDetectado automáticamente si se omite
target_languagestringCódigo ISO 639-1 (p. ej. es, fr, de)
redactstring[]noTipos de entidades para redactar (por ejemplo, correo electrónico, teléfono, nombre)

Respuesta 200

CampoTipoDescripción
translated_textstringTexto traducido con PII redactado
source_languagestringIdioma de origen detectado o proporcionado
target_languagestringCódigo de idioma 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 admitidas

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 seguridad 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 formatos (correo electrónico, 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 incurren en un pequeño cargo adicional por solicitud.

¿Listo para integrarse?

Crea una cuenta gratuita para obtener tu clave API y comienza a traducir.