refproof
Catch fake, wrong and retracted references before your reviewers do.
Try it in your browser → · Command line · GitHub Action · 中文说明
AI writing tools invent references that look perfect. People mistype DOIs, cite the wrong year and cite papers that were later retracted. refproof looks up every entry of your bibliography in Crossref, arXiv and OpenAlex, compares it with what you wrote, and tells you which references are wrong and, when it can, what the right one is.
It reads BibTeX, LaTeX, Word (.docx), RIS and pasted text. No API keys are needed, and the browser version sends no file anywhere.
What it catches
| Result | Meaning |
|---|---|
| ❌ Not found | No work with this title and these authors exists. The typical invented reference. |
| ❌ Wrong DOI | The DOI is real but belongs to a different paper. refproof finds the right DOI. |
| ❌ DOI not found | The DOI was never registered. |
| ❌ Retracted | The paper was retracted or withdrawn (Crossref + Retraction Watch data). |
| ⚠️ Mismatch | The paper exists, but the year, first author or title in your citation is wrong. |
| ⚠️ Concern | The publisher issued an expression of concern. |
| ⚠️ Unverified | Could not be confirmed: books, reports, theses and some non-English work are often not indexed. |
| ✅ Verified | Found, and title, first author and year agree. Preprints that have since been published are pointed out. |
Quick start
In the browser
Open maoji-y.github.io/refproof, then drop in a file or paste your reference list. The checker runs in your browser (Python via Pyodide). Only titles, authors and DOIs go to the public Crossref, DataCite and OpenAlex APIs.
Command line
pipx install refproof # or: pip install refproof, or: uvx refproof paper.bib
$ refproof examples/demo.bib
refproof 0.1.0 · examples/demo.bib: 10 BibTeX entries
✖ RETRACTED wakefield1998 examples/demo.bib:92
Wakefield, Murch, Anthony (1998). Ileal-lymphoid-nodular hyperplasia, non-specific colitis, and…
→ This work has a retraction notice: https://doi.org/10.1016/s0140-6736(10)60175-4.
✖ NOT FOUND chen2021contrastive examples/demo.bib:67
Chen, Hinton (2021). Contrastive diffusion priors for few-shot neural radiance fields. Advances…
→ No matching work in Crossref, arXiv or OpenAlex.
→ Closest: “Exploiting Depth Priors for Few-Shot Neural Radiance Field Reconstruction” (Chen et al., 2024), title similarity 0.70.
✖ WRONG DOI lecun2015 examples/demo.bib:34
LeCun, Bengio, Hinton (2015). Deep learning. Nature.
→ DOI 10.1038/nature14536 belongs to a different work: “Unexpected role for vitamin B2” (Clarke & Allan, 2015).
→ The cited title matches https://doi.org/10.1038/nature14539 (Nature, 2015).
✖ DOI NOT FOUND porteagel2020 examples/demo.bib:46
Porté-Agel, Bastankhah, Shamsoddin (2020). Wind-turbine and wind-farm flows: A review. Boundary…
→ DOI 10.1007/s10546-019-99473-0 is not registered.
→ The cited title matches https://doi.org/10.1007/s10546-019-00473-0 (Boundary-Layer Meteorology, 2019).
⚠ MISMATCH hinton2017attention examples/demo.bib:83
Hinton, Vaswani (2017). Attention is all you need. NeurIPS.
→ First author differs: cited as Hinton, record says Vaswani et al.
10 checked: 1 Retracted · 2 Not found · 1 Wrong DOI · 1 DOI not found · 2 Mismatch · 3 Verified
(Output shortened.) More ways to run it:
refproof manuscript.docx # Zotero / Mendeley / EndNote citations, or the typed list
refproof main.tex # only the entries that main.tex actually cites
refproof refs.ris --all # also list the verified entries
pbpaste | refproof - # a reference list copied from a PDF
refproof paper.bib -f json -o report.json
GitHub Action
Check the bibliography on every push. Problems show up as annotations on the right line
of the .bib file and as a table in the job summary.
# .github/workflows/references.yml
name: References
on: [push, pull_request]
jobs:
refproof:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: maoji-y/refproof@v0
with:
files: paper/references.bib # several files: separate with spaces
fail-on: error # error | warning | never
Python
from refproof import check_references, load_file
for f in check_references(load_file("paper.bib"), mailto="you@university.edu"):
if f.level != "ok":
print(f.status.label, f.ref.key, *f.notes, sep="\n ")
Supported inputs
| Format | Notes |
|---|---|
BibTeX / BibLaTeX .bib |
@string macros, nested braces, LaTeX accents; errors point to the entry's line. arXiv IDs are picked up from eprint, journal = {arXiv preprint …} and URLs. |
LaTeX .tex |
Follows \bibliography{…} / \addbibresource{…} and checks only the cited keys, or reads a thebibliography block. |
Word .docx |
Uses the structured data that Zotero, Mendeley and EndNote store in the document, or Word's own citations. Without them, reads the typed list after a References / Bibliography / 参考文献 heading. |
RIS .ris |
Exports from EndNote, Zotero, Mendeley and publisher sites. |
| Plain text | Numbered ([1], 1.), APA, Harvard, IEEE, Vancouver and GB/T 7714 lists, one reference per line or paragraph, including lines broken by a PDF copy. |
How it works, and why it does not cry wolf
A search engine always returns something, so a checker that trusts the top hit misses invented references. One that demands an exact match flags real ones. refproof uses these rules:
- DOIs are resolved, then compared. A DOI goes to Crossref, or to its own registration agency (DataCite, mEDRA, JaLC, …) via doi.org. The record's title must match the cited title. If it does not, the DOI is wrong, and refproof searches for the cited title to find the right DOI.
- References without a DOI are searched, by title in Crossref, among arXiv's preprints (via DataCite) and in OpenAlex, and by the full citation string in Crossref.
- A hit only counts if title, first author and year agree. Famous titles get reused ("Attention is all you need" has several namesakes in Crossref), so candidates whose authors match are preferred. Short generic titles ("Deep learning") need the author to match too. Corporate authors such as "National Renewable Energy Laboratory" are skipped when comparing first authors.
- "Not found" is reserved for journal and conference papers. Journals are almost completely covered by Crossref. Books, reports, theses, web pages and CJK-language work often are not, so these get Unverified, not an error.
- Retractions come from Crossref's
updated-bydata (which includes Retraction Watch), from "RETRACTED:" titles, and from retraction notices that turn up among the search hits.
On 320 real references from a wind-energy literature review (BibTeX with and without DOIs, plus a pasted reference list with the DOIs removed), refproof reported no false errors: no real reference was called fake, wrong or retracted. The only error it raised was a correct retraction.
Options
| Flag | Default | |
|---|---|---|
-f, --format |
text |
text, markdown, json or github (annotations + job summary) |
-a, --all |
off | also list verified references |
--fail-on |
error |
exit with status 1 on error, warning, or never |
--mailto |
$REFPROOF_MAILTO |
your e-mail; Crossref and OpenAlex serve polite clients faster |
--openalex-key |
$OPENALEX_API_KEY |
free key from openalex.org; anonymous OpenAlex search is throttled under load |
--no-openalex |
off | Crossref and arXiv only |
--no-cache |
off | responses are otherwise cached for 14 days |
--input-format |
auto |
bibtex, ris, docx, tex or text |
Limitations
- A missing record is evidence, not proof. Check flagged references yourself before accusing anyone.
- Coverage of Chinese, Japanese and Korean literature without DOIs (e.g. CNKI) is limited. Such entries are marked Unverified, never Not found.
- refproof checks that a cited work exists and is cited correctly. It does not check whether the work supports the sentence that cites it.
- Large bibliographies take a few minutes: the tool paces itself to the APIs' rate limits.
Contributing
Bug reports with the offending citation are the most useful thing you can send. For a
development setup: pip install -e . pytest && pytest. The tests run offline against
canned API responses. For the web app, run python web/build.py and serve web/.
Metadata comes from Crossref, DataCite and OpenAlex. Thanks to them for open APIs.
MIT licensed.
Release files for refproof 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| refproof-0.1.0.tar.gz | 42.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| refproof-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 86.5 kB
Release files / refproof-0.1.0.tar.gz
| Download URL | refproof-0.1.0.tar.gz |
|---|---|
| Size | 42.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6fb0fd9909456e6e0919cf72bb1409156eed8191dd33ade4af2e18a8c78bdb26
|
|
BLAKE2b-256 checksum How to use checksums |
9cd44667c282af938ada3df4fbf8f41bfce4ca90b081ded562b3b7b81bfa044d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency logRelease files / refproof-0.1.0-py3-none-any.whl
| Download URL | refproof-0.1.0-py3-none-any.whl |
|---|---|
| Size | 44.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cf179e3d9077f3d6b531f70f397a8583860b4882a6a97a81d07e3d4dc109aacd
|
|
BLAKE2b-256 checksum How to use checksums |
d522b56edf8b2f9f9a8a162e22436d6d529ba49ac1e1f46716843ec9d786a33f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency log