GET /v1/trademarks searches every available register with structured filters and returns a list of summaries.
How filters combine
- Different parameters are combined with AND.
jurisdiction=AD&status=registeredreturns registered marks in Andorra. - Several values of one parameter are combined with OR. Repeat the parameter (
status=registered&status=pending) or, for codes, enumerations and classes, separate values with commas (status=registered,pending). - A name filter and its key twin are one filter.
owner_nameandowner_key(likewiseprimary_owner_*,representative_*andprevious_owner_*) are two spellings of the same filter, so their values are combined with OR, up to 20 together. - At least one filter is required.
jurisdictioncounts, sojurisdiction=ADalone lists the whole Andorran register. A request with onlysort,limitor other control parameters gets 400 with the error codemissing-filter. - No
jurisdictionmeans every available register. Registers that are reloading are skipped and listed inunavailable_jurisdictions. - Unknown parameters are rejected, not ignored. A misspelt filter gets 400 with a did-you-mean hint, so a typo never silently widens your search.
Choosing filters
Anchored and broad searches
Some filters identify a small set of records directly. These are anchor filters: every number filter, every name and key filter, and every phrase filter. A search with at least one anchor is anchored:- it reads only the matching records, so it is fast at any depth;
- it can sort by registration date or expiry date;
- it can report an exact total.
jurisdiction=US&status=registered&nice_class=25) is broad. It scans the selected registers by application date, a window at a time, and returns what each window contains. Broad searches always work, but:
- a page can be short, or even empty, while
has_moreis stilltrue. Keep followingnext_cursor; empty continuation pages are not billed; - the response includes
search_progress.application_date_reached, the application date the scan has reached. It isnullonce the scan has moved past dated records to those without a usable application date; - a broad search that examines a very large part of the corpus and finds almost nothing (fewer than 100 matches after about 100 million records examined) stops with 422
query-too-broad.
jurisdiction and the date range whenever you can.
Parameters
Number and identifier anchors
Numbers are matched exactly in three forms: as you send them, upper-cased, and upper-cased with spaces removed. Letter case and extra spaces do not matter, but send the office’s own spacing and punctuation (
VA 2026 00923, AL/T/2026/001305). See Identifiers.
Name anchors
*_name values are normalized like stored names; *_key values are compared verbatim. A name parameter and its *_key twin are one filter: a record matches if it matches any of their values. See Parties and name keys.
Phrase anchors
A phrase must contain at least one letter or digit. See Text matching for how words and Chinese characters are matched.
goods_services_phrase is reserved: it returns 400 with the error code not-yet-available in v1.
Scope and record filters
none matches records where the office stated no value; other matches values without a mapping. See Status.
Classification
Dates
Every date has a range pair,<field>_date_from and <field>_date_to, inclusive, in YYYY-MM-DD format:
application_date_*, registration_date_*, publication_date_*, expiry_date_*, renewal_date_*, termination_date_*, opposition_period_end_date_* and status_date_*.
Either bound may be left out. from must not be after to. See Dates.
Paging and output
When you send
cursor, send the same filters and sort again. Only limit, include and include_total may change between pages. See Pagination.
Sorting
Records with no usable date for the sort field come last in both directions. Ties are broken by jurisdiction and id, so the order is stable. There is no sort by
updated_at; use the changes feed.
Totals
Addinclude_total=true to get a count with the first page:
"relation": "eq": the exact number of matches. Anchored searches return exact totals, and so do searches by jurisdiction alone, jurisdiction plus status or status category, and whole application years."relation": "gte": at leastvaluematches; counting stopped early. Broad searches with other filters are counted up to about 10,000."total": null: counting did not finish in time. The page itself is still complete.
Full records in results
include=full returns full trademark objects in data, with limit of at most 25. It saves a round trip when you need every record in full, for example when you copy a small register. When you need full records for only some results, fetch them with batch retrieve, which takes 100 ids per call.
Concurrency
Run at most two searches at the same time per key. A third concurrent search waits up to a second for a free slot, then gets 429rate-limited with "violated_policies": ["concurrency"].
When a search is refused
All problems with a request are reported together, in one 400 response:
Other refusals:
Renamed parameters
If you used Pinakel’s earlier record API, three parameters were renamed, and the error hint names the new one:mark_name is now mark_text, kind_of_mark is now mark_kind, and expand is now include. Substring filters (*_contains, *_startswith) have no v1 equivalent; use the phrase filters.