Verify that every reference in a manuscript really exists and matches its metadata, catching hallucinated, corrupted or mismatched citations before submission. Use when checking a .bib file or reference list, after an AI assistant drafted citations, when a DOI may point to the wrong paper, when adding missing DOIs, or before camera-ready. Queries Crossref, OpenAlex and arXiv; zero dependencies.
Pro scans all 2 files and shows the line behind each finding
Scanned 10/4/2026
npx -y skills add KalarisLabs/research-agent-skills --skill citation-verification --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Citation Verification?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/kalarislabs-citation-verification)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: citation-verification
description: Verify that every reference in a manuscript really exists and matches its metadata, catching hallucinated, corrupted or mismatched citations before submission. Use when checking a .bib file or reference list, after an AI assistant drafted citations, when a DOI may point to the wrong paper, when adding missing DOIs, or before camera-ready. Queries Crossref, OpenAlex and arXiv; zero dependencies.
license: MIT
compatibility: Python 3.9+ standard library; needs network access to api.crossref.org, api.openalex.org and export.arxiv.org.
metadata:
version: "1.0"
category: literature-review
maintainer: Kalaris Labs
author: Kalaris Labs (Sayan Chowdhury)
tags: citations, hallucination, DOI, Crossref, OpenAlex, arXiv, references, research integrity
---
# Citation Verification
Language models (and tired humans) produce references that look right but are
not: plausible titles that were never published, real DOIs attached to the wrong
paper, wrong years, invented co-authors. Citing a paper that does not exist can
lead to desk rejection, a correction, or a misconduct inquiry. This skill makes
verification systematic.
## Non-negotiable rules
1. **Never write a reference from memory.** Every entry must come from a
retrievable record (Crossref, OpenAlex, arXiv, PubMed, publisher page).
2. **A reference is verified only when its identifier resolves to a record whose
title, first author and year all match.** A resolving DOI alone proves nothing.
3. **If you cannot verify a reference, say so.** Mark it `% UNVERIFIED` in the
`.bib`, tell the user, and never quietly keep it.
4. Verify the claim too: open the abstract or the cited section and confirm the
paper actually supports the sentence citing it.
## Workflow
```bash
export CROSSREF_MAILTO=you@university.edu # polite pool: faster, fewer rate limits
python scripts/verify_citations.py references.bib --json citation-report.json
python scripts/verify_citations.py --doi 10.1038/nature14539 10.1126/science.aaa8415
python scripts/verify_citations.py references.bib --keys smith2020,li2023 # re-check a subset
```
Each entry gets a status:
| Status | Meaning | Action |
|---|---|---|
| `verified` | Identifier resolves; title/author/year agree | None |
| `found-add-doi` | No DOI in the entry, but an unambiguous match exists | Add the suggested `doi` field |
| `mismatch` | DOI resolves to a *different* work, or year/author disagree | Fix from the record, or find the intended paper |
| `doi-not-found` | DOI does not resolve anywhere | Typo or fabricated: search by title |
| `uncertain` | Title matches but year/author disagree, or only a weak title match | Check manually (reprints, errata, homonymous papers) |
| `not-found` | No plausible match in Crossref, OpenAlex or arXiv | Treat as fabricated until proven otherwise (grey literature, theses and reports may legitimately be absent) |
Exit code `0` means everything is verified or only missing DOIs; `1` means something needs a human.
## Handling the hard cases
- **Conference papers without DOIs** (NeurIPS, ICML, ICLR, many CS venues): the script
falls back to arXiv. Cite the proceedings version with a `url` to the official
proceedings page, and optionally keep `eprint` for the arXiv ID.
- **Preprint vs published**: if both exist, cite the peer-reviewed version unless
the venue asks otherwise. OpenAlex links versions of the same work.
- **Books and chapters**: check ISBN via the publisher or Open Library. Crossref covers many but not all.
- **Datasets and software**: verify DataCite DOIs (`https://api.datacite.org/dois/{doi}`) or
Zenodo/Software Heritage identifiers.
- **Retractions**: check each DOI against Retraction Watch data (in Crossref as
`update-to` / `relation` metadata) and never cite a retracted paper as support.
- **Non-English or old literature**: absence from these indexes is common. Confirm via
library catalogs and document the source.
## Reporting to the user
Summarize as a table: key, status, problem, and the fix you applied or propose.
Apply only mechanical fixes automatically (adding a DOI for a `found-add-doi`
match). Anything `mismatch`, `uncertain` or `not-found` requires the user's
confirmation because only they know which paper they meant to cite.
## Related skills
- `bibtex-hygiene`: duplicates, missing fields, capitalization and formatting in the `.bib` file.
- `citation-management`: finding and exporting references from literature databases.
- `literature-review`: systematic searching and screening.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!