illeatmyhat/uspto-trademarks-detector
USPTO Trademark Detector Lists Ready-to-ship lists for a downstream detector (e.g. a browser extension), consumed exactly like an ad-blocker filter list: fetch, cache, membership- test. Each file is plain text, one normalized mark key per line. Rebuilt monthly from the companion corpus illeatmyhat/uspto-trademarks. Source Generated by USPTO Trademark Radar - an open-source pipeline that builds these lists from the public USPTO corpus. Method, thresholds, ADRs, and… See the full description on the dataset page: https://huggingface.co/datasets/illeatmyhat/uspto-trademarks-detector.
USPTO Trademark Detector Lists
Ready-to-ship lists for a downstream detector (e.g. a browser extension), consumed exactly like an ad-blocker filter list: fetch, cache, membership- test. Each file is plain text, one normalized mark key per line. Rebuilt monthly from the companion corpus illeatmyhat/uspto-trademarks.
Source
Generated by [USPTO Trademark Radar](https://github.com/illeatmyhat/uspto-trademark-radar) - an open-source pipeline that builds these lists from the public USPTO corpus. Method, thresholds, ADRs, and the consumer contract live there.

Current build: tier1 = 74,488 marks, tier2 = 46,532 marks (threshold 1.8), tier3 = 946,163 marks. See _manifest.json for build lineage.
Origin filters (opt-in, not a junk signal)
origin_<cc>.txt lists marks by registered owner country of record - filing origin, not manufacture (a genuinely foreign brand that files through a domestic entity reads as domestic). Owner-country is deliberately excluded from the tier gates (it is evadable via a foreign shell); it ships only as a separate, clearly-labeled origin preference, off by default, never a junk verdict.
Key normalization (match this exactly)
Both lists are keyed on a normalized mark string. Normalize the brand text you read off a page the same way before testing membership (drop every character that is not a-z, A-Z, or 0-9, then uppercase):
const key = (s) => s.replace(/[^A-Za-z0-9]/g, "").toUpperCase();Consume
const res = await fetch("https://huggingface.co/datasets/illeatmyhat/uspto-trademarks-detector/resolve/main/tier1.txt");
const tier1 = new Set((await res.text()).split("\n").filter(Boolean));
// cache in IndexedDB; refresh monthly. At runtime:
if (tier1.has(key(listingBrandText))) flagAsAdjudicated(key(listingBrandText));A mark string maps to many filings, so a hit means "one or more filings under this mark were flagged," not "this exact listing." Surface the USPTO record and let the user judge; never blacklist a person. Design contract and rationale: https://github.com/illeatmyhat/uspto-trademark-radar/blob/main/CONSUMERS.md. License: US government work (public domain).
