Forked from altra/research
src / factcheck.ts
export interface FactCheckResult {
publisher: string;
rating: string;
url: string;
reviewDate: string;
}
export interface FactCheckResponse {
claim: string;
factChecks: FactCheckResult[];
covered: boolean;
}
export async function checkGoogleFactCheck(
claim: string,
apiKey?: string,
): Promise<FactCheckResponse> {
const params = new URLSearchParams({ query: claim, languageCode: "en" });
if (apiKey) params.set("key", apiKey);
const url = `https://factchecktools.googleapis.com/v1alpha1/claims:search?${params}`;
const ctrl = new AbortController();
const timer = setTimeout(() => ctrl.abort(), 10_000);
try {
const res = await fetch(url, {
signal: ctrl.signal,
headers: { "User-Agent": "research-plugin/1.0" },
});
if (!res.ok) throw new Error(`Fact Check API HTTP ${res.status}`);
const data = await res.json() as {
claims?: Array<{
claimReview?: Array<{
publisher?: { name?: string; site?: string };
url?: string;
reviewDate?: string;
textualRating?: string;
}>;
}>;
};
const factChecks: FactCheckResult[] = [];
for (const c of data.claims ?? []) {
for (const r of c.claimReview ?? []) {
factChecks.push({
publisher: r.publisher?.name ?? r.publisher?.site ?? "Unknown",
rating: r.textualRating ?? "Unknown",
url: r.url ?? "",
reviewDate: r.reviewDate ?? "",
});
}
}
return { claim, factChecks, covered: factChecks.length > 0 };
} finally {
clearTimeout(timer);
}
}