Documentación de la API

API REST para transcripción de audio y video. Los clientes de pago autentican integraciones de terceros con una clave API creada en la configuración de la cuenta.

URL base

https://scribe.uustudio.cc

Autenticación

Las integraciones de terceros deben enviar una clave API de una cuenta de pago en la cabecera Authorization.

Cabecera Authorization

Authorization: Bearer {token}

Crea y revoca claves API desde la página Claves API de la configuración. Los endpoints de autenticación de la app están reservados para clientes propios.

Respuestas de error

Todos los errores devuelven un cuerpo JSON con un campo message .

Error estándar

{
    "message": "Description of the error"
}

Error de validación (422)

{
    "message": "The name field is required.",
    "errors": {
        "name": ["The name field is required."]
    }
}
EstadoDescripción
401No autenticado (token faltante o inválido)
403Prohibido o límite del plan excedido
404Recurso no encontrado
422Validación fallida
429Límite de velocidad o demasiadas tareas concurrentes
500Error interno del servidor

Límites de velocidad

Los endpoints autenticados de la API están limitados a 10 solicitudes por minuto y token.

Límites de uso

Disponibilidad de la API

La API REST de terceros no está disponible en el plan Gratis. Actualiza a Pro o Max, o compra un paquete de pago por uso, para crear y usar claves API.

Tamaño máximo de archivo
2 GB
Tareas concurrentes
Máx 3
Reintentos máximos por tarea
3

Comparación de planes de pago

CaracterísticaPay as you goProMax
Subidas diariasIlimitadoIlimitadoIlimitado
Formatos de exportaciónTodosTodosTodos
Prioridad de tareasMediaMediaAlta

Flujos de trabajo

Subir archivo de audio/video

  1. POST /api/uploads/sign → Obtener upload_id e información de partes
  2. PUT {presigned_url} → Subir cada parte al almacenamiento
  3. POST /api/uploads/complete → Finalizar subida, auto-crear tarea
  4. GET /api/tasks/{id} → Consultar estado (pending -> scribing -> finished)
  5. GET /api/tasks/{id}/download/srt → Exportar (opcional)

Crear tarea manualmente

  1. POST /api/tasks → Crear con disk, path, name
  2. GET /api/tasks/{id} → Consultar estado
  3. GET /api/tasks/{id} → Obtener segments, summary, mindmap

Auth

POST /api/login

Autentícate con correo y contraseña. Devuelve un token de Sanctum.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
emailstringYesCorreo del usuario (máx 255)
passwordstringYesContraseña del usuario

Respuesta 200

{
    "token": "1|abc123...",
    "user": {
        "id": 1,
        "name": "Zhang San",
        "email": "[email protected]"
    }
}

Limitado a 5 intentos por minuto por correo.

POST /api/register

Crea una cuenta nueva. Devuelve un token de Sanctum.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringYesNombre para mostrar (máx 255)
emailstringYesCorreo único (máx 255)
passwordstringYesDebe ser confirmado
password_confirmationstringYesConfirmación de contraseña

Respuesta 201

{
    "token": "1|abc123...",
    "user": {
        "id": 1,
        "name": "Zhang San",
        "email": "[email protected]"
    }
}
POST /api/auth/social-login

Autentícate a través de Google OAuth. Crea una cuenta si no existe.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
providerstringYesgoogle proveedores soportados
codestringYesCódigo de autorización OAuth

Respuesta 200

{
    "token": "1|abc123...",
    "user": {
        "id": 1,
        "name": "Zhang San",
        "email": "[email protected]"
    }
}
POST /api/logout

Revoca el token de acceso actual.

Respuesta 204

No devuelve cuerpo.

Tareas

POST /api/tasks

Crea una tarea de transcripción. Máx 3 tareas concurrentes por usuario.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
diskstringYesr2 / remote / youtube Identificador de la fuente de almacenamiento
namestringYesNombre de la tarea (máx 255)
pathstringYesRuta del archivo o URL de origen
filestringNoNombre de archivo original (máx 255)
sizeintegerNoTamaño del archivo en bytes
durationintegerNoDuración en segundos
costintegerNoCosto en segundos
segmentsarrayNoSegmentos de transcripción
speaker_diarizationbooleanNoapp.tasks.speaker_diarization_api_description

Respuesta 201

{
    "id": 1,
    "name": "Meeting Recording",
    "status": "pending",
    "speaker_diarization": true,
    "created_at": "2026-03-02T10:30:00+08:00"
}

Errores

EstadoDescripción
403Los usuarios gratuitos no pueden enviar enlaces de YouTube mediante la API.
429Máximo de 3 tareas concurrentes alcanzado
GET /api/tasks/{id}

Obtén los detalles completos de la tarea, incluyendo los resultados de transcripción.

Respuesta

{
    "id": 1,
    "name": "Meeting Recording",
    "file": "meeting.mp3",
    "path": "2026-03-02/01HQX...mp3",
    "disk": "r2",
    "size": 50545869,
    "duration": 1965,
    "cost": 33,
    "status": "finished",
    "attempts": 1,
    "quality": 3,
    "created_at": "2026-03-02T10:30:00+08:00",
    "updated_at": "2026-03-02T10:45:00+08:00",
    "summary": "The meeting discussed three topics...",
    "mindmap": "# Topic\n## Sub-topic 1",
    "folder": "Work",
    "tags": ["Work"],
    "url": "https://youtube.com/watch?v=...",
    "segments": [
        {
            "id": 1,
            "start": 0,
            "end": 5000,
            "speaker": "Speaker 1",
            "tokens": ["Okay", "so let's", "begin"],
            "text": "Okay, so let's begin..."
        }
    ],
    "export": {
        "allowed_formats": ["txt", "srt", "vtt", "csv", "pdf", "docx"],
        "heavy_formats": ["pdf", "docx"],
        "version": "20260302104500"
    }
}

Campos de respuesta

CampoTipoDescripción
diskstring|nullDisco de almacenamiento: r2 / remote / youtube
sizeint|nullTamaño del archivo en bytes
costint|nullCosto en segundos
attemptsintRecuento de reintentos
qualityint|nullPuntuación de calidad (0-5)
summarystring|nullResumen generado por IA
mindmapstring|nullMapa mental generado por IA
folderstring|nullNombre de la primera etiqueta (carpeta)
tagsarrayTodos los nombres de etiquetas
urlstring|nullURL de origen (para tareas de YouTube)
segmentsarray|nullSegmentos de transcripción
segments[].startintTiempo de inicio (ms)
segments[].endintTiempo de fin (ms)
segments[].textstringTexto del segmento
segments[].speakerstring|nullIdentificador del hablante
segments[].tokensarray|nullArray de tokens de palabras
exportobjectMetadatos de exportación (allowed_formats, heavy_formats, version)
GET /api/tasks

Parámetros de consulta

ParámetroTipoPor defectoDescripción
statusstringallFiltrar por estado
searchstring—Buscar por nombre
folderstring—Filtrar por carpeta (o Uncategorized)
pageint1Número de página
per_pageint25Elementos por página (máx 100)

Respuesta

{
    "data": [
        {
            "id": 1,
            "name": "Meeting Recording",
            "file": "meeting.mp3",
            "disk": "r2",
            "size": 50545869,
            "duration": 1965,
            "cost": 33,
            "status": "finished",
            "attempts": 1,
            "quality": 3,
            "folder": "Work",
            "created_at": "2026-03-02T10:30:00+08:00"
        }
    ],
    "current_page": 1,
    "last_page": 1,
    "per_page": 25,
    "total": 1
}
PATCH /api/tasks/{id}/retry

Reintentar una tarea fallida. Establece el estado a pending (R2) o waiting (remote/YouTube). Máx 3 reintentos.

Respuesta 200

{
    "id": 1,
    "status": "pending",
    "attempts": 2
}
GET /api/tasks/{id}/download/{format}

Exportar transcripción. Los formatos ligeros devuelven el archivo directamente. Los formatos pesados (pdf/docx) pueden devolver 202 mientras se procesan.

Parámetros de ruta

ParámetroDescripción
formattxt / srt / vtt / csv / pdf / docx

Respuestas

200 - Archivo listo (formatos ligeros)

Devuelve un archivo binario.

200 - Archivo listo (formatos pesados, solicitud JSON)

{
    "status": "ready",
    "url": "https://scribe.uustudio.cc/api/tasks/1/download/pdf"
}

202 - Procesando formato pesado

{
    "status": "processing",
    "message": "Your export is being generated. Please try again shortly."
}
GET /api/tasks/{id}/audio

Transmitir el archivo de audio o video original directamente desde el almacenamiento (solo R2).

Respuesta

200 - Flujo binario del archivo de audio o video. Devuelve 404 si el archivo falta o no está almacenado en el disco R2.

GET /api/tasks/{id}/refresh-summary

Actualizar y devolver el resumen y mapa mental generados por IA más recientes.

Respuesta

{
    "summary": "The meeting discussed three topics...",
    "mindmap": "# Topic\n## Sub-topic 1"
}
GET /api/tasks/{id}/share-url

Get or generate a public share URL for the task.

Respuesta

{
    "share_url": "https://scribe.uustudio.cc/share/tasks/1"
}
PATCH /api/tasks/{id}

Actualizar campos de la tarea. Todos los campos son opcionales.

Cuerpo de la solicitud

CampoTipoDescripción
namestringNuevo nombre (máx 255)
folderstring|nullNombre de carpeta (null elimina la tarea de una carpeta)
durationintegerDuración en segundos
costintegerCosto en segundos
segmentsarrayArray completo de segmentos para reemplazar
textstringTexto completo de la transcripción
qualityintegerPuntuación de calidad (0-5)
indexintegerÍndice de orden de la tarea

Respuesta 200

Devuelve el objeto de tarea completo (igual que Detalle de tarea).

DELETE /api/tasks/{id}

Response 200

{
    "message": "Task deleted successfully"
}
DELETE /api/tasks/bulk

Eliminar múltiples tareas a la vez. Solo se eliminarán las tareas del usuario autenticado. Los IDs que no pertenezcan al usuario se ignoran.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
idsarrayYesArray de IDs de tareas a eliminar (mín 1)

Respuesta 200

{
    "message": "2 task(s) deleted successfully",
    "deleted_count": 2
}
PATCH /api/tasks/bulk/move

Mover múltiples tareas a una carpeta a la vez. Solo se moverán las tareas del usuario autenticado.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
idsarrayYesArray de IDs de tareas a mover (mín 1)
folderstringYesNombre de la carpeta de destino (máx 255)

Respuesta 200

{
    "message": "2 task(s) moved to Work",
    "moved_count": 2
}

Subidas

Subida multipart
POST /api/uploads/sign

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
filestringYesNombre de archivo (debe usar un formato soportado)
content_typestringYesTipo MIME (debe coincidir con la extensión del archivo)
sizeintegerYesTamaño del archivo en bytes (máx 2,147,483,648 / 2 GB)
durationintegerNoDuración del audio en segundos

Respuesta

{
    "path": "2026-03-02/01HQX...mp3",
    "upload_id": "abc123",
    "part_size": 5242880,
    "part_count": 10,
    "expires_at": "2026-03-02T10:40:00+08:00"
}
POST /api/uploads/sign-part

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
pathstringYesRuta de subida (máx 2048)
upload_idstringYesID de subida (máx 2048)
part_numberintegerYesNúmero de parte (1-10000)

Respuesta

{
    "url": "https://storage.example.com/...?X-Amz-...",
    "headers": {
        "Content-Type": "audio/mpeg"
    }
}

Usa PUT con la URL y las cabeceras devueltas para subir la parte.

POST /api/uploads/complete

Completar una subida multipart. Esto crea automáticamente una tarea y devuelve 403 cuando la API no está disponible o se supera un límite del plan.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
pathstringYesRuta de subida (máx 2048)
upload_idstringYesID de subida (máx 2048)
original_namestringYesNombre de archivo original (debe usar un formato soportado)
content_typestringYesTipo MIME (debe coincidir con la extensión del archivo)
sizeintegerYesTamaño del archivo en bytes (máx 2 GB)
namestringNoNombre de tarea (por defecto usa el nombre de archivo sin extensión)
durationintegerNoDuración en segundos (mín 1)
speaker_diarizationbooleanNoapp.tasks.speaker_diarization_api_description

Respuesta 201

{
    "message": "File uploaded to the upload server successfully.",
    "task": {
        "id": 1,
        "name": "meeting",
        "path": "2026-03-02/01HQX...mp3",
        "size": 50545869,
        "status": "pending",
        "speaker_diarization": true
    }
}
POST /api/uploads/abort

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
pathstringYesRuta de subida (máx 2048)
upload_idstringYesID de subida (máx 2048)

Respuesta

{
    "message": "Multipart upload cancelled successfully."
}

Carpetas

Basado en etiquetas
GET /api/folders

Lista todas las carpetas con recuentos de tareas.

Respuesta

{
    "folders": [
        {"id": 1, "name": "Work", "count": 5},
        {"id": 2, "name": "Personal", "count": 3}
    ],
    "uncategorized_count": 2,
    "total_count": 10
}
POST /api/folders

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringYesNombre de carpeta (máx 14 caracteres / 7 caracteres chinos, único por usuario)

Respuesta 201

{
    "id": 1,
    "name": "Work"
}
PATCH /api/folders/{name}

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringYesNuevo nombre de carpeta (mismas restricciones que crear)

Respuesta 200

{
    "id": 1,
    "name": "New Name"
}
DELETE /api/folders/{name}

Response 200

{
    "message": "Folder deleted successfully"
}

Usuario

GET /api/user

Respuesta

{
    "id": 1,
    "name": "Zhang San",
    "email": "[email protected]",
    "avatar": "https://...",
    "balance": {
        "used_seconds": 9000,
        "remaining_seconds": 36000,
        "allowance_remaining_seconds": 30000,
        "top_up_remaining_seconds": 6000,
        "total_seconds": 45000,
        "usage_percent": 20
    },
    "subscription": {
        "plan": "year",
        "plan_key": "max_yearly",
        "tier": "max",
        "billing_interval": "yearly",
        "active": true,
        "access_tier": "max"
    },
    "queue": {
        "pending_count": 1,
        "running_count": 1,
        "failed_count": 0
    }
}

Campos de saldo

CampoTipoDescripción
used_secondsintSegundos usados desde el último otorgamiento mensual
remaining_secondsintSegundos restantes
total_secondsintSegundos totales
usage_percentintPorcentaje de uso (0-100)
PUT /api/user

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringNoNombre para mostrar (máx 255)
emailstringNoNuevo correo (debe ser único)
avatarfileNoArchivo de imagen (máx 5 MB)

Respuesta 200

{
    "id": 1,
    "name": "New Name",
    "email": "[email protected]",
    "avatar": "https://..."
}

Notificaciones

GET /api/notifications

Obtener las 10 notificaciones más recientes.

Respuesta

[
    {
        "id": "abc123",
        "title": "Task Completed",
        "message": "Meeting Recording has been transcribed.",
        "read_at": null,
        "created_at": "2026-03-02T10:45:00+08:00"
    }
]
POST /api/notifications/mark-all-as-read

Marcar todas las notificaciones no leídas como leídas.

Response 200

{
    "success": true
}

Pago

GET /api/checkout/{plan}

Obtener una URL de pago de Paddle para un plan de suscripción.

Parámetros de ruta

ParámetroDescripción
plantest / month / year

Respuesta

Devuelve un objeto de opciones de checkout de Paddle. Devuelve 404 para un plan inválido.

GET /api/health

Endpoint público de verificación de estado. No requiere autenticación.

Respuesta 200

{
    "status": "ok"
}