Documentação da API

O Archivarix Tube Search fornece uma API REST para acesso programático a metadados de vídeos do YouTube arquivados, legendas e resumos de IA. Esta página é a referência completa da API.

O acesso à API requer a assinatura MCP + API. Consulte Preços para detalhes.

Autenticação

As chaves de API são criadas no seu Perfil → aba API. Inclua a chave em cada requisição usando um destes cabeçalhos:

X-API-Key: tsk_SUA_CHAVE_AQUI

ou

Authorization: Bearer tsk_SUA_CHAVE_AQUI

As chaves usam o prefixo tsk_. Mantenha sua chave em segredo — ela concede acesso total à API em nome da sua conta.

Endpoints

A pesquisa de canais é um processo de duas etapas: criar uma sessão de pesquisa e depois consumir resultados via Server-Sent Events.

POST /api/search

Iniciar uma nova pesquisa de canal.

Corpo da requisição (JSON):

{
  "query": "@handle ou URL do canal ou URL/ID do vídeo"
}

Resposta:

{
  "data": {
    "searchSessionId": "uuid",
    "sseEndpointUrl": "/api/search/uuid/stream",
    "channelId": "UCxxxxxx",
    "channelTitle": "Nome do canal"
  }
}

GET /api/search/:sessionId/stream

Conecte-se ao fluxo SSE para receber resultados em tempo real. Defina o cabeçalho Accept: text/event-stream. Consulte a seção Protocolo SSE para tipos de eventos.

POST /api/search/:sessionId/continue

Continuar uma pesquisa paginada para carregar a próxima página de resultados do arquivo.

GET /api/search/background-status/:channelId

Verificar se uma pesquisa de canal está em execução em segundo plano.

Resposta:

{
  "data": {
    "running": true,
    "searchSessionId": "uuid"
  }
}

Pesquisa de texto completo

GET /api/fts

Pesquisar em todos os títulos e descrições de vídeos indexados.

Parâmetros de consulta:

ParâmetroTipoDescrição
qstringConsulta de pesquisa (obrigatório)
pagenumberNúmero da página (padrão: 1)
pageSizenumberResultados por página (padrão: 50, máx: 100)
statusstringFiltro: deleted ou live
hasVideobooleanApenas vídeos com arquivos de vídeo arquivados
hasSubtitlesbooleanApenas vídeos com legendas
hasSummarybooleanApenas vídeos com resumos de IA
sortstringrelevance | date-desc | date-asc | duration-desc | duration-asc

Legendas

GET /api/subtitles/:videoId

Baixar legendas de um vídeo.

Parâmetros de consulta:

ParâmetroTipoDescrição
formatstringsrt (padrão) ou vtt

POST /api/subtitles/:videoId/fetch

Obter legendas sob demanda via yt-dlp ou Wayback Machine. Inicia uma tarefa em segundo plano se as legendas ainda não estiverem disponíveis.

POST /api/subtitles/bulk-download

Baixar legendas de vários vídeos de uma vez.

Corpo da requisição (JSON):

{
  "videoIds": ["dQw4w9WgXcQ", "jNQXAC9IVRw"],
  "query": "consulta opcional para destaque"
}

Resumos de IA

POST /api/summary/generate

Gerar um resumo de IA para um vídeo. Requer legendas disponíveis.

Corpo da requisição (JSON):

{
  "videoId": "dQw4w9WgXcQ",
  "private": false
}

Resposta (202 Accepted):

{
  "data": {
    "status": "generating",
    "videoId": "dQw4w9WgXcQ"
  }
}

GET /api/summary/:videoId

Obter o resumo de IA para um vídeo específico.

DELETE /api/summary/:videoId

Excluir um resumo. Apenas administradores.

GET /api/summary/browse

Navegar por resumos com filtros.

Parâmetros de consulta:

ParâmetroTipoDescrição
tagstringFiltrar por tag
channelIdstringFiltrar por canal
languagestringFiltrar por código de idioma
pagenumberNúmero da página (padrão: 1)
limitnumberResultados por página (padrão: 20)

GET /api/summary/latest

Obter os resumos gerados mais recentemente.

GET /api/summary/tags

Obter tags populares de todos os resumos.

GET /api/summary/languages

Obter idiomas disponíveis de resumos com contagens.

GET /api/summary/channels

Obter canais que possuem resumos.

Status do vídeo

GET /api/videos/:videoId/status-history

Obter o histórico de mudanças de status de um vídeo (ex., live → deleted → re-uploaded).

Sistema

GET /api/health

Endpoint de verificação de saúde. Retorna o status do servidor.

GET /api/features

Obter flags de funcionalidades e limites para o usuário/nível atual.

GET /api/tiers

Obter dados de comparação de níveis (limites e funcionalidades por nível).

Protocolo SSE

O fluxo de pesquisa de canais envia Server-Sent Events. Cada evento tem um tipo e dados JSON:

EventoDescrição
search:channel_resolvedInformações do canal resolvidas (channelId, título, avatar, etc.)
search:progressAtualização do progresso do pipeline (etapa, porcentagem)
search:videoResultado de vídeo individual
search:video_batchLote de resultados de vídeos (mais eficiente)
search:caption_infoInformação de disponibilidade de legendas para vídeos descobertos
search:completePesquisa concluída com sucesso
search:errorErro durante a pesquisa

Limites de taxa

Requisições API (nível MCP + API) têm os seguintes limites:

Quando um limite é excedido, a API retorna HTTP 429 com o código de erro RATE_LIMITED.

Códigos de erro

Todos os erros retornam JSON com um objeto de erro:

{"error": {"code": "RATE_LIMITED", "message": "Rate limit exceeded"}}
CódigoSignificado
UNAUTHORIZEDChave de API ausente ou inválida
FORBIDDENAcesso à API não habilitado para sua conta
RATE_LIMITEDLimite de taxa excedido
API_KEY_REQUIREDO acesso programático requer uma chave de API
INVALID_INPUTConsulta ou parâmetros inválidos
NOT_FOUNDRecurso não encontrado

Exemplos

curl

# Iniciar uma pesquisa de canal
curl -X POST https://tube.archivarix.net/api/search \
  -H "X-API-Key: tsk_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"query": "@MrBeast"}'

# Receber resultados (SSE)
curl -N https://tube.archivarix.net/api/search/SESSION_ID/stream \
  -H "X-API-Key: tsk_SUA_CHAVE" \
  -H "Accept: text/event-stream"

# Continuar pesquisa paginada
curl -X POST https://tube.archivarix.net/api/search/SESSION_ID/continue \
  -H "X-API-Key: tsk_SUA_CHAVE"

# Pesquisa de texto completo
curl "https://tube.archivarix.net/api/fts?q=video+excluido&pageSize=20&sort=relevance" \
  -H "X-API-Key: tsk_SUA_CHAVE"

# Baixar legendas (SRT)
curl https://tube.archivarix.net/api/subtitles/dQw4w9WgXcQ \
  -H "X-API-Key: tsk_SUA_CHAVE"

# Obter legendas sob demanda
curl -X POST https://tube.archivarix.net/api/subtitles/dQw4w9WgXcQ/fetch \
  -H "X-API-Key: tsk_SUA_CHAVE"

# Gerar resumo de IA
curl -X POST https://tube.archivarix.net/api/summary/generate \
  -H "X-API-Key: tsk_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"videoId": "dQw4w9WgXcQ"}'

# Obter um resumo
curl https://tube.archivarix.net/api/summary/dQw4w9WgXcQ \
  -H "X-API-Key: tsk_SUA_CHAVE"

# Navegar por resumos por tag
curl "https://tube.archivarix.net/api/summary/browse?tag=music&limit=10" \
  -H "X-API-Key: tsk_SUA_CHAVE"

# Verificação de saúde
curl https://tube.archivarix.net/api/health

Python

import requests

API_KEY = "tsk_SUA_CHAVE"
BASE = "https://tube.archivarix.net"
headers = {"X-API-Key": API_KEY}

# --- Pesquisa de canal ---
resp = requests.post(f"{BASE}/api/search",
    headers=headers,
    json={"query": "@MrBeast"})
session = resp.json()["data"]
search_id = session["searchSessionId"]

# Receber resultados (SSE)
with requests.get(f"{BASE}/api/search/{search_id}/stream",
    headers={**headers, "Accept": "text/event-stream"},
    stream=True) as r:
    for line in r.iter_lines(decode_unicode=True):
        if line.startswith("data:"):
            print(line[5:])

# --- Pesquisa de texto completo ---
resp = requests.get(f"{BASE}/api/fts",
    headers=headers,
    params={"q": "video excluido", "pageSize": 20, "sort": "relevance"})
print(resp.json())

# --- Baixar legendas ---
resp = requests.get(f"{BASE}/api/subtitles/dQw4w9WgXcQ",
    headers=headers,
    params={"format": "srt"})
with open("subtitles.srt", "w") as f:
    f.write(resp.text)

# --- Gerar resumo de IA ---
resp = requests.post(f"{BASE}/api/summary/generate",
    headers=headers,
    json={"videoId": "dQw4w9WgXcQ"})
print(resp.json())  # {"data": {"status": "generating", ...}}

# --- Obter resumo ---
resp = requests.get(f"{BASE}/api/summary/dQw4w9WgXcQ",
    headers=headers)
summary = resp.json()["data"]
print(summary["title"], summary["tags"])

JavaScript (Node.js / Browser)

const API_KEY = "tsk_SUA_CHAVE";
const BASE = "https://tube.archivarix.net";
const headers = { "X-API-Key": API_KEY };

// --- Pesquisa de canal ---
const searchResp = await fetch(`${BASE}/api/search`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ query: "@MrBeast" }),
});
const { data: { searchSessionId } } = await searchResp.json();

// Receber resultados (SSE)
const es = new EventSource(
  `${BASE}/api/search/${searchSessionId}/stream`
);
es.addEventListener("search:video", (e) => {
  const video = JSON.parse(e.data);
  console.log(video.title, video.videoId);
});
es.addEventListener("search:complete", () => es.close());

// --- Pesquisa de texto completo ---
const ftsResp = await fetch(
  `${BASE}/api/fts?q=video+excluido&pageSize=20`,
  { headers }
);
const results = await ftsResp.json();

// --- Baixar legendas ---
const subResp = await fetch(
  `${BASE}/api/subtitles/dQw4w9WgXcQ?format=srt`,
  { headers }
);
const srtText = await subResp.text();

// --- Gerar resumo de IA ---
const sumResp = await fetch(`${BASE}/api/summary/generate`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ videoId: "dQw4w9WgXcQ" }),
});
console.log(await sumResp.json());

// --- Navegar por resumos ---
const browseResp = await fetch(
  `${BASE}/api/summary/browse?tag=music&limit=10`,
  { headers }
);
console.log(await browseResp.json());