USPTO Trademark Batch Search API avatar

USPTO Trademark Batch Search API

Pricing

from $5.00 / 1,000 uspto trademark results

Go to Apify Store
USPTO Trademark Batch Search API

USPTO Trademark Batch Search API

Batch-search the USPTO trademark register by keyword, serial number, registration number, or owner. Returns live/pending/dead status, Nice classes, owners, dates, goods/services, and TSDR links. HTTP-only, no API key. Built for POD clearance, brand monitoring, and AI agents.

Pricing

from $5.00 / 1,000 uspto trademark results

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 days ago

Last modified

Share

Batch-search the United States Patent and Trademark Office register by keyword, serial number, registration number, or owner name. Each query returns matching federal marks with live/pending/dead status, Nice classes, owner, filing and registration dates, goods and services, and a TSDR link — or one CLEAR row when nothing matches. Designed for print-on-demand sellers, brand-clearance workflows, trademark monitoring, and AI agents that need a structured USPTO answer without a USPTO.gov login or API key.

This Actor reads the public Trademark Search index behind tmsearch.uspto.gov. It is a search and status lookup, not a legal opinion and not a substitute for a comprehensive attorney-led clearance search.

Best fit for this Actor

  • You have a list of brand phrases, merch slogans, or domain names and need to know whether live or pending US federal marks already use them.
  • You already have serial or registration numbers and want structured status, owner, class, and TSDR links in one dataset.
  • You want an owner-portfolio snapshot (for example every live mark owned by Nike, Inc.) capped to a predictable number of rows.
  • For patents, citations, and family graphs, use Google Patents Scraper instead of this Actor.

POD clothing clearance for a merch phrase

A merch seller is about to print STAR WARS on class 25 apparel. They pass that phrase with niceClasses set to 25 and statusFilter set to live. The dataset comes back with matchFound: true, recordStatus: LIVE, Lucasfilm as ownerName, serial 75306994, and a tsdrUrl they can open. They drop the phrase from the catalog and keep the TSDR link in the audit trail. A nonsense phrase in the same batch returns recordStatus: CLEAR, so the rest of the list can ship.

Quick start input

{
"searchTerms": ["star wars"],
"niceClasses": "25",
"statusFilter": "live",
"maxResultsPerTerm": 3,
"includeClearRows": true
}

Each value in searchTerms is one USPTO query. maxResultsPerTerm keeps a famous mark from dumping hundreds of rows into the dataset; maxResults is the run-wide cost ceiling.

Input reference

FieldTypeWhat it controls
searchTermsarrayWordmark/keyword phrases, up to 100. Example: star wars.
serialNumbersarrayExact 7-8 digit serials, SN: prefixes, or TSDR URLs.
registrationNumbersarrayExact registration numbers such as 2239077.
ownerNamesarrayOwner-portfolio search, up to 50 names.
statusFilterenumlive (default), pending, registered, dead, or all.
niceClassesstringComma-separated Nice classes 1-45. Empty = every class. 25 is clothing.
matchModeenumcontains (default) or exact wordmark. Ignored for serial/registration lookup.
maxResultsPerTerminteger1-50 rows saved per query. Default 5. Prefill 3.
maxResultsintegerRun-wide row cap, 1-1000. Default 250.
includeClearRowsbooleanWrite a CLEAR row when a query has zero matches. Default true.
maxConcurrencyintegerParallel USPTO queries, 1-8. Default 4.

At least one of searchTerms, serialNumbers, registrationNumbers, or ownerNames is required. Empty input returns INVALID_INPUT with zero rows and zero trademark-result charges.

What data you receive

One dataset item is either a matching USPTO mark or a CLEAR no-match row for a query.

{
"searchTerm": "star wars",
"queryType": "wordmark",
"matchFound": true,
"recordStatus": "LIVE",
"wordmark": "STAR WARS",
"serialNumber": "75306994",
"registrationNumber": "2534385",
"statusDescription": "REGISTERED AND RENEWED",
"niceClasses": [25],
"ownerName": "Lucasfilm Ltd. LLC (LIMITED LIABILITY COMPANY; CALIFORNIA, USA)",
"filingDate": "1997-06-11",
"tsdrUrl": "https://tsdr.uspto.gov/#caseNumber=75306994&caseSearchType=US_APPLICATION&caseType=SERIAL_NO&searchType=statusSearch",
"source": "uspto-tmsearch",
"scrapedAt": "2026-08-17T10:00:00.000Z"
}

recordStatus values:

ValueMeaning
LIVEAlive and registered
PENDINGAlive but not yet registered
DEADAbandoned, cancelled, or expired
CLEARThis query produced no matches under the chosen filters

matchCountForQuery is the USPTO hit total before the per-query cap, so you can see that STAR WARS in class 25 had thousands of hits even when only three rows were saved.

Real-world use cases

1. POD clothing batch

Check a merch phrase list against live class 25 marks before upload.

{
"searchTerms": ["star wars", "just do it", "zzzxqwertyplugh999"],
"niceClasses": "25",
"statusFilter": "live",
"maxResultsPerTerm": 3,
"includeClearRows": true
}

Use matchFound and recordStatus to drop conflicts. Keep CLEAR phrases.

2. Exact wordmark, all classes

Confirm whether the literal mark NIKE is live anywhere, not just as a substring of longer marks.

{
"searchTerms": ["NIKE"],
"matchMode": "exact",
"statusFilter": "live",
"maxResultsPerTerm": 5
}

3. Serial number status

Look up a known filing from a TSDR URL or raw serial.

{
"serialNumbers": ["74612654"]
}

Returns owner, classes, registration number, and the canonical TSDR link.

4. Registration number lookup

Resolve a certificate number to the current index record.

{
"registrationNumbers": ["2239077"],
"statusFilter": "all"
}

5. Owner portfolio

List live marks for one registrant, capped so the run stays cheap.

{
"ownerNames": ["Nike, Inc."],
"statusFilter": "live",
"maxResultsPerTerm": 10,
"maxResults": 10
}

6. Pending-only watch

See only applications that are alive but not yet registered.

{
"searchTerms": ["just do it"],
"statusFilter": "pending",
"maxResultsPerTerm": 5
}

7. Dead-mark history

Check whether a name was used before and later abandoned or cancelled.

{
"searchTerms": ["twin spray"],
"statusFilter": "dead",
"maxResultsPerTerm": 5,
"includeClearRows": false
}

8. Mixed batch for an agent

Combine a phrase, a serial, and an owner in one run.

{
"searchTerms": ["star wars"],
"serialNumbers": ["74612654"],
"ownerNames": ["Lucasfilm Ltd."],
"niceClasses": "25",
"statusFilter": "live",
"maxResultsPerTerm": 3,
"maxResults": 20,
"maxConcurrency": 2
}

Why agents choose this Actor

  • Bounded cost: $0.005 per saved row plus a $0.00005 start event, with maxResults as the hard ceiling.
  • Flat JSON keys (wordmark, serialNumber, recordStatus, tsdrUrl) instead of nested USPTO XML.
  • CLEAR rows make a 100-term batch complete even when most phrases are free of live hits.
  • Provenance is explicit: source is always uspto-tmsearch, scrapedAt is ISO, tsdrUrl points at the official case.
  • Terminal OUTPUT.outcome values (COMPLETE, PARTIAL, VALID_EMPTY, INVALID_INPUT, UPSTREAM_FAILED) are stable enough to branch on.
  • Serial, registration, owner, and keyword search share one schema, so a tool call does not need a mode enum.
  • Patent work is out of scope on purpose, which keeps this tool from colliding with Google Patents Scraper.

Agent checklist

  1. Pass trademark phrases, serials, registration numbers, or owner names. Patent numbers belong on Google Patents Scraper.
  2. Set maxResults (and maxResultsPerTerm) to the budget you can spend at $0.005 per row.
  3. Prefer statusFilter: "live" and a Nice class such as "25" for merch clearance.
  4. After the run, read OUTPUT.outcome, then the dataset. An empty dataset is a valid CLEAR/no-match result when the outcome is VALID_EMPTY.
  5. Open tsdrUrl when you need the official status page or documents; this Actor does not download TSDR PDFs.
  6. If matchCountForQuery is larger than the rows you received, raise the caps or narrow niceClasses / matchMode.
  7. Schedule repeats against the same searchTerms when you are monitoring new filings; USPTO search is not a live opposition-calendar feed.

Use through the API

curl "https://api.apify.com/v2/acts/khadinakbar~uspto-trademark-batch-search/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchTerms": ["star wars"],
"niceClasses": "25",
"statusFilter": "live",
"maxResultsPerTerm": 3
}'

When the Actor completes, read dataset items from the default dataset and the OUTPUT record from the default key-value store.

Use with AI agents through Apify MCP

Check these merch phrases against live USPTO class 25 trademarks: "star wars", "just do it". Return wordmark, serialNumber, recordStatus, ownerName, niceClasses, and tsdrUrl. Cap at 3 matches per phrase and keep CLEAR rows. Then inspect OUTPUT.outcome before summarizing.

Connect through https://mcp.apify.com. After the tool call, read the dataset and the OUTPUT / RUN_SUMMARY records. Preserve tsdrUrl as the official source link.

Pricing

This Actor uses Pay per event plus Apify platform usage. Open the live Pricing tab for current event details, and use Apify's run cost controls to keep the workflow aligned with your budget.

Worked examples at the launch prices (apify-actor-start $0.00005, trademark-result $0.005):

InputRows billedEvent cost
One phrase, 3 matches3~$0.015
10 phrases, all CLEAR10~$0.050
100 phrases, 1 row each100~$0.500
Serial lookup, 1 hit1~$0.005
Empty / invalid input0start event only

Formula: trademark-result count × $0.005 + start event + platform usage. Platform usage is billed to the user on top of events.

Outcome vocabulary

These values live in the key-value store records OUTPUT and RUN_SUMMARY, not on each dataset row.

OutcomeMeaning
COMPLETEEvery query was processed and useful rows were saved.
PARTIALSome queries were incomplete, a cap stopped the run, or the event limit was hit; saved rows are still in the dataset.
VALID_EMPTYQueries succeeded and produced zero rows (usually includeClearRows: false with no matches).
INVALID_INPUTNothing to search. Fix the input; no trademark events are charged.
UPSTREAM_FAILEDUSPTO Trademark Search did not return usable data for the requested work.

Connect the workflow

  • After you confirm a brand name is clear at USPTO, enrich the seller or importer with ImportYeti Scraper when you also need US Customs shipment history and listed trademarks.
  • For patent — not trademark — search, citations, and family graphs, use Google Patents Scraper.
  • To see whether a brand name is being used in live Google Search ads, continue with Google Ads Scraper.

Best results

  • Filter by Nice class for POD and product clearance. Class 25 is clothing; class 9 is electronics; class 18 is bags.
  • Use contains for risk spotting and exact when you care about the literal wordmark.
  • Keep maxResultsPerTerm small (3-5) on famous marks. STAR WARS in class 25 has thousands of live hits.
  • Leave includeClearRows on for batch jobs so every input phrase appears in the export.
  • USPTO search can lag new filings by a short index delay. Re-run if you are checking a mark filed in the last few days.

Builder's note

I built this after posting live queries to the public Trademark Search index. I found the UI is a thin client over an Elasticsearch-style POST whose envelope uses hits.totalValue and source (not _source), and that _source: true can come back empty. In my testing, mapping alive plus registered into LIVE / PENDING / DEAD was more useful for agents than raw USPTO status codes. My goal was a complete 100-phrase batch, which is why a query with zero hits still writes a CLEAR row instead of going missing from the export. When AWS WAF challenges a datacenter IP, the run retries once through Apify Residential US and keeps only real USPTO rows.

FAQ

How many trademarks do I get per phrase? Up to maxResultsPerTerm matching rows, plus one CLEAR row when includeClearRows is on and nothing matches. Famous marks such as STAR WARS can have thousands of hits; the cap keeps the export and the bill predictable.

Do I need a USPTO API key or login? No. The Actor queries the public Trademark Search index over HTTP. You never supply a USPTO account, cookie, or API key.

What if USPTO is temporarily unavailable? The run retries, then tries Apify Residential US. When no advertised query returns usable data and no rows were saved, the run ends UPSTREAM_FAILED. Useful partial results still succeed as PARTIAL.

Can an AI agent use this? Yes. It is MCP-ready: pass phrases, serials, registration numbers, or owner names and read one row per match (or CLEAR). Inspect OUTPUT.outcome before summarizing.

Is this legal advice or a full clearance search? No. Results are public-register data for research and monitoring. Pair them with a trademark attorney before filing or launching a brand.

Responsible use

This Actor returns public USPTO trademark records for clearance research, monitoring, and enrichment. Treat the output as public-register data: pair it with a trademark attorney before filing or launching a brand, keep request volume courteous to the public search service, and use results in line with USPTO terms and applicable laws.