Referencia de API
Integre la traducción y transcripción Morlivo en su aplicación con unas pocas líneas de código.
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.
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.
/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
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
text | string | sí | Texto a traducir |
target_language | string | sí | Código ISO 639-1 (p. ej. es, fr, de) |
source_language | string | no | Detectado automáticamente si se omite |
project_id | integer | no | Aplicar glosario y estilo del proyecto |
formality | string | no | Registro: formal, informal o predeterminado |
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 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
Transcriba un archivo de audio o video a texto. Admite 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, detectado automáticamente si se omite |
project_id | integer | no | Vincular a un proyecto para seguimiento |
response_format | string | no | Formato de salida: json, verbose_json, text, srt, vtt |
punctuate | boolean | no | Incluir puntuación (predeterminado: verdadero) |
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
text | string | Texto transcrito completo |
language | string | Idioma detectado |
duration_seconds | float | Duración del audio |
confidence | float | Puntuación de calidad 0,0 - 1,0 |
language_confidence | float | Confianza del idioma detectado automáticamente (nulo si se especificó el idioma) |
segments | array | Segmentos con marca de tiempo |
validation | object | Controles 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 | Sugerencia del idioma de origen (por ejemplo, en, fr). Detectado automáticamente si se omite. |
Protocolo
Cuadros de audio PCM binarios (16 bits, 16 kHz mono)
Mensajes JSON con campo tipo: transcripción (texto parcial/final), estado (eventos de sesión), error
Mensajes recibidos
| Campo | Tipo | Descripción |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Texto transcrito (en mensajes transcritos) |
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 (por ejemplo, en, es, fr) |
source_language | string | no | Idioma de audio de origen. Detectado automáticamente si se omite. |
Protocolo
Cuadros de audio PCM binarios (16 bits, 16 kHz mono)
Mensajes JSON con texto traducido en idioma_destino. Incluye tanto la transcripción del discurso original como la traducción.
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 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/languages
Enumere todos los idiomas admitidos con configuración regional, nombre y estado de disponibilidad.
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
languages | array | Lista de idiomas admitidos |
languages[].locale | string | Código local, p. fr-CA |
languages[].name | string | nombre en ingles |
languages[].native_name | string | nombre nativo |
languages[].country | string | País/región |
languages[].status | string | ga o 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
Verifique el estado de API y el estado de la base de datos. No se requiere autenticación.
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
status | string | sano o degradado |
Ejemplo
curl https://api.morlivo.ai/api/v1/health
{
"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.
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 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ódigo | Significado | cuando 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. |
{
"detail": "Field 'text' must not be empty."
}
{
"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.
Redacción PII
Agregue redacción 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 a traducir |
source_language | string | no | Detectado automáticamente si se omite |
target_language | string | sí | Código ISO 639-1 (p. ej. es, fr, de) |
redact | string[] | no | Tipos de entidades para redactar (por ejemplo, correo electrónico, teléfono, nombre) |
Respuesta 200
| Campo | Tipo | Descripción |
|---|---|---|
translated_text | string | Texto traducido con PII redactado |
source_language | string | Idioma de origen detectado o proporcionado |
target_language | string | Código de idioma 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 admitidas
| 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 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.