USPTO Trademark Search, Check & Monitor — No Login, $2.79/1k avatar

USPTO Trademark Search, Check & Monitor — No Login, $2.79/1k

Pricing

from $2.79 / 1,000 results

Go to Apify Store
USPTO Trademark Search, Check & Monitor — No Login, $2.79/1k

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

Fortuitous Pirate

Maintained by Community

Actor stats

0

Bookmarked

60

Total users

3

Monthly active users

5 days ago

Last modified

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.

ModeWhat you getTypical use
searchOne 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
detailsThe 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
checkOne 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
monitorOnly 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
patentsLegacy 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):

FieldExample
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, markDescriptionper mark
markImageUrl, tsdrUrl / sourceUrlhttps://tsdr.uspto.gov/img/88554319/large, the official TSDR status page
relevanceScore, matchedTerm, scrapedAt103.3, "nimbus", ISO timestamp

With includeDetails: true (search), in details mode and in monitor mode the TSDR record is merged in:

FieldExample
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, lastEventDate37 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[], detailsFetched14 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):

VerdictRule
exact_match_liveA live word mark is identical to the candidate (ignoring case, punctuation and spacing)
likely_conflictA 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_conflictA 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)
availableNone 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

InputTypeNotes
modesearch / details / check / monitor / patentsInferred from the other inputs when empty
queriesarrayMarks, owners, goods phrases, attorney names, serials or registration numbers depending on searchMode / mode. Aliases: searchQuery, keyword, searchTerms
listUrlstringCSV or Google Sheet URL; first column appended to queries
searchModetext (default) / owner / goods / attorney / serial / registrationWhat queries are matched against
candidatesarraycheck mode. Alias terms (same input name as the batch-check actors you may be migrating from)
serialNumbers, registrationNumbersarrayDirect lookups. Alias trademarkSerialNumber (string)
statusall / live / dead / pendingAlias liveDead
internationalClassesarrayNice classes ["9", "42"], ["025"] or "25,9". Aliases niceClasses, classes, internationalClass
exactMatchbooleansearch/text: exact phrase in the word mark or pseudo mark
filingDateStart, filingDateEndYYYY-MM-DDAliases dateFrom, dateTo
includeDetailsbooleanMerge the TSDR record into every search result (alias includeDocuments)
maxItemsinteger, default 10Cap per run for search / details / monitor / patents. Check mode checks every candidate
maxMatchesPerCandidateinteger, default 10Matches listed per verdict row
onlyNew, monitorIdboolean, stringDedupe state for scheduled searches; monitorId also names the monitor-mode store (tm-watch-<hash>)
watchTerms, ownerNames, watchSerials, filedSinceDays, maxNewPerTerm, firstRunMode, webhookUrlMonitor mode (identical to the former USPTO Trademark Watch actor)
usptoApiKeystringOptional TSDR key (alias tsdrApiKey); the keyless backend returns the same record
searchType, patentType, patentsViewApiKeyPatents 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-check event 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; /runs starts 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}) then client.dataset(run['defaultDatasetId']).iterate_items().
  • Schedules: a weekly schedule with mode: monitor is a complete trademark watch service; set webhookUrl to 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; check rows 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.