Tutorial

Searching USPTO trademarks with an API

Everything below is copy-paste runnable on the free tier — no key, no signup. By the end you'll have fuzzy search, filters, autocomplete, and record lookups working against the live USPTO register.

Last updated July 2026

1. Basic search

Search is one GET request. Typos are handled — “gogle” still finds Google's marks:

curl "https://api.markbase.co/search?q=gogle"

In JavaScript:

const res = await fetch("https://api.markbase.co/search?q=gogle");
const { hits, total_hits, processing_time_ms } = await res.json();

And Python:

import requests

data = requests.get(
    "https://api.markbase.co/search",
    params={"q": "gogle"},
).json()

for mark in data["hits"]:
    print(mark["serial_number"], mark["word_mark"], mark["status_code"])

2. Filter to marks that can actually block you

Dead marks usually don't matter for availability. Filter by USPTO status code (800 is a registered, live mark) and scope to an international class when you care about a specific market:

curl "https://api.markbase.co/search?q=acme&status_code=800&international_code=9"

Class 9 is software and electronics; GET /classes lists all 45 with descriptions if you need a picker in your UI. Date ranges (filing_date_from), owner country and state, sorting, facet counts, and CSV export are all query params on the same endpoint.

3. Autocomplete

/suggest is tuned for as-you-type latency — wire it straight to a search box:

curl "https://api.markbase.co/suggest?q=nik"

4. Full records, timelines, and batches

Once you have a serial number, pull the complete record:

curl "https://api.markbase.co/trademark/72414177"

Its prosecution history as events:

curl "https://api.markbase.co/trademark/72414177/timeline"

Or fetch many records in one round trip:

curl -X POST "https://api.markbase.co/trademark/batch" \
  -H "Content-Type: application/json" \
  -d '{"serial_numbers": ["72414177", "73302505"]}'

5. Owner portfolios and aggregates

Every mark an owner holds:

curl "https://api.markbase.co/owner?name=Nike"

/aggregate returns distributions across status codes, classes, and owner countries for any query — useful for dashboards and market analysis without paginating through everything.

6. Watch your limits

Every response tells you where you stand:

X-RateLimit-Remaining: 29
X-Quota-Limit: 1000
X-Quota-Remaining: 993
X-Quota-Reset: 2026-08-01T00:00:00.000Z
X-Plan: open

Keyless is 1,000 requests/month with 10 results per search; a free account gets 5,000 and 25 results; Launch and Scale raise that to 50k/1M requests and 100/1,000 results. Rate-limit responses come back as HTTP 429 — back off and retry after the window resets.

That's the whole integration

One base URL, JSON in and out, and an OpenAPI spec if you'd rather generate a typed client.

curl "https://api.markbase.co/search?q=your-brand"

Frequently asked questions

Do I need an API key to follow this tutorial?

No. Every request here works with no key at all, on 1,000 requests a month. A free account raises that to 5,000. Paid plans add volume and larger result pages, not different endpoints.

How current is the trademark data?

The index is rebuilt from the USPTO's daily bulk files every day, so records track the official register within about 24 hours.

Is there an OpenAPI spec?

Yes — api.markbase.co/openapi.json, with interactive docs at api.markbase.co/docs. You can generate a typed client for any language from the spec.

Keep reading