Transcrição para apps e produtos SaaS
Coloque recursos de notas de voz, transcrição de reuniões, legendas ou busca em áudio no seu produto usando uma API REST assíncrona. Você faz o upload, inicia a tarefa, recebe o aviso via webhook e salva os trechos transcritos.
Como funciona em produção
- Seu backend chama
POST /uploadpara o arquivo do usuário e repassa o formulário assinado para o cliente fazer o envio, ou então sobe o arquivo direto pelo servidor (até 100 MiB). - Comece a tarefa passando o
fileUrlrecebido no campoaudio_url, junto com o seuwebhook_url. - Confirme a assinatura do webhook, descarte entregas repetidas checando o
X-KolWrite-Delivery-Ide, casoresult_omittedvenha como true, busque o resultado emGET /transcribe/{jobId}. - Salve os
segments(com texto, tempos e falantes) para mostrar na sua interface e exporte emsrtoutxtquando o usuário pedir.
Requisição para iniciar a tarefa:
{
"audio_url": "<fileUrl from POST /upload>",
"model": "oracle",
"language": "auto",
"include_diarization": true,
"output_format": "json",
"webhook_url": "https://api.example.com/hooks/kolwrite",
"webhook_secret": "<random secret>"
}
Validação dos webhooks
import crypto from "node:crypto";
// Express-style handler; rawBody is the exact request body as received.
export function verifyKolWrite(req, rawBody, secret) {
const timestamp = req.headers["x-kolwrite-timestamp"];
const expected = "sha256=" + crypto.createHmac("sha256", secret)
.update(timestamp + "." + rawBody).digest("hex");
const given = req.headers["x-kolwrite-signature"] || "";
return given.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}
Cada aviso é entregue pelo menos uma vez, com novas tentativas se houver falha. Use sempre o endpoint GET /transcribe/{jobId} como sua fonte oficial de consulta.
Escolha o modelo conforme a tarefa
| O que o produto precisa | Configuração | Por quê |
|---|---|---|
| Grande volume de áudio limpo gastando pouco | model: "base" | 0,40 créditos (US$ 0,48) por hora |
| Padrão para arquivos enviados por usuários | model: "oracle" | Qualidade de produção, com opção de tradução |
| Transcrição em outro idioma | Modelo Oracle + translate_to | Uma única tarefa já devolve o texto traduzido |
| Identificar quem falou cada trecho | include_diarization: true | Já incluído no preço |
| Legendas | output_format: "srt" | Pronto para players de vídeo |
Limites para considerar na arquitetura
- Upload inline em Base64: até 4 MiB de mídia decodificada. Upload assinado: até 100 MiB.
- O formulário de upload assinado expira em 60 minutos, e a URL de leitura, em 24 horas.
- As tarefas são assíncronas. Acompanhe o progresso pelos status
PENDINGeIN_PROGRESS. - Não é possível usar
channel_speaker_separationjunto com a diarização.
Perguntas e respostas
Existe SDK?
A API usa HTTPS e JSON padrão, então qualquer cliente HTTP resolve. Se quiser gerar código, use a especificação OpenAPI 3.1 em /openapi.json.
Como evito processar o mesmo webhook duas vezes?
Use o cabeçalho X-KolWrite-Delivery-Id para filtrar duplicatas. Quando há nova tentativa de envio, o ID é mantido.
Como funciona a cobrança?
A cobrança é por segundo de áudio, seguindo a tabela de créditos do modelo, sem valor mínimo. 1 crédito sai por US$ 1,20.