The register is public. It isn’t friendly.
Every trademark the USPTO has ever granted is free to download — filings going back to 1823, refreshed daily. What they don’t give you is a way to ask it questions. The official interface is a query language built for lawyers and a portal built for forms.
So the data sits there in bulk XML dumps: gigabytes per day of filings, serial numbers, owner addresses, Nice classes, status events. Fourteen million records deep and growing by the hour.

A pipeline that runs itself
Every night a Rust job pulls the day’s bulk feed from the USPTO, normalizes each filing into a document, and pushes it into a Meilisearch index. Rust earns its keep here — the dumps are huge and the parsing is unglamorous, so we wanted it fast, boring, and done before anyone wakes up.
The index watches itself. Freshness is measured by the last successful write, not by whether the job reported success — a run that fails silently and a run that never fires both leave stale data, and only the index knows the difference. When it drifts past thirty hours, the system emails us. Nobody has to check.
Three questions, twelve endpoints
Everything a developer actually wants from a trademark database collapses into three questions: does something similar exist, is mine safe, and what does the register look like as a shape. The API is a Hono service on Bun that answers exactly those — typo-tolerant search and autocomplete, clearance scoring with risk bands, and register-wide aggregates — in plain JSON over twelve GET endpoints.
No OAuth dance, no SDK required. The first tier doesn’t even need a key: a thousand requests a month, metered by IP. We learned that one the hard way — anonymous callers used to bypass the cap until one address pulled six hundred thousand requests in a month.

Metering is the product
The thing we got right early was metering monthly quotas, not per-minute rates. Per-minute billing sounds fair and quietly makes your cheapest plan more generous than competitors’ most expensive one. The monthly number is what a customer is buying; the burst limit is just a seatbelt.
Every response carries its quota headers — X-Quota-Remaining, reset window, plan name — so an integration can see its own economics without a dashboard. Keys are a single line: mb_, a plan, and two override columns that have grandfathered exactly one friendly customer.
Where it sits now
Markbase runs on our own Kubernetes cluster behind Nginx, deployed by ArgoCD the moment a push lands. The docs are a themed Scalar instance, the typed SDK and the MCP server publish to npm on their own via trusted publishing, and the nightly dump means the data is always today’s.
It’s the kind of product we like most: a dull, reliable edge around a genuinely interesting problem. The register was always free. Now it’s also usable — try it, no key needed, at markbase.co.