Documentação da API

API REST para transcrição de áudio e vídeo. Clientes pagos autenticam integrações de terceiros com uma chave de API criada nas configurações da conta.

URL base

https://scribe.uustudio.cc

Autenticação

Integrações de terceiros devem enviar uma chave de API de uma conta paga no cabeçalho Authorization.

Cabeçalho Authorization

Authorization: Bearer {token}

Crie e revogue chaves na página de Chaves de API das configurações. Os endpoints de autenticação do app são reservados aos clientes oficiais.

Respostas de erro

Todos os erros retornam um corpo JSON com um campo message .

Erro padrão

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

Erro de validação (422)

{
    "message": "The name field is required.",
    "errors": {
        "name": ["The name field is required."]
    }
}
StatusDescrição
401Não autenticado (token ausente ou inválido)
403Proibido ou limite do plano excedido
404Recurso não encontrado
422Falha na validação
429Taxa limitada ou muitas tarefas simultâneas
500Erro interno do servidor

Limites de taxa

Endpoints de API autenticados são limitados a 10 solicitações por minuto por token.

Limites de uso

Disponibilidade da API

A API REST de terceiros não está disponível no plano Gratuito. Assine Pro ou Max, ou compre um pacote pré-pago, para criar e usar chaves de API.

Tamanho máximo de arquivo
2 GB
Tarefas simultâneas
Máx 3
Máximo de tentativas por tarefa
3

Comparação de planos pagos

RecursoPay as you goProMax
Envios diáriosIlimitadoIlimitadoIlimitado
Formatos de exportaçãoTodosTodosTodos
Prioridade de tarefasMédiaMédiaAlta

Fluxos de trabalho

Enviar arquivo de áudio/vídeo

  1. POST /api/uploads/sign → Obter upload_id e informações da parte
  2. PUT {presigned_url} → Enviar cada parte para o armazenamento
  3. POST /api/uploads/complete → Finalizar envio, criar tarefa automaticamente
  4. GET /api/tasks/{id} → Consultar status (pending -> scribing -> finished)
  5. GET /api/tasks/{id}/download/srt → Exportar (opcional)

Criar tarefa manualmente

  1. POST /api/tasks → Criar com disk, path, name
  2. GET /api/tasks/{id} → Consultar status
  3. GET /api/tasks/{id} → Obter segments, summary, mindmap

Auth

POST /api/login

Autentique-se com e-mail e senha. Retorna um token Sanctum.

Corpo da requisição

CampoTipoObrigatórioDescrição
emailstringYesE-mail do usuário (máx 255)
passwordstringYesSenha do usuário

Resposta 200

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

Limitado a 5 tentativas por minuto por e-mail.

POST /api/register

Crie uma conta nova. Retorna um token Sanctum.

Corpo da requisição

CampoTipoObrigatórioDescrição
namestringYesNome de exibição (máx 255)
emailstringYesE-mail único (máx 255)
passwordstringYesDeve ser confirmado
password_confirmationstringYesConfirmação de senha

Resposta 201

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

Autentique-se via Google OAuth. Cria uma conta se não existir.

Corpo da requisição

CampoTipoObrigatórioDescrição
providerstringYesgoogle provedores suportados
codestringYesCódigo de autorização OAuth

Resposta 200

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

Revoga o token de acesso atual.

Resposta 204

Não retorna corpo.

Tarefas

POST /api/tasks

Cria uma tarefa de transcrição. Máx 3 tarefas simultâneas por usuário.

Corpo da requisição

CampoTipoObrigatórioDescrição
diskstringYesr2 / remote / youtube Identificador da fonte de armazenamento
namestringYesNome da tarefa (máx 255)
pathstringYesCaminho do arquivo ou URL de origem
filestringNoNome de arquivo original (máx 255)
sizeintegerNoTamanho do arquivo em bytes
durationintegerNoDuração em segundos
costintegerNoCusto em segundos
segmentsarrayNoSegmentos de transcrição
speaker_diarizationbooleanNãoapp.tasks.speaker_diarization_api_description

Resposta 201

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

Erros

StatusDescrição
403Usuários gratuitos não podem enviar links do YouTube pela API.
429Máximo de 3 tarefas simultâneas atingido
GET /api/tasks/{id}

Obtém detalhes completos da tarefa, incluindo resultados de transcrição.

Resposta

{
    "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 resposta

CampoTipoDescrição
diskstring|nullDisco de armazenamento: r2 / remote / youtube
sizeint|nullTamanho do arquivo em bytes
costint|nullCusto em segundos
attemptsintContagem de tentativas
qualityint|nullPontuação de qualidade (0-5)
summarystring|nullResumo gerado por IA
mindmapstring|nullMapa mental gerado por IA
folderstring|nullNome da primeira tag (pasta)
tagsarrayTodos os nomes de tags
urlstring|nullURL de origem (para tarefas YouTube)
segmentsarray|nullSegmentos de transcrição
segments[].startintTempo de início (ms)
segments[].endintTempo de fim (ms)
segments[].textstringTexto do segmento
segments[].speakerstring|nullIdentificador do interlocutor
segments[].tokensarray|nullArray de tokens de palavras
exportobjectMetadados de exportação (allowed_formats, heavy_formats, version)
GET /api/tasks

Parâmetros de consulta

ParâmetroTipoPadrãoDescrição
statusstringallFiltrar por status
searchstring—Pesquisar por nome
folderstring—Filtrar por pasta (ou Uncategorized)
pageint1Número da página
per_pageint25Itens por página (máx 100)

Resposta

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

Tentar novamente uma tarefa com falha. Define o status para pending (R2) ou waiting (remote/YouTube). Máx 3 tentativas.

Resposta 200

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

Exportar transcrição. Formatos leves retornam o arquivo diretamente. Formatos pesados (pdf/docx) podem retornar 202 durante o processamento.

Parâmetros de caminho

ParâmetroDescrição
formattxt / srt / vtt / csv / pdf / docx

Respostas

200 - Arquivo pronto (formatos leves)

Retorna um arquivo binário.

200 - Arquivo pronto (formatos pesados, requisição JSON)

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

202 - Processando formato pesado

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

Transmitir o arquivo de áudio ou vídeo original diretamente do armazenamento (apenas R2).

Resposta

200 - Fluxo binário do arquivo de áudio ou vídeo. Retorna 404 se o arquivo estiver ausente ou não estiver no disco R2.

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

Atualizar e retornar o resumo e mapa mental mais recentes gerados por IA.

Resposta

{
    "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.

Resposta

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

Atualizar campos da tarefa. Todos os campos são opcionais.

Corpo da requisição

CampoTipoDescrição
namestringNovo nome (máx 255)
folderstring|nullNome da pasta (null remove a tarefa de uma pasta)
durationintegerDuração em segundos
costintegerCusto em segundos
segmentsarrayArray completo de segmentos para substituir
textstringTexto completo da transcrição
qualityintegerPontuação de qualidade (0-5)
indexintegerÍndice de ordenação da tarefa

Resposta 200

Retorna o objeto de tarefa completo (igual a Detalhe da tarefa).

DELETE /api/tasks/{id}

Response 200

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

Excluir múltiplas tarefas de uma vez. Apenas tarefas do usuário autenticado serão excluídas. IDs que não pertencem ao usuário são ignorados.

Corpo da requisição

CampoTipoObrigatórioDescrição
idsarrayYesArray de IDs de tarefas a excluir (mín 1)

Resposta 200

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

Mover múltiplas tarefas para uma pasta de uma vez. Apenas tarefas do usuário autenticado serão movidas.

Corpo da requisição

CampoTipoObrigatórioDescrição
idsarrayYesArray de IDs de tarefas a mover (mín 1)
folderstringYesNome da pasta de destino (máx 255)

Resposta 200

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

Envios

Envio multipart
POST /api/uploads/sign

Corpo da requisição

CampoTipoObrigatórioDescrição
filestringYesNome do arquivo (deve usar um formato suportado)
content_typestringYesTipo MIME (deve corresponder à extensão do arquivo)
sizeintegerYesTamanho do arquivo em bytes (máx 2.147.483.648 / 2 GB)
durationintegerNoDuração do áudio em segundos

Resposta

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

Corpo da requisição

CampoTipoObrigatórioDescrição
pathstringYesCaminho de envio (máx 2048)
upload_idstringYesID do envio (máx 2048)
part_numberintegerYesNúmero da parte (1-10000)

Resposta

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

Use PUT com a URL e cabeçalhos retornados para enviar a parte.

POST /api/uploads/complete

Completar um envio multipart. Isso cria automaticamente uma tarefa e retorna 403 quando a API não está disponível ou um limite do plano é excedido.

Corpo da requisição

CampoTipoObrigatórioDescrição
pathstringYesCaminho de envio (máx 2048)
upload_idstringYesID do envio (máx 2048)
original_namestringYesNome de arquivo original (deve usar um formato suportado)
content_typestringYesTipo MIME (deve corresponder à extensão do arquivo)
sizeintegerYesTamanho do arquivo em bytes (máx 2 GB)
namestringNoNome da tarefa (padrão para o nome do arquivo sem extensão)
durationintegerNoDuração em segundos (mín 1)
speaker_diarizationbooleanNãoapp.tasks.speaker_diarization_api_description

Resposta 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

Corpo da requisição

CampoTipoObrigatórioDescrição
pathstringYesCaminho de envio (máx 2048)
upload_idstringYesID do envio (máx 2048)

Resposta

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

Pastas

Baseado em tags
GET /api/folders

Liste todas as pastas com contagens de tarefas.

Resposta

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

Corpo da requisição

CampoTipoObrigatórioDescrição
namestringYesNome da pasta (máx 14 caracteres / 7 caracteres chineses, único por usuário)

Resposta 201

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

Corpo da requisição

CampoTipoObrigatórioDescrição
namestringYesNovo nome da pasta (mesmas restrições que criar)

Resposta 200

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

Response 200

{
    "message": "Folder deleted successfully"
}

Usuário

GET /api/user

Resposta

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

CampoTipoDescrição
used_secondsintSegundos usados desde a última concessão mensal
remaining_secondsintSegundos restantes
total_secondsintTotal de segundos
usage_percentintPorcentagem de uso (0-100)
PUT /api/user

Corpo da requisição

CampoTipoObrigatórioDescrição
namestringNoNome de exibição (máx 255)
emailstringNãoNovo e-mail (deve ser único)
avatarfileNoArquivo de imagem (máx 5 MB)

Resposta 200

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

Notificações

GET /api/notifications

Obter as 10 notificações mais recentes.

Resposta

[
    {
        "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 as notificações não lidas como lidas.

Response 200

{
    "success": true
}

Checkout

GET /api/checkout/{plan}

Obter uma URL de checkout da Paddle para um plano de assinatura.

Parâmetros de caminho

ParâmetroDescrição
plantest / month / year

Resposta

Retorna um objeto de opções de checkout da Paddle. Retorna 404 para um plano inválido.

GET /api/health

Endpoint público de verificação de integridade. Não requer autenticação.

Resposta 200

{
    "status": "ok"
}