USPTO Trademark Search, Check & Monitor — No Login, $2.79/1k
Pricing
from $2.79 / 1,000 results
USPTO Trademark Search, Check & Monitor — No Login, $2.79/1k
USPTO trademark search by mark, owner, goods, attorney, serial or registration number; full TSDR details with attorney e-mail; clearance check with a verdict per candidate mark; monitor of new filings and status changes; bulk. No login or cookies. MCP-ready for AI agents. $2.79 per 1,000 records.
Pricing
from $2.79 / 1,000 results
Rating
0.0
(0)
Developer
Fortuitous Pirate
Maintained by CommunityActor stats
0
Bookmarked
60
Total users
3
Monthly active users
5 days ago
Last modified
Categories
Share
USPTO Trademark Search, Clearance Check & Monitor
One actor for the whole USPTO trademark workflow, straight from the USPTO's own search index (the backend of tmsearch.uspto.gov, the TESS replacement) and TSDR case records. No login, no API key, no browser, no CAPTCHA.
| Mode | What you get | Typical use |
|---|---|---|
search | One row per mark matching your queries: word mark, owner, goods & services, attorney, serial or registration number. Filters for live/dead/pending, Nice classes, filing-date range, exact phrase. Bulk queries from a list, CSV or Google Sheet. | Clearance research, portfolio pulls, brand-owner and IP-attorney lead lists |
details | The full TSDR record per serial or registration number: current owner with address, attorney with firm and e-mail, correspondent e-mail, law office, filing basis, status date, every prosecution-history event with document links, assignments, prior registrations. | Due diligence, docketing, watching a specific application |
check | One row per candidate brand name with a verdict — available, possible_conflict, likely_conflict or exact_match_live — plus the exact and close LIVE marks (serial, owner, status, classes) and the number of dead exact matches. | "Is this name free?" for 1 or 1,000 names at once: naming agencies, POD/merch sellers, founders, paralegals |
monitor | Only the new applications matching your watch terms / owners / classes and only the status changes on the serials you track, since the last run. State is kept in a named key-value store, summary POSTed to your webhook. | Weekly trademark watch per client or brand |
patents | Legacy US patent search (Google Patents without a key, PatentsView with your free key). | Kept for users of the former USPTO Patent & Trademark Scraper |
Leave mode empty and the actor picks it from the inputs you fill in (candidates → check, watchTerms/ownerNames/watchSerials → monitor, searchType: patents → patents, otherwise search).
What you get per trademark record
Every search, details and monitor row has these fields (example values from a real run):
| Field | Example |
|---|---|
serialNumber, registrationNumber | "88554319", "6167023" |
markLiteral (alias markText), pseudoMark | "NIMBUS", "NIKE SHOCKS" (USPTO's phonetic equivalent, when present) |
markType, markTypeText, markDrawingCode / drawingType, standardCharacterClaim | ["SERVICE MARK"], "(4) STANDARD CHARACTER MARK", true |
status, statusCode, alive, liveDead | "REGISTERED", 700, true, "Live" |
filingDate, registrationDate, publishedForOppositionDate / publicationDate, abandonDate, cancelDate, renewalDate | "2019-07-31", "2020-10-06", "2020-07-21", null, null, null |
firstUseDate, firstUseInCommerceDate, currentBasis, registrationType | "2009-07-30", "2009-07-30", ["1a"], ["PRINCIPAL"] |
ownerName, ownerAddress, ownerCitizenship, allOwners[] | "CLOUD SOFTWARE GROUP, INC.", "851 WEST CYPRESS CREEK ROAD, FORT LAUDERDALE, FLORIDA, 33309, UNITED STATES", "DELAWARE, USA", original registrant + subsequent owners with type, entity, address |
owner (object, legacy shape) | { "name": "TIBCO Software Inc. (CORPORATION; DELAWARE, USA)", "address": "...", "city": "Palo Alto", "entity": "CORPORATION", "type": "ORIGINAL REGISTRANT" } |
attorney / attorneyOfRecord | "Stephanie A Martinez" |
goodsServices[], goodsServicesText, internationalClasses, niceClasses, usClasses | ["IC 042: Application service provider (ASP) services featuring computer software ..."], ["IC 042"], ["042"], ["100 101."] |
disclaimer, translation, designCodes, designCodeDescription, markDescription | per mark |
markImageUrl, tsdrUrl / sourceUrl | https://tsdr.uspto.gov/img/88554319/large, the official TSDR status page |
relevanceScore, matchedTerm, scrapedAt | 103.3, "nimbus", ISO timestamp |
With includeDetails: true (search), in details mode and in monitor mode the TSDR record is merged in:
| Field | Example |
|---|---|
statusDetail, statusDescription, statusDate, tm5StatusCode | "LIVE/REGISTRATION/Issued and Active", "Registered. The registration date is used to determine...", "2020-10-06", "8" |
attorneyFirm, attorneyAddress, attorneyEmail | "MCGUIREWOODS LLP", "800 EAST CANAL STREET, GATEWAY PLAZA, RICHMOND, VIRGINIA, 23219, UNITED STATES", "trademarks@mcguirewoods.com" |
correspondentName, correspondentEmail, lawOffice, ownerEntityType, filingBasis, classDetails[] | "Stephanie A Martinez", "trademarks@tibco.com", "LAW OFFICE 135", "CORPORATION", ["1(a)"], class number + goods per class with first-use dates |
prosecutionHistory[], lastEvent, lastEventDate | 37 events for the example mark, newest first: { "date": "2025-10-06", "description": "COURTESY REMINDER - SEC. 8 (6-YR) E-MAILED", "documentUrl": "https://tsdr.uspto.gov/documentviewer?caseId=sn88554319&docId=..." } |
assignments[], proceedings[], priorRegistrations[], detailsFetched | 14 recorded assignments (receiving parties), TTAB proceedings, ["3750237"], true |
Monitor rows add changeType (new / updated), firstSeenAt and monitorId.
Check mode: a verdict per candidate name
{ "mode": "check", "candidates": ["nimbus", "zephyrly", "acme coffee"], "internationalClasses": ["9", "42"] }
Real output (2026-10-21):
{"candidate": "zephyrly","classesChecked": ["009", "042"],"verdict": "likely_conflict","verdictReason": "Live mark ZEPHYRAI (SN 99705097) is within 1-2 characters of \"zephyrly\".","exactLiveCount": 0,"closeLiveCount": 20,"deadExactCount": 0,"liveMarksScanned": 46,"topMatch": "ZEPHYRAI","topMatchSerial": "99705097","topMatchOwner": "Royal Zephyr LLC","topMatchStatus": "NON-FINAL ACTION - MAILED","exactLiveMatches": [],"closeLiveMatches": [{ "matchType": "similar", "serialNumber": "99705097", "markLiteral": "ZEPHYRAI", "pseudoMark": "ZEPHYR AI | ZEPHYR ARTIFICIAL INTELLIGENCE", "status": "NON-FINAL ACTION - MAILED", "ownerName": "Royal Zephyr LLC", "niceClasses": ["042"], "filingDate": "2026-03-20", "registrationDate": null, "tsdrUrl": "https://tsdr.uspto.gov/#caseNumber=99705097&caseType=SERIAL_NO&searchType=statusSearch" },{ "matchType": "similar", "serialNumber": "...", "markLiteral": "ZEPHYR", "status": "REGISTERED", "ownerName": "Little Arms Studios, Inc.", "niceClasses": ["009", "042"] }],"deadExactMatches": [],"checkedAt": "2026-10-21T16:12:00.000Z"}
How the verdict is decided, against live marks only (registered or pending), in the classes you name (or all 45 when internationalClasses is empty):
| Verdict | Rule |
|---|---|
exact_match_live | A live word mark is identical to the candidate (ignoring case, punctuation and spacing) |
likely_conflict | A live mark is the same letters with different spacing (NIMBUS9 vs NIMBUS 9), a phonetic equivalent recorded by the USPTO (pseudo mark), or within 1 character (names up to 5 letters) / 2 characters (longer names) |
possible_conflict | A live mark contains the candidate as a whole word (NIMBUS DATA for nimbus), or the candidate contains a live mark of 4+ letters (ACME in acme coffee) |
available | None of the above among live word marks |
deadExactCount tells you how many abandoned / cancelled marks had the identical name — a useful hint that others tried and failed. Every candidate also returns up to maxMatchesPerCandidate (default 10) exact and close live marks with serials so a human or an LLM can review the evidence.
This is a knock-out screen, not legal advice: it covers word marks and pseudo marks in the federal register; it does not score design marks, state registrations or common-law use.
Input examples
Default run ({}) searches nike and returns 10 records, so you can test without typing anything.
Bulk brand search, live marks only, class 25, filed since 2024
{ "queries": ["nike", "jordan", "converse"], "status": "live", "internationalClasses": ["25"], "filingDateStart": "2024-01-01", "maxItems": 500 }
Queries from a Google Sheet or CSV (first column; a header row is skipped)
{ "listUrl": "https://docs.google.com/spreadsheets/d/1AbC.../edit#gid=0", "status": "live", "maxItems": 2000 }
Everything an owner holds, with attorney e-mails (brand-owner / IP-firm lead list)
{ "searchMode": "owner", "queries": ["Nike, Inc.", "Adidas AG"], "includeDetails": true, "maxItems": 1000 }
Goods & services full text, pending applications only
{ "searchMode": "goods", "queries": ["athletic footwear"], "exactMatch": true, "status": "pending", "maxItems": 200 }
Attorney of record (who files for whom)
{ "searchMode": "attorney", "queries": ["Stephanie A Martinez"], "maxItems": 100 }
Full record by serial or registration number
{ "mode": "details", "queries": ["88554319", "6167023"] }
Weekly watch (schedule it; first run with firstRunMode: "baseline" records what already exists without emitting it)
{"mode": "monitor","watchTerms": ["zephyr", "zephyrly"],"ownerNames": ["Zephyr Labs"],"internationalClasses": ["9", "25", "42"],"watchSerials": ["98123456", "98234567"],"filedSinceDays": 10,"maxNewPerTerm": 50,"maxItems": 500,"firstRunMode": "baseline","webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ","monitorId": "zephyr-labs"}
The second run returns only filings and status changes that were not there before (verified: the same input run twice returns 3 rows, then 0). onlyNew: true gives the same dedupe to any search run.
Legacy patent search
{ "searchType": "patents", "keyword": "artificial intelligence", "dateFrom": "2024-01-01", "maxItems": 50 }
All inputs
| Input | Type | Notes |
|---|---|---|
mode | search / details / check / monitor / patents | Inferred from the other inputs when empty |
queries | array | Marks, owners, goods phrases, attorney names, serials or registration numbers depending on searchMode / mode. Aliases: searchQuery, keyword, searchTerms |
listUrl | string | CSV or Google Sheet URL; first column appended to queries |
searchMode | text (default) / owner / goods / attorney / serial / registration | What queries are matched against |
candidates | array | check mode. Alias terms (same input name as the batch-check actors you may be migrating from) |
serialNumbers, registrationNumbers | array | Direct lookups. Alias trademarkSerialNumber (string) |
status | all / live / dead / pending | Alias liveDead |
internationalClasses | array | Nice classes ["9", "42"], ["025"] or "25,9". Aliases niceClasses, classes, internationalClass |
exactMatch | boolean | search/text: exact phrase in the word mark or pseudo mark |
filingDateStart, filingDateEnd | YYYY-MM-DD | Aliases dateFrom, dateTo |
includeDetails | boolean | Merge the TSDR record into every search result (alias includeDocuments) |
maxItems | integer, default 10 | Cap per run for search / details / monitor / patents. Check mode checks every candidate |
maxMatchesPerCandidate | integer, default 10 | Matches listed per verdict row |
onlyNew, monitorId | boolean, string | Dedupe state for scheduled searches; monitorId also names the monitor-mode store (tm-watch-<hash>) |
watchTerms, ownerNames, watchSerials, filedSinceDays, maxNewPerTerm, firstRunMode, webhookUrl | Monitor mode (identical to the former USPTO Trademark Watch actor) | |
usptoApiKey | string | Optional TSDR key (alias tsdrApiKey); the keyless backend returns the same record |
searchType, patentType, patentsViewApiKey | Patents mode (identical to the former USPTO Patent & Trademark Scraper) |
Pricing in plain terms
Pay-per-event, see the Pricing tab for the exact figures in force:
- Records (search, details, monitor, patents): about $3 per 1,000 rows plus a start fee of under one cent per run. A 500-mark portfolio pull with full TSDR details costs about $1.50 — the details are included, not a separate event.
- Clearance checks: each candidate produces one row, charged as a record. If a separate
trademark-checkevent appears on the Pricing tab later, it is charged per candidate in check mode only; search, details and monitor are never affected. - No proxies are needed, so there is no proxy bill.
Limits and FAQ
How fresh is the data? The USPTO search index is updated the morning after each filing day; TSDR records are live.
How many results per query? The USPTO index caps deep paging at 10,000 hits per query. Narrow with status, classes or dates, or split the query.
Does the owner search need the exact legal name? No — it is a phrase match on the applicant name, so Nike finds Nike, Inc.; Nike Inc and Nike, Inc. behave the same.
Why is markLiteral null on some rows? Design-only marks have no word element; markImageUrl shows the drawing.
Does check cover design marks or state trademarks? No — word marks and pseudo marks in the federal register only. Treat available as "passed the federal word-mark knock-out", not as a legal opinion.
What happens on failures? Rows already found are kept. The run's OUTPUT record lists every query that failed and why, and a per-query summary (matches, saved).
Can I reset a monitor? Delete the key-value store tm-watch-<hash> shown in the log, or use a new monitorId.
Migrating from USPTO Patent & Trademark Scraper, USPTO Trademark Watch or the second USPTO Scraper? Point your task at this actor; every input name keeps working. Watch users: owner is now an object (use ownerName), markType and goodsServices are arrays (use markTypeText, goodsServicesText); the monitor store name is unchanged, so saved state carries over.
Integrations
- API:
POST https://api.apify.com/v2/acts/fortuitous_pirate~uspto-trademark-scraper/run-sync-get-dataset-items?token=...with the JSON input returns the rows directly;/runsstarts an asynchronous run. - JavaScript:
const run = await client.actor('fortuitous_pirate/uspto-trademark-scraper').call({ mode: 'check', candidates: ['zephyrly'] }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); - Python:
run = client.actor('fortuitous_pirate/uspto-trademark-scraper').call(run_input={'searchMode': 'owner', 'queries': ['Nike, Inc.'], 'includeDetails': True})thenclient.dataset(run['defaultDatasetId']).iterate_items(). - Schedules: a weekly schedule with
mode: monitoris a complete trademark watch service; setwebhookUrlto Slack, Zapier, Make, n8n or your docketing system. - Make / Zapier / n8n: use the Apify module ("Run an actor and get dataset items") with any of the inputs above;
checkrows are flat enough to map straight into a sheet or CRM. - MCP / AI agents: the actor runs through the Apify MCP server; the input descriptions above are what an agent reads. Minimal inputs:
{"mode":"check","candidates":["name"]},{"queries":["brand"],"status":"live"},{"mode":"details","queries":["88554319"]}. - Export: JSON, CSV, Excel, XML via the dataset; the dataset views "Trademarks" and "Clearance check" show the relevant columns.
Disclaimer
This actor reads public data published by the United States Patent and Trademark Office. It is not affiliated with or endorsed by the USPTO. Output is information, not legal advice; clearance decisions should be made by a qualified trademark attorney.