Formate capítulos de podcast com marcadores HH:MM:SS
Transforme uma lista de títulos e tempos iniciais de capítulos de podcast em marcadores padronizados e prontos para copiar.
Executar grátis
Informe cada início como um número inteiro de segundos, e o formatador o converte em HH:MM:SS seguido do título. Ele também confirma que cada capítulo começa depois do anterior, identificando tempos repetidos ou fora de ordem antes que cheguem às notas do episódio, ao painel de hospedagem, à entrega de produção ou ao fluxo de publicação.
Prepare os títulos e os tempos iniciais
Crie uma linha para cada capítulo na mesma ordem em que o público o ouvirá. Cada linha precisa de um título descritivo e de um tempo inicial inteiro e não negativo, medido em segundos desde o começo do episódio. Por exemplo, a abertura pode começar em 0, uma conversa em 95 e um segmento posterior em 3725. Você não precisa converter esses valores em horas, minutos e segundos manualmente. Mantenha cada título em uma única linha para que todo marcador de saída continue sendo uma linha independente e fácil de reutilizar. Os espaços no início e no fim são removidos, enquanto a redação e o uso de maiúsculas no interior são preservados. O formatador aceita até 500 linhas, quantidade suficiente para programas longos e detalhados, mas ainda com um limite claro para a entrada. Confira os tempos no áudio final exportado, e não em uma edição anterior, pois um anúncio inserido, uma introdução encurtada ou uma trilha substituída pode deslocar todos os capítulos seguintes. Segundos de origem corretos são essenciais para uma navegação realmente útil.
Entenda a formatação e a validação da ordem
Cada tempo aceito é dividido de maneira determinística em horas, minutos e segundos. Todos os componentes recebem pelo menos dois dígitos, gerando linhas como 00:00:00 - Boas-vindas e 01:02:05 - Perguntas do público. As horas não voltam a zero depois de 24; assim, gravações excepcionalmente longas mantêm a posição correta em vez de parecerem ter iniciado um novo dia. Em seguida, o formatador une as linhas exatamente na ordem enviada. Antes de entregar o resultado, ele verifica se cada início é estritamente maior que o valor anterior. Tempos iguais são recusados porque dois capítulos não estabelecem uma divisão sequencial clara no mesmo segundo; um valor menor também é recusado porque colocaria uma linha posterior antes na reprodução. A mensagem de erro aponta a linha e os segundos conflitantes, facilitando o ajuste da lista original. Os tempos ainda precisam ser números inteiros, finitos e seguros dentro do intervalo publicado. Essas regras evitam arredondamento invisível, sequência ambígua e timestamps inválidos em uma descrição que parecia pronta.
Publique e automatize os marcadores
Copie os marcadores retornados para qualquer destino que aceite o padrão convencional HH:MM:SS - Título, como notas de produção, descrições de episódios, campos de um gerenciador de conteúdo ou documentos de entrega. Algumas hospedagens ou plataformas de reprodução podem aplicar exigências próprias, como obrigar o primeiro capítulo a começar em zero ou reconhecer outro separador. Este formatador não inventa regras específicas de serviços: ele produz uma base limpa e previsível e valida a ordem necessária em qualquer lista de capítulos. Consulte as orientações atuais do destino antes da publicação, especialmente se capítulos clicáveis automáticos forem importantes. Em um fluxo automatizado, envie a lista depois que a edição ou a transcrição aprovar os tempos finais e armazene ou publique a string retornada sem outra etapa de formatação. A versão executada no navegador usa o mesmo solucionador determinístico da API; portanto, uma lista conferida manualmente gera texto idêntico quando automatizada. O uso no navegador é gratuito, e cada solicitação de API utiliza o preço-base exibido de US$ 0,002.
Casos de uso
Prepare a descrição de um episódio
Converta uma planilha de capítulos aprovada pela edição em marcadores consistentes para colar nas notas ou no formulário de publicação.
Valide uma entrega de produção
Encontre tempos repetidos ou fora de ordem antes que a produção envie a lista final para uma hospedagem ou para um cliente.
Padronize um fluxo automatizado
Aplique a mesma largura de timestamp e o mesmo separador a todos os episódios sem converter segundos manualmente.
Perguntas frequentes
Quanto custa?
Você pode executar gratuitamente no navegador nesta página. Cada solicitação de API custa US$ 0,002.
Qual formato é produzido?
Cada linha usa HH:MM:SS - Título, com horas, minutos e segundos preenchidos com pelo menos dois dígitos.
Dois capítulos podem ter o mesmo tempo inicial?
Não. Os tempos precisam crescer estritamente, portanto cada capítulo deve começar depois do anterior.
O primeiro capítulo precisa começar em zero?
Não. O formatador aceita qualquer início não negativo, embora uma hospedagem específica possa impor outra regra.
Posso informar segundos decimais?
Não. Os inícios devem usar segundos inteiros para evitar arredondamentos ocultos e manter a saída inequívoca.
O formatador altera os títulos?
Ele remove espaços externos, mas preserva a redação e as maiúsculas. Títulos com quebras de linha são recusados.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/audio/podcast-chapter-timestamps \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"chapters":[{"title":"Welcome","start_time":0},{"title":"The main interview","start_time":95},{"title":"Listener questions","start_time":3725}]}'const res = await fetch("https://api.kit.forhosting.com/audio/podcast-chapter-timestamps", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"chapters": [
{
"title": "Welcome",
"start_time": 0
},
{
"title": "The main interview",
"start_time": 95
},
{
"title": "Listener questions",
"start_time": 3725
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/podcast-chapter-timestamps",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"chapters": [
{
"title": "Welcome",
"start_time": 0
},
{
"title": "The main interview",
"start_time": 95
},
{
"title": "Listener questions",
"start_time": 3725
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/podcast-chapter-timestamps", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"chapters":[{"title":"Welcome","start_time":0},{"title":"The main interview","start_time":95},{"title":"Listener questions","start_time":3725}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"chapters":[{"title":"Welcome","start_time":0},{"title":"The main interview","start_time":95},{"title":"Listener questions","start_time":3725}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/podcast-chapter-timestamps", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"chapters": [
{
"title": "Welcome",
"start_time": 0
},
{
"title": "The main interview",
"start_time": 95
},
{
"title": "Listener questions",
"start_time": 3725
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.podcast_chapter_timestamps",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_chapters | 500 |
max_start_time | 359999999 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |