← Back to docs

How to search USPTO trademarks programmatically

The USPTO publishes its trademark corpus as weekly XML bulk files — hundreds of megabytes of nested records with dozens of status, classification, and owner fields. It's the authoritative source, but parsing it yourself means writing an XML pipeline, a storage layer, and a query engine before you can ask your first question.

Folio ingests those bulk files and exposes a single JSON endpoint that takes the filters you actually want — owner name, mark text, serial number, international class, filing date range — and returns a paginated result set with a data_freshness timestamp telling you the latest transaction date reflected in the corpus.

The 10-second version

Find trademarks owned by a specific company:

curl -H "X-API-Key: fo_live_..." \
  "https://folioapi.com/v1/trademarks/search?owner_name=Acme+Corp&status_alive_only=true"
{
  "results": [
    {
      "serial_number": "97123456",
      "mark_text": "ACME",
      "status_code": "700",
      "filing_date": "20230615",
      "transaction_date": "20260210",
      "owners": ["ACME CORPORATION"],
      "classifications": ["009", "042"]
    }
  ],
  "total": 14,
  "limit": 50,
  "offset": 0,
  "data_freshness": "20260410"
}

Filter reference

At least one of owner_name, mark_name, or serial_number is required. The rest are optional and combine with AND semantics.

Common query patterns

Watching a competitor's new filings

Get every trademark an owner has filed in the last 90 days, live status only:

curl -H "X-API-Key: fo_live_..." \
  "https://folioapi.com/v1/trademarks/search?owner_name=CompetitorCo&status_alive_only=true&filing_date_from=2026-01-12&limit=100"

Poll this daily, diff against yesterday's result set, and you have a feed of new filings from a specific owner. Useful for product teams tracking a competitor's trademark activity before launches.

Filings in a specific class

All pharmaceutical trademarks (class 005) filed in Q1 2026:

curl -H "X-API-Key: fo_live_..." \
  "https://folioapi.com/v1/trademarks/search?intl_class=005&filing_date_from=20260101&filing_date_to=20260331&limit=100"

Checking whether a name is already taken

Before launching a product, sweep the mark text across all live trademarks:

curl -H "X-API-Key: fo_live_..." \
  "https://folioapi.com/v1/trademarks/search?mark_name=MyProductName&status_alive_only=true"

Substring matching here is helpful — it catches variants and typos in other filings. (This is not legal advice; a proper clearance still needs a trademark attorney, but the first-pass signal is a query away.)

A note on date formats

USPTO dates in responses are YYYYMMDD strings — that's the native format in the bulk corpus, and Folio preserves it verbatim rather than translating to ISO 8601. For query parameters, Folio accepts both YYYY-MM-DD and YYYYMMDD. If you're doing date math, parse the response date accordingly.

Data freshness

Every trademark response includes a data_freshness field with the most recent transaction_date observed in the corpus. Folio refreshes from the USPTO bulk files on a rolling schedule, so expect this to be within a week of the current date. If you need the second-by-second status of a single serial number, the source-of-truth is the USPTO's own TSDR system — but for searching, filtering, and monitoring, the bulk-file corpus Folio serves is what you want.

Next steps