Para verificar los datos de un vídeo de YouTube con una API, obtén los metadatos del vídeo con el endpoint de metadatos de YouTube de Scavio, extrae afirmaciones candidatas del título y la descripción con un LLM y, después, consulta en Google cada afirmación para ver si los resultados de fuentes fiables la respaldan o la contradicen. Scavio devuelve metadatos, no una transcripción, así que la extracción de afirmaciones se hace sobre el texto disponible o sobre una transcripción de tu propia fuente. La salida es un veredicto por afirmación (respaldada, sin respaldo o mixta) con las URL de las fuentes. Esto marca las afirmaciones para revisión humana; no es un oráculo de la verdad. El valor está en el anclaje: en lugar de confiar en la memoria de un modelo, anclas cada juicio a resultados reales de Google que una persona puede abrir y leer.
Requisitos previos
- Una clave de API de Scavio (sk_live_...) desde tu panel; las cuentas nuevas reciben 50 créditos gratis.
- Python 3.9+ con requests, o Node.js 18+ para la versión en JavaScript.
- Un LLM al que puedas llamar para extraer afirmaciones y juzgar el respaldo (Claude o similar).
- Una URL o un ID de vídeo de YouTube que quieras comprobar.
Guia paso a paso
Paso 1: Obtén los metadatos del vídeo
Envía la URL o el ID del vídeo al endpoint de metadatos de YouTube. Recibes el título, la descripción, el canal y estadísticas como visualizaciones, me gusta y número de comentarios. Recuerda que son solo metadatos; la respuesta no incluye transcripción. La descripción es el campo más rico, porque los creadores suelen llenarla de afirmaciones concretas, fechas y enlaces que puedes comprobar. Guarda también las estadísticas, ya que una afirmación que contradice un vídeo con millones de visualizaciones merece destacarse.
import requests
resp = requests.post(
"https://api.scavio.dev/api/v1/youtube/metadata",
headers={
"Authorization": "Bearer sk_live_...",
"Content-Type": "application/json",
},
json={"query": "https://www.youtube.com/watch?v=VIDEO_ID"},
)
data = resp.json()
print(data["title"], data["channel"], data["stats"]["views"])Paso 2: Extrae las afirmaciones candidatas
Pasa el título y la descripción a un LLM y pídele una lista corta de afirmaciones comprobables. Si tienes una transcripción de tu propia fuente, añádela aquí para más cobertura; la API no te dará ninguna. Cada afirmación debe ser una aseveración concreta que puedas buscar, como un número, una fecha o una causa y efecto con nombre. Descarta las opiniones y lo vago, porque no se pueden contrastar con resultados de búsqueda. Aquí el LLM hace trabajo real, así que revisa su salida antes de fiarte del resto.
# Scavio returns metadata, not a transcript.
# An LLM turns the title + description into checkable claims.
metadata_text = f"{data['title']}\n\n{data['description']}"
claims = extract_claims_with_llm(metadata_text)
# -> ["The battery lasts 40 hours", "It ships in March 2026", ...]
for c in claims:
print("CLAIM:", c)Paso 3: Comprueba cada afirmación en los resultados de Google
Para cada afirmación, consulta el endpoint de Google con light_request en false para obtener resultados orgánicos, el grafo de conocimiento y noticias. Con ese ajuste cuesta 2 créditos por consulta; el valor por defecto de light_request es true y cuesta 1, pero devuelve menos. Formula la consulta como la propia afirmación, o como la afirmación convertida en una pregunta neutral, para no sesgar los resultados. Leer resultados orgánicos y noticias ayuda a detectar afirmaciones que fueron ciertas pero ya se corrigieron.
import requests
def ground_claim(claim):
resp = requests.post(
"https://api.scavio.dev/api/v1/google",
headers={
"Authorization": "Bearer sk_live_...",
"Content-Type": "application/json",
},
json={"query": claim, "light_request": False},
)
g = resp.json()
return g["organic"], g.get("knowledge_graph"), g.get("news_results")Paso 4: Puntúa la afirmación y adjunta las fuentes
Devuelve los mejores resultados al LLM y pídele que juzgue si respaldan, contradicen o coinciden en parte con la afirmación. Registra el veredicto, un valor de confianza y las URL de las fuentes para que una persona pueda verificarlo. Sé prudente: cuando los resultados son escasos o contradictorios, marca la afirmación como mixta en vez de forzar un sí o un no. La confianza y los enlaces hacen la salida revisable, lo cual importa porque el modelo que juzga también puede equivocarse.
def score_claim(claim, organic):
# Feed the top results back to the LLM to judge support.
sources = [{"title": r["title"], "url": r["link"], "snippet": r["snippet"]}
for r in organic[:5]]
verdict = judge_with_llm(claim, sources) # supported | unsupported | mixed
return {
"claim": claim,
"verdict": verdict["label"],
"confidence": verdict["confidence"],
"sources": [s["url"] for s in sources],
}Ejemplo en Python
import requests
API_KEY = "sk_live_..."
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
BASE = "https://api.scavio.dev/api/v1"
def get_metadata(video_url):
resp = requests.post(
f"{BASE}/youtube/metadata",
headers=HEADERS,
json={"query": video_url},
)
resp.raise_for_status()
return resp.json()
def ground_claim(claim):
resp = requests.post(
f"{BASE}/google",
headers=HEADERS,
json={"query": claim, "light_request": False},
)
resp.raise_for_status()
return resp.json()
def extract_claims_with_llm(text):
# Replace with a real LLM call (Claude, etc.).
# Return a list of short, checkable factual statements.
raise NotImplementedError
def judge_with_llm(claim, sources):
# Replace with a real LLM call.
# Return {"label": "supported|unsupported|mixed", "confidence": 0.0-1.0}
raise NotImplementedError
def fact_check(video_url):
meta = get_metadata(video_url)
print(f"Video: {meta['title']} ({meta['stats']['views']} views)")
text = f"{meta['title']}\n\n{meta['description']}"
claims = extract_claims_with_llm(text)
report = []
for claim in claims:
g = ground_claim(claim)
organic = g.get("organic", [])
sources = [{"title": r["title"], "url": r["link"],
"snippet": r["snippet"]} for r in organic[:5]]
verdict = judge_with_llm(claim, sources)
report.append({
"claim": claim,
"verdict": verdict["label"],
"confidence": verdict["confidence"],
"sources": [s["url"] for s in sources],
})
return report
if __name__ == "__main__":
results = fact_check("https://www.youtube.com/watch?v=VIDEO_ID")
for row in results:
print(f"[{row['verdict']}] {row['claim']}")
for url in row["sources"]:
print(f" {url}")Ejemplo en JavaScript
const API_KEY = "sk_live_...";
const HEADERS = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
const BASE = "https://api.scavio.dev/api/v1";
async function getMetadata(videoUrl) {
const resp = await fetch(`${BASE}/youtube/metadata`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify({ query: videoUrl }),
});
if (!resp.ok) throw new Error(`metadata ${resp.status}`);
return resp.json();
}
async function groundClaim(claim) {
const resp = await fetch(`${BASE}/google`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify({ query: claim, light_request: false }),
});
if (!resp.ok) throw new Error(`google ${resp.status}`);
return resp.json();
}
// Replace these two with real LLM calls (Claude, etc.).
async function extractClaimsWithLLM(text) {
throw new Error("not implemented");
}
async function judgeWithLLM(claim, sources) {
throw new Error("not implemented");
}
async function factCheck(videoUrl) {
const meta = await getMetadata(videoUrl);
console.log(`Video: ${meta.title} (${meta.stats.views} views)`);
const text = `${meta.title}\n\n${meta.description}`;
const claims = await extractClaimsWithLLM(text);
const report = [];
for (const claim of claims) {
const g = await groundClaim(claim);
const organic = g.organic || [];
const sources = organic.slice(0, 5).map((r) => ({
title: r.title,
url: r.link,
snippet: r.snippet,
}));
const verdict = await judgeWithLLM(claim, sources);
report.push({
claim,
verdict: verdict.label,
confidence: verdict.confidence,
sources: sources.map((s) => s.url),
});
}
return report;
}
factCheck("https://www.youtube.com/watch?v=VIDEO_ID").then((results) => {
for (const row of results) {
console.log(`[${row.verdict}] ${row.claim}`);
for (const url of row.sources) console.log(` ${url}`);
}
});Salida esperada
Video: The Truth About Solid-State Batteries (842113 views)
[supported] Solid-state cells reach higher energy density
https://en.wikipedia.org/wiki/Solid-state_battery
https://www.nature.com/articles/...
[unsupported] These batteries ship to consumers in 2026
https://www.reuters.com/...
[mixed] Charge time drops to under five minutes
https://ieeexplore.ieee.org/...