USPTO Trademark Scraper
Pricing
from $5.00 / 1,000 results
USPTO Trademark Scraper
Search and export U.S. federal trademark records from the USPTO by mark text, owner name, serial number, or registration number. Structured rows: mark text, owner, status, filing/registration dates, Nice classes, goods & services. No API key.
Pricing
from $5.00 / 1,000 results
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
🎯 What this scrapes
USPTO's modern trademark search (tmsearch.uspto.gov) is a JS-rendered single-page app, and the official TSDR JSON API now gates bulk access behind a registered API key. This Actor wraps USPTO's trademark search index and TSDR case-status pages directly, so you get a structured row per mark without wrestling either surface yourself.
Give it a free-text query (mark text or owner name), a list of serial numbers, or a list of registration numbers — or mix all three in one run. Every request runs through our fingerprint-rotating HTTP stack and a paced, retrying client so your runs stay clean even when USPTO throttles.
🔥 Features
- 🛡️ Browser fingerprint rotation —
curl-cffireplays real Chrome / Firefox / Safari TLS handshakes so USPTO sees a real browser, not a Python script. - 🌐 Optional residential proxy rotation via Apify Proxy — fresh session and exit IP whenever a lookup gets rate-limited.
- 🔁 Retries with exponential backoff on
429 / 503and network errors — up to 5 attempts, honouringRetry-Afterheaders. - 🧱 Paced TSDR requests — direct lookups are throttled to roughly one request per second so we never trip USPTO's rate limits.
- 🧊 Clean, typed dataset rows — Pydantic-validated fields, ISO-8601 dates, stable serial numbers as IDs.
- 💰 Pay-Per-Event pricing — you pay only when a trademark row lands in your dataset. No data, no charge (only the small
actor-startwarm-up fee).
💡 Use cases
- Brand-protection monitoring — schedule recurring runs against your own mark portfolio to catch status changes (Section 8/15 declarations, oppositions, cancellations) as USPTO posts them.
- Trademark-watch services — track a competitor's or client's marks by owner name across renewal cycles without manual TSDR lookups.
- Clearance research — pull existing registrations in a Nice class before filing a new application.
- M&A / brand-portfolio diligence — quantify a target company's live trademark holdings by owner name in minutes.
- IP attorney workflows — bulk-resolve a docket of serial or registration numbers into structured case-status rows for internal tracking systems.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — supply at least one of
query,serialNumbers, orregistrationNumbers. All three can run together in a single call. - Click Start. Results stream into the run's dataset as each lookup resolves.
- When the run finishes, open Storage → Dataset to export as JSON, CSV, or Excel — or pull rows via the Apify API.
Input mode tips:
serialNumbersandregistrationNumbers— always processed in full, ignoringmaxResults.query— searched against mark text and owner name, capped atmaxResults.statusFilter— set toliveordeadto post-filter by parsed status text.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
query | string | no* | — | Free-text mark text or owner name to search, 1-200 chars. |
serialNumbers | array | no* | — | Direct lookup by USPTO serial number(s), 8 digits each. |
registrationNumbers | array | no* | — | Direct lookup by USPTO registration number(s), 1-8 digits each. |
statusFilter | string | no | any | any, live, or dead — post-filter on parsed status text. |
maxResults | integer | no | 20 | Cap on rows returned for query mode only. Max 500. |
proxyConfiguration | object | no | {"useApifyProxy": false} | Apify Proxy configuration. USPTO tolerates direct calls at a light pace. |
* At least one of query, serialNumbers, registrationNumbers is required.
Example input
{"query": "BLINKING NAILS","serialNumbers": ["88148890"],"registrationNumbers": ["5912174"],"statusFilter": "any","maxResults": 2,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
serial_number | string | US Serial Number. |
registration_number | string | null | US Registration Number. |
mark_text | string | Mark / Mark Literal Elements. |
mark_type | string | null | Mark Type. |
standard_character_claim | boolean | null | Standard Character Claim (Yes/No). |
description_of_mark | string | null | Description of Mark, including Disclaimer text when present. |
status | string | null | Status (free text). |
status_date | string | null | Status Date, ISO-8601. |
filing_date | string | null | Application Filing Date, ISO-8601. |
registration_date | string | null | Registration Date, ISO-8601. |
publication_date | string | null | Publication Date, ISO-8601. |
register | string | null | Principal / Supplemental. |
international_classes | array | International Class(es), zero-padded. |
goods_services | string | null | For: field — goods & services description. |
first_use_date | string | null | First Use, ISO-8601. |
use_in_commerce_date | string | null | Use in Commerce, ISO-8601. |
filing_basis | array | Derived from Filed Use/ITU/44D/44E/66A flags. |
owner_name | string | null | Owner Name. |
owner_address | string | null | Owner Address. |
attorney_name | string | null | Attorney Name. |
tsdr_url | string | TSDR case-status URL for this serial number. |
scraped_at | string | ISO-8601 UTC timestamp when this row was recorded. |
Example output
{"serial_number": "88148890","registration_number": "5912174","mark_text": "BLINKING NAILS","mark_type": "Trademark","standard_character_claim": false,"description_of_mark": "The mark consists of the stylized wording \"BLINKINGNAILS\" with a butterfly design appearing above the second letter \"I\". Disclaimer: \"NAILS\"","status": "A Section 8 declaration has been accepted.","status_date": "2025-09-26","filing_date": "2018-10-09","registration_date": "2019-11-19","publication_date": "2019-09-03","register": "Principal","international_classes": ["008"],"goods_services": "Fingernail polishers, electric or non-electric; Hair-removing tweezers; Nail files, electric; Cuticle nippers; Cuticle tweezers; Electric nail clippers; Electric pedicure sets; Emery boards; Manicure sets; Pedicure sets.","first_use_date": "2017-01-22","use_in_commerce_date": "2017-01-22","filing_basis": ["USE_IN_COMMERCE"],"owner_name": "Zhongshan R & F Heavy Makeup Cosmetics Limited Company","owner_address": "Garden, No.36 Rihua Rd, Southern Dist, No.9-189, Tianhuixingyuan, Xinghuiyunjin, Zhongshan, Guangdong, 528455, CHINA","attorney_name": null,"tsdr_url": "https://tsdr.uspto.gov/#caseNumber=88148890&caseType=SERIAL_NO&searchType=statusSearch","scraped_at": "2026-07-18T10:12:26+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.005 | One-off warm-up charge per run |
result | $0.005 | Per trademark row written to the dataset |
Example: 1 000 results at the rates above ≈ $5.00. No subscription, no minimum — Apify gives every new account $5 of free credit to start. Commercial trademark-watch platforms charge per-mark subscriptions that add up fast across a portfolio; this Actor bills only for rows that land.
🚧 Limitations
- Search ranking is controlled by USPTO's trademark search index internally — the order for
querymode is theirs. status_dateis null forquery-mode rows. USPTO's search index doesn't expose a discrete "status changed on" date for free-text hits; directserialNumbers/registrationNumberslookups always carry a real value when the source page has one.- TTAB opposition/cancellation proceeding documents are out of scope — that's a distinct data surface.
- Full prosecution-history documents (office actions, specimens, drawings/images) and assignment / chain-of-title history are not included in v1.
- International/Madrid Protocol or EUIPO marks are out of scope — US federal (USPTO) marks only.
- Legal disclaimer — this tool retrieves public trademark metadata for research and monitoring purposes. It is not a substitute for professional trademark counsel. Always consult a registered trademark attorney for clearance opinions, opposition strategy, or litigation.
🔗 Use with n8n
Wire this Actor into your n8n automations with the official Apify node:
- Add the Apify node and pick the Run Actor operation.
- Set the Actor to
devilscrapes/uspto-trademark-scraperand pass your input as JSON. - Chain a Get Dataset Items step to read the structured rows into the rest of your workflow (Sheets, Slack, your CRM, an AI agent, …).
Because n8n runs on a schedule or trigger, you get fresh trademark records on autopilot — for example, a daily trademark-watch that alerts you the moment a mark's status changes or a competitor files a confusingly similar mark.
❓ FAQ
Do I need a USPTO API key?
No. This Actor uses USPTO's public TSDR case-status pages and trademark search index directly — no registered API key required for the surfaces this Actor covers.
Is the data real-time?
TSDR case-status pages reflect USPTO's live prosecution record — status changes typically appear within a business day of USPTO posting them.
Can I monitor my own trademark portfolio automatically?
Yes — schedule recurring runs via Apify's built-in Schedule feature with your serial or registration numbers. We don't build a separate diff/alerting engine; Apify Schedule plus your own diffing of the dataset covers recurring monitoring.
Does this cover international or EU trademarks?
No — this Actor covers US federal (USPTO) marks only. We can build dedicated Actors for EUIPO or Madrid Protocol marks on request.
Can I get opposition or cancellation (TTAB) history?
Not in v1 — TTAB proceeding documents are a distinct data surface, already covered by a separate competing Actor. Only case-status summary fields ship here.
Why is status_date sometimes null?
Rows produced by the free-text query mode don't carry a discrete status-change date in USPTO's search index; direct serialNumbers/registrationNumbers lookups do when the source page has one.
Why is attorney_name sometimes empty?
Not every filing lists a registered attorney — pro se filings and some foreign-owned marks often omit it.
💬 Your feedback
Spotted a bug, hit an edge case, or need a new field (image/logo download, TTAB history, assignment records)? Open an issue on the Actor's Issues tab in Apify Console — we ship fixes weekly and read every report.