Download
Take the whole dataset
Everything behind this site as a single file, in whichever shape fits your tooling. 17,495 products and 18,944 flagged images, regenerated whenever the source dataset is refreshed. No sign-up, no key, no rate limit.
CC BY 4.0. If you publish anything derived from it, cite the primary source, not this page: Richardson R. et al., doi:10.5281/zenodo.20402475, reported by Nature.
The whole thing as one file: both tables, indexes, and a full-text index. Nothing to import — open it and query.
- fakeantibody.sqlite 13.5 MB SQLite database: tables products, findings, meta, plus an FTS5 index products_fts. Query it directly, no import step. sha256 224758fd6c5e8a3e…
- fakeantibody.sqlite.gz 1.5 MB The same database, gzipped. sha256 436cb092da33e72e…
curl -O https://fakeantibody.schlein-lab.com/dl/fakeantibody.sqlite
sqlite3 fakeantibody.sqlite "
SELECT vendor, catalog_number, ko_verdict
FROM products WHERE target_gene = 'TARDBP';"
-- does my in-house list overlap?
sqlite3 fakeantibody.sqlite "
ATTACH 'mine.db' AS mine;
SELECT m.cat FROM mine.antibodies m
JOIN products p ON lower(p.catalog_number) = lower(m.cat);"
One workbook, two sheets: products and findings. Header row frozen. Open it and use VLOOKUP against your own sheet.
- fakeantibody.xlsx 2.0 MB Excel workbook with two sheets: products and findings. sha256 4cf6005d9fc52b7e…
# Python, if you would rather not click
import pandas as pd
p = pd.read_excel('fakeantibody.xlsx', sheet_name='products')
mine = pd.read_excel('my_antibodies.xlsx')
hits = mine.merge(p, left_on='Cat', right_on='catalog_number', how='inner')
Tab-separated. Product titles are full of commas, so tabs are the safer delimiter for quick shell work. Tabs and newlines inside fields are replaced by spaces, so every line has exactly the same number of columns.
- products.tsv 4.7 MB Tab-separated, one row per affected product. Tabs and newlines inside fields are replaced by spaces. sha256 d7115f254c1fc87e…
- findings.tsv 5.0 MB Tab-separated, one row per flagged image. sha256 4a807b09c435a99e…
- products.tsv.gz 382 KB Gzipped products.tsv. sha256 ff5ef6d797d01f4e…
- findings.tsv.gz 357 KB Gzipped findings.tsv. sha256 531398632fcef32c…
curl -s https://fakeantibody.schlein-lab.com/dl/products.tsv \
| awk -F'\t' 'NR==1 || $15=="fails"' \
| cut -f1,2,10,15
# check one catalogue number
grep -iP '\tMA5-32741\t' products.tsv
RFC 4180, quoted where it has to be. Same two tables as the TSV.
- products.csv 4.8 MB RFC 4180 CSV, one row per affected product. sha256 85a5484d11e26e4a…
- findings.csv 5.1 MB RFC 4180 CSV, one row per flagged image. sha256 79fc8d8e73ee926d…
import pandas as pd
p = pd.read_csv('https://fakeantibody.schlein-lab.com/dl/products.csv')
p[p.ko_verdict == 'fails'][['vendor','catalog_number','target_gene']]
One product per line, with its flagged images nested. Streams without loading the whole file, which is usually what you want inside a pipeline.
- fakeantibody.jsonl 19.0 MB One JSON object per product per line, with its findings nested. Convenient for streaming into a pipeline. sha256 b07acc026288ba7e…
- fakeantibody.jsonl.gz 840 KB Gzipped fakeantibody.jsonl. sha256 de4105e357616fff…
curl -s https://fakeantibody.schlein-lab.com/dl/fakeantibody.jsonl \
| jq -c 'select(.ko_verdict=="fails")
| {vendor, catalog_number, target_gene, images: (.findings|length)}'
What the columns mean
| Column | In | Meaning |
|---|---|---|
| vendor | both | The company selling the product, as named in the source dataset. |
| catalog_number | both | Catalogue number as printed by that vendor. Not unique across vendors — private labelling means the same antibody is resold under several numbers. |
| product_title | products | Product title as it appeared in the catalogue. |
| image_count | products | How many of this product’s images were flagged. |
| problem_groups | both | Comma-separated: shared-background, painted, duplicated-noise, reused-image, spliced, erased-region, other. |
| patterns | products | Which shared background pattern (A–H) the images match, if any. The same noise field in thousands of unrelated blots. |
| first_identified | both | Date the first flag on this product was recorded. |
| target_gene | products | Gene symbol — only filled for products that also appear in the knockout-validation dataset. |
| ko_verdict | products | fails = failed every application tested · partial = worked in some · passes = worked in all tested · untested = no independent data (the normal case, 99.7 %). |
| ko_wb / ko_ip / ko_if / ko_fc | products | Per application: 0 not tested, 1 tested and not recommended, 2 recommended. Western blot, immunoprecipitation, immunofluorescence, flow cytometry. |
| summary | findings | What the reviewer found in that specific image, in their own words. |
| annotated_image_url | findings | Direct link to the annotated evidence image on this site. |
| external_links | findings | Where the observation was first posted publicly, if anywhere. |
For agents
/dl/manifest.json lists every file with its size, SHA-256 and column names, plus the licence and the caveat below. Fetch that first and you can pick a format without downloading anything.
The caveat travels with the data. A flag means the published evidence is unreliable, not that the antibody has been shown to fail. No vendor catalogue was audited completely, review effort was not spread evenly, and absence from this list is not a clean bill of health. If you are matching it against an in-house inventory, treat a hit as “the vendor’s evidence for this one is worthless”, not as “this antibody does not work”. The full method and its limits.
Generated 27 August 2026, 10:32 UTC.