USPTO Trademark API in 2026: TSDR, Bulk Data, and What tmsearch Doesn't Offer

Is there a USPTO API for trademark search? TSDR covers status by serial number, ODP covers bulk files, tmsearch.uspto.gov has none. What exists in 2026.
15 min read

No, tmsearch.uspto.gov has no documented public API: its help page documents one way to get data out, an Export button that writes up to 500 results to an Excel file. What the USPTO does offer developers is the TSDR API, for status and documents when you already have a serial number (USPTO.gov account and API key required), and trademark bulk XML files through the Open Data Portal (sign-in required). There is no official USPTO API that searches trademarks by name.

Everything below is as of October 12, 2026, with a source link on each claim.

Does the USPTO Have a Trademark API?

Each cell comes from a USPTO page linked below.

What it doesAccessFormatLimits
TSDR APIStatus and documents for a known serial, registration, reference or international registration numberUSPTO.gov account plus an API key in the USPTO-API-KEY headerHTML, XML, PDF, ZIP60 requests/min (4/min for PDF and ZIP); off-peak 120 and 12
ODP bulk dataTrademark Daily XML Files (applications, assignments, TTAB)USPTO.gov sign-in with MFA; API keyXML filesNot published outside the sign-in
tmsearchSearch by name, field tags and (beta) image, built for peopleBrowser; image search requires a loginExcel export, up to 500 resultsTerms of use: unusually high automated access may be denied

What changed in 2026: the Open Data Portal has required a USPTO.gov sign-in since June 18, API keys on profiles missing four newly required fields were set to be deactivated on October 8, and developer.uspto.gov now redirects to data.uspto.gov. Older guides are likely to point you to URLs that no longer work as described.

This guide is for developers who need US trademark data inside their own code. If you just want to look up a name by hand, read how to search trademarks now that TESS is gone.

TSDR API: Status and Documents by Serial Number

What TSDR returns

TSDR (Trademark Status and Document Retrieval) "provides real-time access to the electronic file wrapper" of US applications and registrations, according to the TSDR FAQ. A file wrapper is the official record of a case: status, filings, office actions, specimens and certificates.

TSDR is a lookup, not a search. You need an identifier first: a serial number (assigned when an application is filed), a registration number (assigned when it registers), a reference number, or an international registration number. There is no query by name, owner or class.

USPTO's TSDR API Key Manager user guide documents these response types, all on https://tsdrapi.uspto.gov/ts/cd/:

  • Case status as HTML (casestatus/sn78787878/content), XML (casestatus/sn78787878/info.xml), PDF (casestatus/sn78787878/download.pdf) or a ZIP of XML and CSS (casestatus/sn75757575/content.zip)
  • Documents as a PDF bundle (casedocs/bundle.pdf?sn=72131351), XML metadata filtered by date (casedocs/bundle.xml?sn=...&fromDate=...&toDate=...), or a ZIP of original TIFFs (casedocs/bundle.zip?rn=...&category=RC)
  • The mark image (rawImage/78787878)

Lookups accept sn=, rn=, ref= and ir=. USPTO's guide documents HTML, XML, PDF and ZIP only. Some third-party pages mention a JSON endpoint; Signa could not confirm one on a USPTO page, because the TSDR Swagger UI sits behind the ODP sign-in.

Getting a USPTO API key for TSDR

"As of October 2, 2020, you must register in order to use the TSDR APIs," says the TSDR FAQ. Keys come from the API Key Manager at account.uspto.gov/api-manager, which requires a USPTO.gov account (the URL redirected to the sign-in page when Signa checked on October 12, 2026). The key is "a (approximately) 40 character string" sent in a header named exactly USPTO-API-KEY.

This is the status request for the DOCKER registration (serial 87454105), built from the shape in USPTO's user guide. Signa did not run it with a key for this article, so no XML output is shown here.

curl -s -H "USPTO-API-KEY: $USPTO_API_KEY" \
  "https://tsdrapi.uspto.gov/ts/cd/casestatus/sn87454105/info.xml"

Without the header, the same request returned HTTP 401 on October 12, 2026, with this body:

Beginning October 2, you'll need to register for an API key to download bulk data from our TSDR APIs. Register for an API key at https://account.uspto.gov/api-manager/. Learn more about this new requirement at https://developer.uspto.gov/api-catalog.

That last link now redirects to the Open Data Portal home page. The user guide, dated September 2020, has its own small trap: its curl example misspells the host as tsdrapi.upsto.gov (the correct host is tsdrapi.uspto.gov). The TSDR FAQ also still tells users without a serial number to find one "through the Trademark Electronic Search System TESS", which was retired in 2023.

Rate limits in practice

USPTO's limits are "subject to change depending on system availability and usage":

  • 60 requests per API key per minute for all requests
  • 4 per minute for PDF and ZIP downloads, and 4 per minute for multi-case PDF and ZIP downloads
  • Off-peak (10 p.m. to 5 a.m. Eastern, seven days a week): 120 per minute, and 12 per minute for PDF, ZIP and multi-case downloads

To put that in practical terms (my arithmetic, not USPTO's): refreshing the status of 100,000 marks at 60 requests a minute takes about 1,667 minutes, roughly 28 hours of continuous calls. The off-peak window is 7 hours at 120 a minute, which allows about 50,400 calls a night.

What TSDR does not do: search by name, owner or class; return JSON (USPTO documents none); or compute deadlines. It gives you the registration date, and the date arithmetic is yours.

USPTO Trademark Bulk Data: The Open Data Portal

developer.uspto.gov, the address most older guides and USPTO's own TSDR FAQ still link, now redirects to the Open Data Portal (ODP) at data.uspto.gov. Both developer.uspto.gov/api-catalog and the old TSDR data API page resolved to data.uspto.gov/home on October 12, 2026. ODP calls itself "USPTO's data platform that empowers you to discover and easily extract USPTO data in one place for free."

Access is gated. "Starting on June 18, 2026, you'll need to sign in with a valid USPTO.gov account," and that account requires multi-factor authentication. From August 18, 2026, ODP required four additional profile fields, and "API keys for accounts that have not completed these fields by October 8, 2026, will be deactivated." A deactivated key can be reactivated from the Manage API Key page.

When Signa checked signed out on October 12, 2026, ODP's Bulk Data Directory, API docs, FAQ, release notes and Swagger pages all redirected to the home page. Only the home page and the registration page rendered, so even the list of datasets sits behind the login. An unauthenticated request to the Bulk Data API returned HTTP 401 {"message":"Unauthorized"}. Signa could not verify the header name ODP keys use, because the docs that would say are behind the sign-in.

The APIs on ODP's home page are Patent File Wrapper, Bulk Datasets, Petition Decisions, PTAB Decisions, Enriched Citations, and four Office Action products. Every one except Bulk Datasets is a patent product. There is no trademark search API in the list. TSDR appears under "Additional USPTO Data Dissemination Applications" with the note "These products are not maintained by Open Data Portal" (support: teas@uspto.gov).

The trademark bulk files

USPTO's XML Resources page lists three trademark products, each called Trademark Daily XML Files (TDXF):

  • Applications, documented in Trademark Applications Documentation v2.3 (dated 2025-08-13), with a status code table and a series code table
  • Assignments
  • TTAB, from the Trademark Trial and Appeal Board, the USPTO tribunal that hears oppositions and cancellations

The documentation is public; the files live in ODP's Bulk Data Directory, behind the sign-in. Signa could not verify file sizes or history depth without an ODP login, so none are given here. Questions go to data@uspto.gov.

There is also the Trademark Case Files Dataset from USPTO's economic research team: "detailed information on 12.7 million trademark applications filed with or registrations issued by the USPTO between October 1870 and March 2024", including prosecution events, ownership, classification, oppositions and renewals. It ships as CSV and Stata files; the full 2023-vintage CSV archive is listed at 4.33 GB. It is a research snapshot, not a feed, and its newest data is March 2024. A notice on the page says that, because of ODP policy changes, download links now generate "a temporary signed URL that users can paste into their browser."

What bulk data costs you

Bulk data gives you files, not answers. To query them you build the parser, the storage, the daily update job that applies each new file, and the search index on top. That is real engineering, and it grows with every office you add, as covered in normalizing trademark data across offices.

Does tmsearch.uspto.gov Have an API?

TESS (Trademark Electronic Search System) was retired on Thursday, November 30, 2023 and replaced by the cloud-based Trademark Search at tmsearch.uspto.gov. (For what was lost and gained, see what TESS did right and wrong.) USPTO's updates page, last updated October 5, 2026, lists beta features: image upload search, which requires a USPTO.gov login, and an in-search details view showing most TSDR information.

tmsearch is built for people. It supports field-tag queries such as CM:dog AND LD:true (live marks containing the word "dog"; CM is words in the mark, LD is live/dead, GS is goods and services).

Its help page documents exactly one way out: the Export button, which writes an Excel file of the results on the page, the first 500 results, or up to 500 tagged results. Search history export covers up to 100 recent queries from the session. The help page mentions no API, no API key and no machine-readable endpoint.

USPTO's terms of use are explicit: its online databases "are not designed or intended to be a source for bulk downloads of USPTO data when accessed through the website's interfaces," and users who generate "unusually high numbers of database accesses (searches, pages, or hits), whether generated manually or in an automated fashion, may be denied access to USPTO servers without notice." The same page points to bulk data products instead.

One observation, not a USPTO statement: when Signa loaded tmsearch.uspto.gov on October 12, 2026, the page loaded an AWS WAF challenge script before the app. The app does talk to a backend, but USPTO publishes no documentation, key, terms or stability promise for it. A product built on an undocumented endpoint, behind a bot challenge, on a site whose terms allow cutting off automated traffic without notice, can break at any time.

The Same USPTO Lookups Through Signa's API

The gap, then, is name search as an API, structured JSON, and computed deadlines. Signa indexes 14.36 million USPTO records, synced daily (Signa data, GET /v1/offices/US, queried October 12, 2026). Keys are created at app.signa.so and belong on the server side only; the quickstart covers setup.

Every call below ran against production on October 12, 2026 (the name search was re-run on October 14), with output trimmed by jq.

Search the US register by name

curl -sG "https://api.signa.so/v1/trademarks" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  --data-urlencode "q=docker" \
  --data-urlencode "offices=US" \
  --data-urlencode "status_primary=active" \
  --data-urlencode "limit=5" \
  | jq -c '.data[] | {mark_text, tier: .match.tier, serial: .application_number, owner: .owners[0].name, classes: .nice_classes}'
{"mark_text":"DOCKER","tier":"identical","serial":"87454105","owner":"Docker, Inc.","classes":[9]}
{"mark_text":"DOCKER","tier":"identical","serial":"85953776","owner":"DOCKER, INC.","classes":[9]}
{"mark_text":"DOCKER HF","tier":"similar","serial":"86653535","owner":"Unitron, LP","classes":[9]}
{"mark_text":"DOCKERS","tier":"near_identical","serial":"73620320","owner":"ABG-DOCKERS LLC","classes":[25]}
{"mark_text":"DOCKERS","tier":"near_identical","serial":"76097126","owner":"ABG-DOCKERS LLC","classes":[9]}

Each hit carries a match.tier: identical, near_identical, similar or related. Results are ordered by a relevance score, which is not a measure of likelihood of confusion.

The classes field holds Nice classes, the international categories for goods and services: class 9 covers software, class 25 clothing. Matching runs on the mark text, so DOCKERS in class 25 shows up next to DOCKER in class 9. These are search results, nothing more. The response also returns has_more: true and a pagination cursor; parameters are in the search reference.

Look up a serial number

The TSDR-style lookup, returning JSON:

curl -s "https://api.signa.so/v1/trademarks/batch" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"identifiers":[{"application_number":"87454105","office_code":"US"}]}' \
  | jq '.data[0] | {id, mark_text, stage: .status.stage, registration_number, filing_date, registration_date, owner: .owners[0].name, classes: .nice_classes, events_count}'
{
  "id": "tm_019d2bce-86d3-761f-95a8-0830b92f160b",
  "mark_text": "DOCKER",
  "stage": "registered",
  "registration_number": "6096739",
  "filing_date": "2017-05-17",
  "registration_date": "2020-07-07",
  "owner": "Docker, Inc.",
  "classes": [
    9
  ],
  "events_count": 47
}

The batch endpoint takes up to 100 identifiers per call (serial or registration number plus office code, or an international registration number) and returns unmatched inputs in not_found.

Read the prosecution history

curl -s "https://api.signa.so/v1/trademarks/tm_019d2bce-86d3-761f-95a8-0830b92f160b/events?limit=3" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  | jq -c '.data[] | {event_date, event_type, code: .raw.code, label: .raw.label}'
{"event_date":"2025-10-31","event_type":"renewal","code":"NA85","label":"NOTICE OF ACCEPTANCE OF SEC. 8 & 15 - E-MAILED"}
{"event_date":"2025-10-31","event_type":"renewal","code":"C15A","label":"REGISTERED - SEC. 8 (6-YR) ACCEPTED & SEC. 15 ACK."}
{"event_date":"2025-10-31","event_type":"examination_start","code":"APRE","label":"CASE ASSIGNED TO POST REGISTRATION PARALEGAL"}

Events come newest first. raw.code and raw.label are the USPTO's own event code and text; event_type is Signa's normalized type.

Compute the next deadline

US registrations have to be maintained. Between years 5 and 6 the owner files a Section 8 declaration of use; DOCKER's was accepted on October 31, 2025 (the events above). Every 10 years from registration, the owner files a combined Section 8 declaration and Section 9 renewal.

curl -s "https://api.signa.so/v1/deadlines/compute" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"id":"tm_019d2bce-86d3-761f-95a8-0830b92f160b"}]}' \
  | jq '.data[0].deadlines[] | {rule_id, type, trigger_date, window_opens, due_date, due_date_adjustment, grace_expiry_date, consequence_if_missed}'
{
  "rule_id": "us_renewal_s9",
  "type": "combined_renewal_and_use",
  "trigger_date": "2020-07-07",
  "window_opens": "2029-07-07",
  "due_date": "2030-07-08",
  "due_date_adjustment": "moved",
  "grace_expiry_date": "2031-01-07",
  "consequence_if_missed": "cancellation_and_expiration"
}

DOCKER registered on July 7, 2020, so the 10-year date is July 7, 2030, a Sunday. The due date moves to Monday, July 8 (the weekend rollover under 37 CFR 2.196), and a six-month grace period runs to January 7, 2031. The response returns its sources: 15 U.S.C. 1058(a) and 1059(a), 37 CFR 2.160, 2.182 and 2.196, TMEP 1604.04 and 1606.03, and USPTO's Keeping Your Registration Alive page. Computed dates are a calculation, not legal advice; consult a trademark attorney before relying on one.

Count filings without downloading the register

A question you would normally answer with bulk files, in one aggregation:

curl -s "https://api.signa.so/v1/trademarks" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filters":{"offices":["US"],"filing_date":{"gte":"2021-01-01","lt":"2026-01-01"}},"options":{"aggregations":["filing_year"]},"limit":1}' \
  | jq -c '.aggregations.filing_year'
{"2021":673576,"2022":551253,"2023":548066,"2024":597596,"2025":626372}

US trademark filings per year in Signa, 2021 to 2025

2021 was the peak of the five years at 673,576 records. 2025, at 626,372, is the highest since and 14.3% above 2023. These are Signa record counts by calendar year (Signa data, queried October 12, 2026), not official USPTO application statistics, which the USPTO reports by fiscal year. They include Madrid designations of the US: under the Madrid Protocol an owner files one international application covering many countries, and each US designation appears as a record.

The same three calls in TypeScript

Install with npm install @signa-so/sdk. This ran with version 0.22.0 on Node 22:


const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });

// 1. Name search, US register only
const results = await signa.trademarks.list({
  q: 'docker',
  offices: ['US'],
  status_primary: 'active',
  limit: 5,
});
for (const hit of results.data) {
  console.log(hit.mark_text, hit.match?.tier, hit.application_number, hit.owners[0]?.name);
}

// 2. Resolve a USPTO serial number to a record
const { data, not_found } = await signa.trademarks.batch({
  identifiers: [{ application_number: '87454105', office_code: 'US' }],
});
const mark = data[0];
console.log(mark.id, mark.status.stage, mark.registration_number, not_found.length);

// 3. Compute its next maintenance deadline
const computed = await signa.deadlines.compute({ items: [{ id: mark.id }] });
for (const d of computed.data[0].deadlines) {
  console.log(d.rule_id, d.due_date, d.grace_expiry_date);
}
DOCKER identical 87454105 Docker, Inc.
DOCKER identical 85953776 DOCKER, INC.
DOCKER HF similar 86653535 Unitron, LP
DOCKERS near_identical 73620320 ABG-DOCKERS LLC
DOCKERS near_identical 76097126 ABG-DOCKERS LLC
tm_019d2bce-86d3-761f-95a8-0830b92f160b registered 6096739 0
us_renewal_s9 2030-07-08 2031-01-07

Limits, stated plainly

  • Rate limit. The Free plan allows 60 requests per minute for most endpoints, the same as TSDR's standard limit.
  • Credits. A search costs 10 credits per page, a record read 1, a batch lookup 1 per identifier and a deadline computation 10 per item; office reference endpoints are free. All are on the Free plan; see pricing.
  • File-wrapper documents. For office actions, specimens and registration certificates, TSDR's document endpoints are the official source.
  • TSDR is the system of record. Signa is a third-party index. Every record says how current it is and links back to its TSDR page:
curl -s "https://api.signa.so/v1/trademarks/tm_019d2bce-86d3-761f-95a8-0830b92f160b" \
  -H "Authorization: Bearer $SIGNA_API_KEY" \
  | jq '{office_url, source_data_date: .provenance.source_data_date, updated_at}'
{
  "office_url": "https://tsdr.uspto.gov/#caseNumber=87454105&caseSearchType=US_APPLICATION&caseType=DEFAULT&searchType=statusSearch",
  "source_data_date": "2026-03-13",
  "updated_at": "2026-03-30T13:32:02.256Z"
}

provenance.source_data_date is when the office published this version of the record. If a decision depends on today's status, check office_url.

Which USPTO API to Use, If Any

  • Official status, or a file-wrapper PDF, for a serial number you already have: the TSDR API.
  • A full offline copy for research: ODP bulk data (TDXF) or the Trademark Case Files Dataset.
  • Search by name from code, JSON, computed deadlines, or more than one office: there is no official USPTO API for this, so use a trademark API such as Signa. Compare the options in Signa vs the USPTO API and the best trademark APIs.

To try the search example against the US register, get a Signa API key at app.signa.so (a free plan is available) and follow the quickstart.

This article is for information only and is not legal advice. Consult a trademark attorney for legal guidance specific to your situation.