USPTO New Trademark Filings & Search β Leads with Contacts
Pricing
from $6.00 / 1,000 results
USPTO New Trademark Filings & Search β Leads with Contacts
Daily US trademark application leads and register search from USPTO: new filings 1-2 days after filing, or search by mark text or owner name. Owner name & address, attorney, correspondent email & phone, pro-se flag, classes and goods β for IP law firms and brand protection. No key required.
Pricing
from $6.00 / 1,000 results
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
3
Monthly active users
23 days ago
Last modified
Categories
Share
USPTO Trademark Leads β’οΈ
foXLabs US lead series: FMCSA carriers Β· Insurance producers Β· Employer benefit plans Β· Federal contractors
π Turn USPTO trademark filings into lead data β no login, no API key, one row per application, with the applicant, the mark, the classes and the contact details on the record: correspondent e-mail and phone, attorney, owner address. Built for IP services, legal and B2B sales to new brands.
π What is USPTO Trademark Leads β and when should you use it?
It answers two questions about the USPTO trademark register, live on every run:
- Who filed a trademark application in the last days? New filings mode lists the applications filed in the last 14 days, newest first β optionally only the ones filed without an attorney (pro se), in the classes you care about.
- Which applications belong to this owner, or carry this mark? Search mode finds applications anywhere in the register by owner name and/or mark text.
Every result is then read from its own USPTO status page, which is where the contact details are.
Use it when you need: a daily list of new applicants to reach out to; the filings of one company with their contact person; the applications behind a brand name.
Use something else when: you only need to know whether a phrase is already taken (a plain availability check does not need the contact details and is faster elsewhere), or you need company firmographics β this is trademark filings, not a company registry.
π€ Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/uspto-trademark-leads.
Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire β no Apify account or API token of its own. Billing is the same either way: per delivered record, never for errors.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want to pull US trademark filings with contact details using the Apify Actor `foxlabs/uspto-trademark-leads`.Input: `mode` is `new_filings` (the latest filings), `search` (needs `markText` and/or `ownerName`), `serial_range` or `serial_list`. Optional filters: `filerType` (`pro_se_only` = filed without an attorney), `intlClasses`, `liveOnly`. `maxResults` caps how many results are returned; each result takes about 3 seconds.Start with: {"mode":"new_filings","maxResults":20}Ask me what to look up, run the Actor, then summarise the rows as a table.
The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/uspto-trademark-leads.md.
π Overview
Why teams pick this actor:
- βοΈ The contact details on the record β correspondent e-mail and phone, attorney, owner address, as they stand at USPTO. In a run of 300 self-filed applications on 6 October 2026, every row had an e-mail and 205 had a phone.
- π Fresh filings β a new application shows up one to two days after it is filed (measured 2026-10-06: the filings of 5 October were available on 6 October).
- π Pro-se filter β keep only the applicants who filed without an attorney. On 5 October 2026 that was 627 of 1,779 filings.
- π Search the register β by owner name and/or mark text, with class and live-mark filters (13.3 million records on 2026-10-06).
- π Feeds that do not repeat β with "Only new since last run", a scheduled run delivers each filing once.
- π° Pay per delivered row β no subscription; the run stops at your spending limit and tells you.
β¨ Features
- π° New filings feed β the last 14 days, or a custom filing-date range, newest first.
- π€ Search β every word of the mark text and/or the owner name must match; results newest first. The matching is USPTO's own: for mark text it can also return a mark that is spelled differently (a search for
canopyin class 28 also returned KANOPEO). - #οΈβ£ Serial lookup β a list or a range of US serial numbers.
- π§Ύ One record shape in every mode β mark, filing date, status, classes, goods and services, owner (name, address, legal entity type), attorney, correspondent contact, link to the USPTO page.
π¬ Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~uspto-trademark-leads/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"new_filings","maxResults":20}'
π Getting Started (3 steps)
- Choose the mode β New filings for the feed, Search for an owner or a mark, or serial numbers you already have.
- Set the filters and the cap β filer type, classes, and
maxResults(each result takes about 3 seconds). - Run and export β get the dataset as JSON, CSV or Excel.
π₯ Input
{"mode":"new_filings","maxResults":20}
| Field | Type | Description |
|---|---|---|
mode | string | new_filings (default) β the lead feed. search β by mark text and/or owner name. serial_range / serial_list β specific applications by US serial number. |
markText | string | Words to find in the mark β all of them must match. USPTO's index does the matching and can also return marks that are spelled differently. Required in search mode unless ownerName is given; narrows the feed in new_filings mode. |
ownerName | string | Words that must all appear in the applicant / owner name. Required in search mode unless markText is given; narrows the feed in new_filings mode. |
intlClasses | array | Keep only applications in at least one of these Nice classes (1-45), e.g. ["25"]. |
liveOnly | boolean | Leave out abandoned, cancelled and expired marks. |
filerType | string | all (default), pro_se_only β filed without an attorney, attorney_only. |
datePreset | string | freshest (default) β the last 14 days in new_filings mode, no date limit in search mode. custom β use dateFrom / dateTo. |
onlyNewSinceLastRun | boolean | For scheduled feeds in new_filings mode: each run delivers only filings it has not delivered before, newest first, looking back up to 14 days. A run that is cut short leaves the rest for the next run. The memory is kept per set of filters. One run per feed at a time: a second run with the same filters that starts meanwhile ends at once. |
dateFrom | string | YYYY-MM-DD filing date. Only used when datePreset is custom. |
dateTo | string | YYYY-MM-DD filing date. Only used when datePreset is custom. Leave empty for today. |
serialFrom | integer | First US serial number (8 digits). Only used in serial_range mode. |
serialTo | integer | Last US serial number. Only used in serial_range mode. |
serialNumbers | array | Specific 8-digit US serial numbers. Only used in serial_list mode. |
maxResults | integer | Hard cap on dataset rows per run (default 300, at most 2,500). |
maxRunSeconds | integer | Stop after this many seconds and keep the leads collected so far. 0 = no budget. The Actor also stops by itself 30 seconds before the run timeout. |
includeGoodsServices | boolean | Add the full goods/services description per class (default on). |
requestDelayMs | integer | Delay between USPTO status pages (default 3000, minimum 2500). |
More recipes
- The newest self-filed applications in clothing:
{"mode":"new_filings","filerType":"pro_se_only","intlClasses":["25"],"maxResults":50} - Everything one company has filed:
{"mode":"search","ownerName":"Landscape Structures","maxResults":25} - Live marks containing a word, in one class:
{"mode":"search","markText":"canopy","intlClasses":["28"],"liveOnly":true,"maxResults":25} - A scheduled feed that delivers each new filing once:
{"mode":"new_filings","filerType":"pro_se_only","onlyNewSinceLastRun":true,"maxResults":300} - One application you already know:
{"mode":"serial_list","serialNumbers":["99900001"]}
π€ Output
One row per application, saved to the dataset. Every run ends with a status message that says how many leads were delivered and, if the run stopped early, why.
| Field | Description |
|---|---|
serialNumber | US serial number |
markText | The mark (word mark or literal elements) |
filingDate | Application filing date (YYYY-MM-DD) |
isProSe | true when no attorney is on the record |
contactEmail / contactEmails | Correspondent e-mail (and attorney e-mail) on the record |
correspondentPhone | Correspondent phone |
correspondentNameAddress | Correspondent name and address |
ownerName / ownerAddress | Applicant / owner and their address |
legalEntityType / ownerOrigin | Owner's legal entity type and where it is organized |
attorneyName / attorneyEmail | Attorney of record, if any |
markDrawingType / markType / register | Kind of mark and register |
status / statusDate | USPTO status text and its date |
intlClasses / usClasses | International (Nice) and US classes |
goodsServices | Goods and services text per class (optional) |
tsdrUrl | Link to the USPTO status page |
source / fetchedAt | Source label and fetch time |
πΌ Use cases
1. New-brand lead-gen β reach applicants while the filing is fresh.
Input: {"mode":"new_filings","filerType":"pro_se_only","maxResults":300}. Output: the newest self-filed applications with the applicant's e-mail and phone.
2. IP services sales by class β a feed for one industry.
Input: {"mode":"new_filings","intlClasses":["9","42"],"onlyNewSinceLastRun":true}. Output: each new software / tech filing once.
3. Account research β what a company has filed and who handles it.
Input: {"mode":"search","ownerName":"Landscape Structures"}. Output: its applications, newest first, with attorney and correspondent.
π Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/uspto-trademark-leads').call({"mode":"new_filings","maxResults":20});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/uspto-trademark-leads').call(run_input={"mode":"new_filings","maxResults":20})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict β write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): schedule or webhook β HTTP request to the actor API with your input β handle the JSON dataset β push to a sheet, CRM or dashboard.
π Pricing
Pay-per-event: $0.006 per delivered record (β $6 per 1,000 leads), plus Apify's run-start event ($0.00005 per GB of run memory). A run that delivers nothing adds no record charge. View current pricing.
Spending limit. Before every USPTO status page the Actor checks the run's maximum charge β the limit you set for the run, or else what is left of your monthly usage limit. When there is no room for another lead it stops, keeps what it has delivered, and the status message says how many leads you got.
β FAQ
Do I need an account, login or API key? No.
Where does the data come from? Two public USPTO sources. The list of applications (who filed what, when) comes from the search service behind USPTO's own trademark search page; the contact details come from each application's TSDR status page. The search service is not a documented API: if it changes or stops answering, the run ends with a message that says so, and what was delivered is kept.
What do I search by? Mark text, owner name, international class, filer type (with or without attorney), filing date β or serial numbers.
How current is the data? Every run reads the sources live. A new application appears one to two days after it is filed.
Why does a run take a while? Each lead's contact details are read from its own status page with a pause of at least 2.5 seconds, to stay polite to the official source: about 100 leads per 5-6 minutes.
Does "Only new since last run" skip anything when a run stops early? No. The Actor remembers the filings it has delivered, per set of filters, and looks back 14 days on every run; whatever a run did not get to comes with the next one.
Can a lead come twice? The memory is written while the run goes (every 10 leads) and when the run ends, so a run that stops at maxResults or on a time or spending limit does not repeat its leads. An aborted run writes its memory too when Apify gives it the chance (a graceful abort). If a run is killed without warning β an immediate abort, a crash β the next run can deliver up to 10 of its last leads once more.
Can two runs of the same feed run at the same time? No, and the Actor prevents it, because both would deliver the same leads. A run with "Only new since last run" that starts while another run with the same filters is still going ends at once with a status message; it delivers nothing and does not contact USPTO. Feeds with different filters do not affect each other.
Can I export to CSV / Excel / JSON? Yes β directly from the Apify dataset.
π Troubleshooting
- Fewer rows than expected β raise
maxResults, or widen the filters. Insearchmode every word you type must be in the mark or the owner name. - No rows for the newest day β filings appear one to two days after they are filed, so the newest day in the window is usually empty.
- The run ended with "stopped because the maximum charge β¦ was reached" β the run's maximum charge, or what is left of your monthly usage limit, covered fewer leads than you asked for. The dataset holds the ones that were delivered; raise the limit and run again for the rest.
- The run ended with "USPTO's trademark search service β¦ " β the search service did not answer this time. Nothing is wrong with your input; run again later. Serial number modes do not use the search service.
- The run ended with "another run of this same feed is in progress" β two runs with "Only new since last run" and the same filters overlapped: the earlier one was still going, or had been killed less than three minutes before. Nothing was delivered. Start the run again when the other one has finished; if a schedule causes it, make the interval longer than a run takes, or lower
maxResults. - A mark-text search returned a mark without my word β USPTO's index does the matching and also returns some marks that are spelled differently (for example KANOPEO for
canopy). Filter the dataset onmarkTextif you need the literal word. - An application is missing its e-mail β the record has none: the Actor returns what the USPTO status page shows.
βοΈ Is it legal to scrape this data?
This actor reads the public USPTO trademark database. Results can still contain personal data (e.g. a personβs name); personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. See Apifyβs blog post on the legality of web scraping. If you use the leads to market legal services, the attorney advertising and solicitation rules of your jurisdiction apply to you.
π€ Support & contact
- π Website: data.foxlabs.com.tr
- π§ Email: info@foxlabs.com.tr
- π Issues: open a ticket in the Actorβs Issues tab
- π§° More clean B2B data actors: Fox Labs on Apify
Changelog
0.1.13 β 2026-10-08 β README: the Python example works with the current Apify client
- The README's Python example read the results with
run['defaultDatasetId']. With the current Apify client for Python (version 3)call()returns a run object, not a dict, and that line raisedTypeError: 'Run' object is not subscriptableβ after the run itself had finished. The example now readsrun.default_dataset_id; with client version 1 or 2, keeprun['defaultDatasetId']. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2. - No code, output field or pricing change.
0.1.12 β 2026-10-07 β a run that Apify starts again keeps to maxResults
- A run that the platform starts again no longer writes past
maxResultsor repeats rows. Apify can move a run to another server while it is going; the Actor then starts again with the same dataset. Until now it started counting from zero: a run withmaxResults30 that was started again after 14 rows ended with 44 rows, 4 of them written twice. The Actor now first reads what its own dataset already holds β those leads count towardsmaxResultsand are not written again. All four modes. - No output field changed, no pricing change.
0.1.11 β 2026-10-07 β fresh filings again, and search by mark text or owner name
- New filings mode returns new filings again. Since about 20 July 2026 it had been returning the same filings of that date as "the freshest": USPTO changed how it numbers applications (a new 50β¦ series since 18 July 2026, and 99β¦ numbers no longer in filing order), and the Actor found new filings by walking down from the highest serial number. It now gets the list of applications by filing date from USPTO's search service and reads the contact details from each application's status page as before. Measured on 2026-10-06: the filings of 5 October were available (1,779 that day, 627 without an attorney), and a run no longer starts by spending about two minutes looking for the newest serial number.
- New: Search mode (
"mode":"search") β find applications anywhere in the register bymarkTextand/orownerName; every word must match; newest first. - New filters for New filings and Search:
intlClasses(Nice classes) andliveOnly.markTextandownerNamealso narrow the New filings feed. - Behaviour change β
onlyNewSinceLastRun: the Actor now remembers the filings it has delivered (per set of filters) and looks back 14 days on every run. Each filing is delivered once; whatever a run does not get to (Max results, a time limit, your spending limit) comes with the next run. The first runs of a new feed therefore work back through the last 14 days before they are down to only the newest filings. onlyNewSinceLastRunβ the memory is written while the run goes (every 10 leads), when it ends and on a graceful abort. A run that is killed without warning can repeat at most its last 10 leads in the next run.onlyNewSinceLastRunβ one run per feed at a time. A run that starts while another run with the same filters is still going ends at once with a status message, without delivering anything or contacting USPTO: two at once would deliver the same leads twice.- Behaviour change β pro-se filter: it is applied when the list is made, so the run no longer spends requests on applications that have an attorney.
- If USPTO's search service does not answer, the run ends with a message that says so; rows already delivered are kept. Serial number modes do not use it.
serialFrom/serialToaccept the 50β¦ series.- No output field changed, no pricing change.
0.1.9 β 2026-10-07 β a run that is cut short stops cleanly, says why, and the next one carries on
- A run that reaches its maximum charge now stops by itself and tells you. The maximum charge is the limit you set for the run, or else what is left of your monthly usage limit. Until now the Actor did not look at it: the scan went on, leads past the limit were logged as pushed but left out of the dataset, and a longer run was aborted by Apify. The Actor now checks the room left before every USPTO request, stops the scan when there is none, and finishes as a normal run with a status message that says how many leads were delivered.
onlyNewSinceLastRun: a cut-short run no longer loses the rest of its batch. A run that stops early β atmaxResults, on a time limit, or on its maximum charge β saves the part it did not reach, and the next incremental run continues with it after the new filings. Nothing is skipped and nothing is delivered twice. Before, the rest of that batch was never delivered. For a daily feed whosemaxResultsis smaller than the day's filings this means a run can now also return filings older than the previous run's newest one.- The time limits hold. The Actor stops 30 seconds before the run timeout instead of being cut off by it, and
maxRunSecondsalso covers the first step, locating the newest filing. - Every run ends with a status message that says what was delivered and, for a partial run, why it stopped.
- No output field changed, no pricing change.
0.1.8 β 2026-09-20 β README examples corrected against the real input schema
- The README's code examples did not match this Actor. They used
queriesandmaxResultsPerQueryβ keys that do not exist in this Actor's input schema β with a placeholder value, and the input table listed those same phantom fields. Anyone who copied the AI-agent, cURL, JavaScript or Python example got a failing run. Every example now uses the real schema and matches the Console prefill:{"mode":"new_filings","maxResults":20} - The input table is regenerated from
input_schema.json, so it lists the fields the Actor actually accepts. - Removed claims carried over from the same generator template where present: "formation / status monitoring", "a canonical registry record for KYB and due diligence", "every row carries
query", andindustrydescribed as a NACE code. - No code, output field or pricing change.
0.1 β 2026-09-07
- Enabled AI-agent payments (x402) + rebuilt the README to the full standard (What-is / when, AI-agents + x402 agentic payments + MCP, Overview, Features, Use cases, Integration, FAQ, Troubleshooting, Support & contact).
0.0
- Initial release: data from the USPTO trademark database (official open data) by name or registry ID.