Alterlab Citation Verifier logo

Alterlab Citation Verifier

Organization
NVlabs
alterlab-citation-verifier

Verifies that every entry in a bibliography ACTUALLY EXISTS by cross-checking it against four keyless public scholarly APIs (Crossref, OpenAlex, Semantic Scholar, arXiv) with a polite mailto identifier, resolving DOI/arXiv IDs, fuzzy-matching title and authors (difflib SequenceMatcher ratio >=0.70), flagging retractions marked in Crossref (update-to) or OpenAlex (is_retracted), and emitting per-entry JSON verdicts mapped to the AlterLab citation-hallucination taxonomy (TF/PAC/IH/PH/SH). Accepts BibTeX, a DOI/arXiv ID list, or free-form references; degrades gracefully offline by emitting 'unverified' verdicts and never silently passing. Use when the request mentions verify citations, check references, fabricated or hallucinated references, fake DOI, retraction check, bibliography audit, or reference existence check. Does NOT write or draft papers — for authoring a manuscript (whose citation-check mode inserts citations) prefer alterlab-paper-writer instead. Part of the AlterLab Academic Skills suite.

Overview

PublisherNVlabs
RepositorySkill2Env
Skill namealterlab-citation-verifier
Stars
189
Forks
18
Bundled files
5
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 5 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by NVlabs on GitHub. Read the source before you install it.

Installation

Install the Alterlab Citation Verifier AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/NVlabs/Skill2Env/tree/main/SkillHub/skills/alterlab-citation-verifier
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/NVlabs/Skill2Env.git /tmp/Skill2Env
mkdir -p .claude/skills
cp -r /tmp/Skill2Env/SkillHub/skills/alterlab-citation-verifier .claude/skills/alterlab-citation-verifier
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Alterlab Citation Verifier in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Alterlab Citation Verifier on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Alterlab Citation Verifier is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Citation Verifier — Existence-Verify a Bibliography Against Public Scholarly APIs

The headline existence-verification skill: given a bibliography in any common form, it proves entry-by-entry whether each reference actually exists by querying four keyless public scholarly APIs, then maps each result to the canonical AlterLab citation-hallucination taxonomy. It is the deterministic, network-grounded companion to the LLM-driven integrity_verification_agent — where that agent uses WebSearch + judgment, this skill uses authoritative API records and a reproducible Python script, so the same input always yields the same verdicts.

Quick Start

Verify the citations in references.bib
Check whether these DOIs resolve to the papers I cited
Audit my bibliography for fabricated / hallucinated references
Does this reference list contain any fake citations or retractions?

→ Run scripts/verify_citations.py over the bibliography, read the JSON, then present a verdict table grouped by severity. Always state the offline/degraded status explicitly if the network was unavailable.


WHAT This Does

For each bibliography entry the script:

  1. Parses the input (auto-detects BibTeX / DOI-list / free-form), extracting title, authors, year, venue, DOI, and arXiv ID.
  2. Resolves identifiers — looks up the cited DOI/arXiv ID directly when present.
  3. Searches by title as a fallback across all four sources.
  4. Fuzzy-matches the cited title (difflib SequenceMatcher ratio, default threshold 0.70) and computes author-surname overlap.
  5. Flags retractions marked in Crossref (update-to: retraction) or OpenAlex (is_retracted).
  6. Emits a verdict per entry mapped to the taxonomy below, plus a repo-level summary.verdict (PASS / PASS_WITH_CONDITIONS / FAIL / UNVERIFIED).

The four sources (all keyless, polite-pool)

SourceEndpointUsed for
Crossrefapi.crossref.org/worksDOI resolution, metadata, retraction flag
OpenAlexapi.openalex.org/worksDOI + title search, is_retracted
Semantic Scholarapi.semanticscholar.org/graph/v1DOI/arXiv resolution, title search
arXivexport.arxiv.org/api/queryarXiv ID resolution, preprint title search

All requests carry a mailto parameter (defaults to alterlab.ieu@gmail.com) to stay in each API's polite pool. No API keys are required or used.

WHEN To Use It (and when not)

Use this skillUse something else
"Verify / check / audit my citations or references exist"Writing the paper → alterlab-paper-writer
"Did the AI hallucinate any of these references?"Full integrity gate inside a pipeline → alterlab-research-pipeline Stage 2.5/4.5
"Do these DOIs resolve to the papers I cited?"Grading source quality / predatory journals → alterlab-deep-research source_verification_agent
"Check this bibliography for retractions"Whether a claim is supported by its source (SH) → claim_verification_protocol (Phase E)
Reproducible, scriptable, offline-capable existence checkMarkdown dead-link audit → alterlab-link-health

This skill answers "does the cited work exist, and does its identifier point to it?" It does not read the cited paper's full text, so it cannot by itself confirm Semantic Hallucination (does the source support the claim?) — that requires claim_verification_protocol. SH is surfaced only as an advisory flag, never asserted from API metadata alone.


Verdict Taxonomy (mirrors the canonical Five-Type Taxonomy)

Identical codes and definitions to alterlab-research-pipeline/agents/integrity_verification_agent.md (GPTZero × NeurIPS 2025; Ansari, 2026). Severity feeds the same SERIOUS / MEDIUM / MINOR scale used in the Integrity Report schema.

CodeNameSeverityScript trigger
verified— (exists, matches)NONETitle ratio >= threshold AND author overlap OK AND year consistent in >=1 authoritative source
TFTotal FabricationSERIOUSFound in no source; OR cited DOI/arXiv ID did not resolve anywhere and no close title match exists
PACPartial Attribute CorruptionMEDIUMEntry found but >=1 metadata field disagrees (year mismatch, author overlap < 50%, or title ratio < threshold)
IHIdentifier HijackingSERIOUSCited DOI/arXiv ID resolved (method=id) but the resolved record's title is unrelated (ratio < threshold)
PHPlaceholder HallucinationSERIOUSUnresolved template/placeholder ([CITATION NEEDED], \cite{}, et al., YYYY, TODO, forthcoming) — caught pre-network
SHSemantic HallucinationSERIOUSEntry resolves but does not support its claim — advisory only; requires Phase E to assert
unverified— (could not check)MEDIUMOffline, or all APIs failed for this entry. Never treated as passing.

A RETRACTED flag is attached (and severity bumped to SERIOUS) whenever Crossref or OpenAlex marks the matched work as retracted, independent of the existence verdict.

Repo-level verdict

  • PASS — every entry verified, no SERIOUS/MEDIUM flags.
  • PASS_WITH_CONDITIONS — only PAC / MEDIUM issues (wrong metadata, fixable).
  • FAIL — any SERIOUS verdict (TF / IH / PH / retraction).
  • UNVERIFIED — entries are unverified and no concrete fabrication was found (e.g. fully offline run). This is not a pass — re-run with network access.

Pipeline (how to run it)

1. Locate or capture the bibliography

Accept any of: a .bib file, a .txt list of DOIs/arXiv IDs, a pasted reference list, or inline text. The script auto-detects the format; override with --format bibtex|doi|freeform if detection is wrong.

2. Run the verifier

bash
uv run python skills/core/alterlab-citation-verifier/scripts/verify_citations.py \
    path/to/references.bib \
    --mailto alterlab.ieu@gmail.com \
    --threshold 0.70 \
    --out citation_report.json
  • path/to/references.bib may also be - (stdin) or inline text.
  • --threshold tunes the fuzzy title-match ratio (0..1; default 0.70).
  • --offline skips the network and emits unverified verdicts deliberately.
  • Omit --out to print the JSON report to stdout.

The script auto-selects an HTTP backend: it uses requests if installed, else falls back to the Python stdlib (urllib) — so it runs with zero extra dependencies in a bare uv environment.

3. Read the JSON and report

Parse summary.verdict and the per-entry verdict codes. Present:

  1. The headline verdict and counts (verdict_counts, severity_counts).
  2. A table of every non-verified entry with its code, severity, and detail.
  3. For each TF / IH / PH: quote the cited entry and explain the evidence (e.g. "DOI 10.x resolved to an unrelated paper titled '…'").
  4. Any RETRACTED flags, prominently.
  5. If verdict == UNVERIFIED: state plainly that nothing was confirmed and relay the per-entry manual_instructions.

4. Route fixes

  • TF / PH → the reference must be removed or replaced; it does not exist.
  • IH → the DOI/arXiv ID is wrong; find and substitute the correct identifier.
  • PAC → correct the specific metadata field(s) named in detail.
  • RETRACTED → flag to the author; cite the retraction notice or drop the source.

Graceful Degradation (no network)

Network failures are never silently swallowed into a pass:

  • A DNS/connection failure raises NetworkUnavailable; the entry becomes unverified with a populated manual_instructions field.
  • --offline forces every networked entry to unverified up front (placeholders are still caught locally as PH).
  • The repo-level verdict becomes UNVERIFIED (distinct from PASS) whenever unverified entries exist without any concrete fabrication finding.

When degraded, instruct the user to re-run with connectivity, and fall back to the LLM-driven integrity_verification_agent (WebSearch) for a manual pass.


Output Shape (excerpt)

json
{
  "tool": "alterlab-citation-verifier/verify_citations.py",
  "version": "1.0.0",
  "summary": {
    "total": 2,
    "verdict": "FAIL",
    "verdict_counts": {"verified": 1, "TF": 1, "PAC": 0, "IH": 0, "PH": 0, "SH": 0, "unverified": 0},
    "severity_counts": {"SERIOUS": 1, "MEDIUM": 0, "MINOR": 0},
    "citation_integrity_score": 0.5,
    "fabrication_risk_score": 0.5,
    "retracted": 0
  },
  "entries": [
    {"ref_id": "walters2023", "verdict": "verified", "severity": "NONE",
     "title_ratio": 1.0, "author_overlap": 1.0, "matches": [{"source": "crossref"}]},
    {"ref_id": "ghostpaper2021", "verdict": "TF", "severity": "SERIOUS",
     "detail": "Cited DOI/arXiv identifier did not resolve in any source..."}
  ]
}

citation_integrity_score and fabrication_risk_score (both 0..1) align with the Integrity Report schema fields of the same name, so the report can feed alterlab-research-pipeline's integrity gate directly.


Self-Check Before Reporting

  • Did the run reach the network? If config.http_backend ran but every entry is unverified, the network was down — say so; do not imply a pass.
  • Are there any RETRACTED flags? Surface them even on otherwise-verified entries.
  • Did any entry score IH? Confirm the detail shows an id-resolved mismatch, not a loose title-search coincidence (the script enforces this distinction).
  • Is the headline verdict consistent with the per-entry codes (any SERIOUS → FAIL)?

References

  • alterlab-research-pipeline/agents/integrity_verification_agent.md — canonical Five-Type Taxonomy, compound-deception patterns, and the Lin et al. (2020) mashup case study this skill is built to catch.
  • alterlab-research-pipeline/references/claim_verification_protocol.md — Phase E claim-vs-source verification (the SH check this skill defers to).
  • shared/schemas/integrity_report.schema.json — the integrity-report shape whose citation_integrity_score / fabrication_risk_score this skill mirrors.
  • Walters, W. H., & Wilder, E. I. (2023). Fabrication and errors in the bibliographic citations generated by ChatGPT. Scientific Reports, 13, 14045. https://doi.org/10.1038/s41598-023-41032-5
  • Ansari, S. (2026). Compound Deception in Elite Peer Review. arXiv:2602.05930.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Alterlab Citation Verifier AI skill do?

Verifies that every entry in a bibliography ACTUALLY EXISTS by cross-checking it against four keyless public scholarly APIs (Crossref, OpenAlex, Semantic Scholar, arXiv) with a polite mailto identifier, resolving DOI/arXiv IDs, fuzzy-matching title and authors (difflib SequenceMatcher ratio >=0.70), flagging retractions marked in Crossref (update-to) or OpenAlex (is_retracted), and emitting per-entry JSON verdicts mapped to the AlterLab citation-hallucination taxonomy (TF/PAC/IH/PH/SH). Accepts BibTeX, a DOI/arXiv ID list, or free-form references; degrades gracefully offline by emitting 'un...

Why use Alterlab Citation Verifier on TypingMind?

Because you install it once and use it with any model. Alterlab Citation Verifier is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Alterlab Citation Verifier in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/NVlabs/Skill2Env/tree/main/SkillHub/skills/alterlab-citation-verifier. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Alterlab Citation Verifier?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Alterlab Citation Verifier?

As many as you like. As long as a model supports skills, you can use Alterlab Citation Verifier with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Alterlab Citation Verifier AI skill free?

Yes. It is published on GitHub by NVlabs under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇