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
Pesquisa (Pesquisa de canais via SSE)
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âmetro | Tipo | Descrição |
|---|---|---|
q | string | Consulta de pesquisa (obrigatório) |
page | number | Número da página (padrão: 1) |
pageSize | number | Resultados por página (padrão: 50, máx: 100) |
status | string | Filtro: deleted ou live |
hasVideo | boolean | Apenas vídeos com arquivos de vídeo arquivados |
hasSubtitles | boolean | Apenas vídeos com legendas |
hasSummary | boolean | Apenas vídeos com resumos de IA |
sort | string | relevance | date-desc | date-asc | duration-desc | duration-asc |
Legendas
GET /api/subtitles/:videoId
Baixar legendas de um vídeo.
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
format | string | srt (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âmetro | Tipo | Descrição |
|---|---|---|
tag | string | Filtrar por tag |
channelId | string | Filtrar por canal |
language | string | Filtrar por código de idioma |
page | number | Número da página (padrão: 1) |
limit | number | Resultados 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:
| Evento | Descrição |
|---|---|
search:channel_resolved | Informações do canal resolvidas (channelId, título, avatar, etc.) |
search:progress | Atualização do progresso do pipeline (etapa, porcentagem) |
search:video | Resultado de vídeo individual |
search:video_batch | Lote de resultados de vídeos (mais eficiente) |
search:caption_info | Informação de disponibilidade de legendas para vídeos descobertos |
search:complete | Pesquisa concluída com sucesso |
search:error | Erro 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ódigo | Significado |
|---|---|
UNAUTHORIZED | Chave de API ausente ou inválida |
FORBIDDEN | Acesso à API não habilitado para sua conta |
RATE_LIMITED | Limite de taxa excedido |
API_KEY_REQUIRED | O acesso programático requer uma chave de API |
INVALID_INPUT | Consulta ou parâmetros inválidos |
NOT_FOUND | Recurso 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());