DocumentaçãoSDK para Node.js

SDK para Node.js

Integre transcrições ao seu servidor com @transcript1/sdk. Envie links ou arquivos, baixe texto e legendas, acompanhe o progresso e trate erros.

Com @transcript1/sdk, você envia links ou arquivos e aguarda a transcrição no seu código TypeScript ou JavaScript. Use o pacote no servidor.

Para links de redes sociais, use o SDK 1.1.0 ou mais recente. O SDK 1.0.1 só aceita YouTube e recusa os outros links antes de chamar a API. Atualize com npm i @transcript1/sdk@latest.

A versão acima cobre as seis plataformas originais. Twitch, Dailymotion, Pinterest, LinkedIn e Snapchat precisam de uma versão que já inclua essas plataformas. Versões antigas podem recusar os links antes do envio.

Instale o pacote

npm i @transcript1/sdk

Os exemplos abaixo usam módulos ES. Salve o código em .mjs ou configure "type": "module" no package.json se usar .js. No Node 20.19+, você também pode importar com require(), como em require('@transcript1/sdk').

Configure sua chave de API

Crie uma chave em “API keys”. Depois, configure a variável TRANSCRIPT1_API_KEY no servidor ou informe apiKey ao criar o cliente:

import { Transcript1 } from '@transcript1/sdk';
 
const t1 = new Transcript1(); // reads TRANSCRIPT1_API_KEY
const other = new Transcript1({ apiKey: 't1_...' });

Se não encontrar uma chave, o construtor lança Transcript1Error com missing_api_key.

Envie e aguarde a transcrição

Chame transcribe(input, options) para criar a transcrição e esperar o texto ficar pronto. A promise retorna um objeto CompletedTranscription, com status: 'completed' e o campo transcript. Se a transcrição falhar ou você cancelar, a promise é rejeitada.

const done = await t1.transcribe('https://youtu.be/dQw4w9WgXcQ');
console.log(done.transcript.text);
 
const file = await t1.transcribe('./interview.m4a', { speakers: true });

Se enviar um Buffer ou Uint8Array, passe também o nome do arquivo. É por ele que o SDK reconhece o formato:

import { readFile } from 'node:fs/promises';
 
const buffer = await readFile('./call.mp3');
const call = await t1.transcribe(buffer, { filename: 'call.mp3' });

O SDK trata strings iniciadas por http:// ou https:// como links. As demais são caminhos de arquivo. Você pode usar links do YouTube, X, TikTok, Instagram, Facebook, Bluesky, Twitch, Dailymotion, Pinterest, LinkedIn e Snapchat, ou fazer upload. Confira os tipos de gravação pública, as legendas disponíveis e as restrições em Links aceitos e opções. As plataformas adicionais exigem HTTPS. Para arquivos, o limite é de 2.000.000.000 bytes, com extensão mp3, wav, m4a, flac, ogg, opus, mp4, mov, webm ou mkv.

O post precisa ser público. Se tiver vários vídeos, transcrevemos só o primeiro. A API reconhece a plataforma pelo link. Os formatos de link curto e os limites estão em Links aceitos e opções.

Também aceitamos Blob, ReadableStream<Uint8Array> e iteráveis assíncronos de blocos Uint8Array. Para Blob, informe filename, exceto quando usar um File com nome. Para streams e iteráveis assíncronos, informe tanto filename quanto size, em bytes.

Baixe texto ou legendas

Use download(id, options) para aguardar a conclusão e baixar a transcrição como string. Isso também vale para JSON: você recebe o texto JSON da API, sem parse para objeto.

const text = await t1.download(done.id); // text is the default
const withTimes = await t1.download(done.id, { timestamps: true });
const srt = await t1.download(done.id, { format: 'srt' });
const vtt = await t1.download(done.id, { format: 'vtt' });
const json = await t1.download(done.id, { format: 'json' });

Combine timestamps: true apenas com text. Em outros formatos, a promise é rejeitada com invalid_input. Se a transcrição falhar ou você cancelar, a promise de download também é rejeitada.

Inicie agora e consulte depois

Se não quiser esperar o texto, use transcriptions.create. No caso de arquivos, a chamada só retorna depois de terminar o upload, mas não espera a transcrição.

const job = await t1.transcriptions.create('./long-interview.mp4');
const now = await t1.transcriptions.get(job.id);
const finished = await t1.transcriptions.get(job.id, { wait: true });

Sem wait, get informa o estado naquele momento. Com wait: true, a promise aguarda até o status ser completed, failed ou canceled. Confira finished.status antes de acessar o texto. Diferentemente de transcribe, a promise de get não é rejeitada se o processamento falhar ou você cancelar a transcrição.

Liste transcrições, exclua e consulte a conta

for await (const item of t1.transcriptions.list({ status: 'completed', limit: 50 })) {
  console.log(item.id, item.created_at);
}
 
await t1.transcriptions.delete(job.id);
const account = await t1.account();
console.log(account.minutes.remaining);

Ao iterar com list, o SDK busca as páginas conforme necessário. Você pode filtrar por status e platform (youtube, x, tiktok, instagram, facebook, bluesky, twitch, dailymotion, pinterest, linkedin, snapchat ou upload). Escolha de 1 a 100 itens por página com limit; o padrão da API é 20. Os campos continuam em snake_case, como na API. Guarde media_id como veio, sem tentar interpretar a string.

Use delete para cancelar uma transcrição em andamento ou excluir uma já finalizada, junto com o texto. Para consultar plano, saldo de minutos e limites, use account.

Opções

Ao criar o cliente, você pode passar apiKey, baseUrl, fetch e maxRetries. Se não informar baseUrl, usamos TRANSCRIPT1_API_URL, quando definida; caso contrário, https://api.transcript1.com. Para usar sua própria implementação de fetch, passe fetch. O padrão de maxRetries é 2, com valores inteiros de 0 a 10.

Estas opções valem tanto para transcribe quanto para transcriptions.create:

OpçãoPara que serve
speakersAtiva a identificação de falantes.
languageEscolhe auto (padrão) ou um idioma pelo código ISO 639-1.
sourcePara links, aceita auto ou stt. YouTube, X, TikTok, Bluesky, Dailymotion e LinkedIn também aceitam captions (somente legendas) quando há uma faixa que possa ser usada.
freshPede uma nova transcrição do link, sem reutilizar uma das últimas 24 horas.
filenameInforma o nome para Buffers, Blobs sem nome e streams, que exigem esse campo. Também pode substituir o nome original de um arquivo.
sizeInforma o tamanho em bytes. É obrigatório para streams e iteráveis assíncronos.
idempotencyKeyDefine a chave de idempotência. Se você não passar uma, o SDK gera um UUID novo por chamada.
onProgressDefine a função que recebe os eventos de progresso.
signalRecebe um AbortSignal para interromper a chamada.

Em transcriptions.get, as opções são wait, includeWords, onProgress e signal. Para pedir marcações de tempo por palavra, use includeWords: true. Durante a espera, onProgress avisa sobre mudanças no processamento.

Em download, você pode passar format, timestamps e signal. list também aceita signal. Para transcriptions.delete(id, options) e account(options), informe { signal } no argumento de opções.

Acompanhe o progresso

Configure onProgress em transcribe, transcriptions.create ou transcriptions.get quando estiver aguardando a transcrição:

await t1.transcribe('./interview.m4a', {
  onProgress(event) {
    console.log(event);
  },
});
EventoO que você recebe
uploadBytes enviados em sent e tamanho completo em total.
statusEstado atual da transcrição em status.
waiting_slotTempo de espera em segundos, em retryAfter, até tentar iniciar a transcrição de novo.
reconnectingAviso de queda de conexão durante a espera. Não tem campos extras e aparece uma vez por interrupção.

Interrompa uma chamada

Para interromper a chamada, passe o AbortSignal de um AbortController. Se quiser impor um prazo, use AbortSignal.timeout:

await t1.transcribe('https://youtu.be/dQw4w9WgXcQ', {
  signal: AbortSignal.timeout(10 * 60_000),
});

Se a interrupção acontecer antes da primeira requisição, a promise é rejeitada com aborted, sem ID de transcrição. Durante o upload, o SDK tenta excluir a transcrição se ela ainda estiver em awaiting_upload. Depois, a promise é rejeitada com aborted e o ID.

Interromper a espera não para a transcrição. Ela continua rodando, e você pode usar o transcriptionId do erro para voltar a acompanhar com transcriptions.get(id, { wait: true }). Para cancelar a transcrição de fato, chame transcriptions.delete(id).

Durante a espera, o SDK repete chamadas que falham por erro de rede ou HTTP 429, 500, 502, 503 e 504, sem limite de tentativas. O intervalo de reconexão aumenta de 2 para 4, 8, 16 e, por fim, 30 segundos. Para as outras chamadas, vale maxRetries. Se você já estiver no limite de transcrições ativas, o SDK espera e tenta criar a transcrição de novo. Use signal para limitar o tempo total dessas operações.

Trate os erros

Capture Transcript1Error para tratar erros da API, falhas na transcrição e erros locais do SDK:

import { Transcript1Error } from '@transcript1/sdk';
 
try {
  await t1.transcribe('./call.mp3');
} catch (error) {
  if (error instanceof Transcript1Error) {
    console.error(error.code, error.message, error.transcriptionId);
  }
}
CampoComo ler
messageExplicação do erro.
codeCódigo da API, da falha na transcrição, canceled ou um código local do SDK.
statusStatus HTTP. Não aparece em falhas de processamento ou erros locais.
detailsCampos adicionais da API, como minutes_needed e action_url. Sem detalhes extras, é um objeto vazio.
retryableIndica se vale tentar novamente. O padrão é false.
transcriptionIdID da transcrição, se já houver um.
transcriptionObjeto mais recente da transcrição, quando disponível.

O SDK usa os códigos locais missing_api_key, invalid_input, aborted, network_error e upload_token_refused. Se a resposta de erro não for JSON, o código terá o formato http_<status>.

Se o processamento falhar sem informar um objeto de erro, o SDK usa transcription_failed. Se a transcrição estiver concluída, mas a consulta não trouxer o texto, a promise de transcribe é rejeitada com internal_error. Os códigos da API estão em Erros e novas tentativas; os campos das respostas, na referência da API.

Onde o SDK pode rodar

Use Node 20.19+ no servidor. Bun e Deno devem funcionar pela compatibilidade com node:, mas nossos testes automatizados rodam só no Node. Nunca use o SDK no navegador nem exponha sua chave de API no código do cliente.

Última atualização 16 de outubro de 2026