La API
Para conectar Liora con tus propios sistemas: crear salas, consultar el consumo, mandar trabajos de traducción.
⚠️Hace falta el modo integrador
Las llaves de API se emiten desde Cuenta, y esa tarjeta sólo aparece con el modo integrador encendido. Cómo se enciende.
Cómo se identifica quien llama
Una llave de API. Se emite desde Cuenta y se enseña una sola vez: de ella guardamos sólo una huella, así que si se pierde hay que emitir otra.
Se manda en una cabecera, de estas dos formas:
curl -H "X-API-Key: lk_…" https://…/api/v1/rooms
curl -H "Authorization: Bearer lk_…" https://…/api/v1/rooms
⛔No la pongas en la dirección
Se acepta ?api_key=… por compatibilidad, pero no lo uses: una llave en
la dirección queda en el historial del navegador, en el Referer de
cualquier cosa que cargue esa página, y en los registros de cualquier proxy
por el que pase.
Los nuestros no la guardan. Los de otro sí pueden.
Lo que abre una llave
La cuenta entera. No hay llaves de sólo lectura ni acotadas a un sitio: quien tiene la llave puede todo lo que puede la cuenta.
Por eso sólo la emite quien administra la cuenta —ni siquiera quien lleva las facturas—, y por eso conviene tener una por sistema y revocar la que ya no se use: así se corta uno sin tocar los demás.
✅Cada llave ve sólo lo suyo
Una llave de una cuenta no puede leer ni tocar los datos de otra. Pedir una sala ajena contesta que no existe, y borrarla, lo mismo.
Qué se puede hacer
| Camino | Para qué |
|---|---|
GET /api/v1/rooms |
Las salas de tu cuenta |
POST /api/v1/rooms |
Crear una |
GET /api/v1/rooms/{id} |
Una en concreto, por su id, no por su identificador de emisión |
PATCH /api/v1/rooms/{id} |
Cambiarle el nombre |
PUT /api/v1/rooms/{id}/languages |
A qué idiomas traduce |
DELETE /api/v1/rooms/{id} |
Borrarla |
GET /api/v1/rooms/{id}/events |
Qué ha ido pasando en ella |
GET /api/v1/usage |
El consumo, día a día |
GET /api/v1/credit |
El saldo |
GET /api/v1/jobs · POST /api/v1/jobs |
Trabajos de traducción de audio o texto |
GET /api/v1/jobs/{id}/result |
Lo transcrito, en txt, json, srt o vtt |
GET /api/v1/jobs/{id}/result?format=acta |
El acta del fichero, en txt. También acta.md, acta.json y acta.pdf |
POST /api/v1/jobs/{id}/summary |
Encarga el resumen. Contesta 202: se está haciendo |
GET /api/v1/jobs/{id}/summary |
Lo recoge cuando está |
PUT · POST · DELETE /api/v1/jobs/{id}/acta/email |
A dónde mandar el acta, mandarla ahora, o dejar de mandarla |
PUT · DELETE /api/v1/jobs/{id}/acta/webhook |
Que te avisemos a una dirección cuando esté, o dejar de avisar |
Los ajustes acústicos de una sala no están en la API: se afinan escuchando cómo suena ese sitio, y de eso nos encargamos nosotros. Si una sala no se oye como debería, dilo y la ajustamos.
Y si pides que te avisemos: qué te llega
PUT /api/v1/jobs/{id}/acta/webhook con {"url": "https://…"} hace que te
mandemos un POST cuando el acta esté. Esto es lo que llega, con
Content-Type: application/json:
{
"event": "acta.ready",
"job_id": 4711,
"name": "reunion-de-ventas.mp4",
"lines": 128,
"formats": ["txt", "md", "json", "pdf"],
"download": "https://<nuestra-api>/api/v1/jobs/4711/acta?format=txt",
"at": 1788557146020
}
event— hoy sólo hay uno,acta.ready, y va igualmente: quien lo reciba quiere poder distinguirlo el día que haya un segundo.formats— los que de verdad se pueden escribir de este documento: elpdfdepende de que haya letra para lo que se dijo. No des por hecho los cuatro.download— ya montada, para que no tengas que componer la dirección a mano ni acertar con el parámetro.at— en milisegundos, para poder ordenar dos avisos sin fiarte de la hora del que los recibe.
Estos nombres son un contrato. Quien monte un Zapier contra esto lo lee por nombre de campo, así que se añaden campos y no se renombran.
Lo que devuelve
JSON llano. Un campo que venga vacío no aparece en la respuesta, en vez de salir como un cero o como una fecha del año 1.
{
"rooms": [
{
"id": "039e1c2d-96da-4a62-8b39-1102e11d1d22",
"company_id": 7,
"private": false,
"access_ttl_minutes": 0,
"source": "srt",
"client_id": "rm_sh55iky7i5zgw",
"enabled": true,
"name": "Sala principal",
"created_at": "2026-08-15T14:01:19Z"
}
]
}
Los campos son ésos y en ese orden. access_ttl_minutes en cero significa
«mientras dure la emisión», y private en falso, que no hace falta código para
entrar.
ℹ️En qué servidor está tu sala no sale
Es infraestructura nuestra, no información tuya. Si algún día cambiamos de sitio una sala, tu integración no se entera — que es como tiene que ser.
Cuando algo va mal
Siempre la misma forma, y el que manda es error — el message está para leerlo
una persona y puede cambiar:
{ "success": false, "error": "API_KEY_INVALID", "message": "The API key is not valid" }
Identificarse
| Código | error |
Cuándo |
|---|---|---|
401 |
API_KEY_MISSING |
No mandaste llave por ninguna de las tres formas |
401 |
API_KEY_INVALID |
La llave no existe o está revocada |
Salas
| Código | error |
Cuándo |
|---|---|---|
404 |
NOT_FOUND |
Esa sala no existe o no es de tu cuenta — la misma respuesta a propósito: decir «existe pero no es tuya» ya es contar algo de otro |
409 |
ROOM_NOT_CONFIGURED |
La sala aún no tiene ajustes; pásale los idiomas antes |
409 |
APP_ID_TAKEN |
Al crear, el nombre que le diste ya lo lleva otra sala tuya |
Trabajos
| Código | error |
Cuándo |
|---|---|---|
413 |
TOO_LONG |
Se pasa de los límites de arriba |
422 |
NO_SPEECH |
En esa grabación no se ha encontrado voz. No se cobra |
429 |
QUEUE_FULL |
Ya tienes tres en cola. Espera a que termine uno |
402 |
NO_CREDIT |
No hay saldo para lo que va a costar. Lo dice antes de empezar |
409 |
NOT_DONE |
Pides el resultado y el trabajo aún no ha terminado |
410 |
RESULT_GONE |
Ha pasado el plazo de guardado y el resultado ya no está |
409 |
TOO_LATE |
Intentas cancelar algo que ya se estaba haciendo |
409 |
OFFSET_MISMATCH |
Al reanudar una subida, el byte por el que ibas no cuadra. La respuesta trae por cuál seguir |
💡Los que se arreglan solos y los que no
QUEUE_FULL se arregla esperando y merece reintento. NO_CREDIT,
TOO_LONG y NO_SPEECH no: reintentarlos da exactamente el mismo resultado
y sólo gasta viajes.
Límites
Están en su propia página: límites de la API.
La referencia completa
Esto es lo que hace falta entender. Cada parámetro, cada respuesta y cada código, uno a uno, están en la referencia, que se puede leer y probar desde el navegador:
Está en inglés, como la propia especificación de la que se genera.