Skip to main content
GET
Search Trademarks
Credits: 10 per page. Find marks that resemble a name with q, keep or drop marks by their exact text with text filters and exclusions, and narrow by office, class, status, owner or date. Every request needs q, a text filter, or at least one other filter.
Search changed on September 29, 2026. The old parameters (strategies, match) keep working through December 27, 2026. See the migration guide.

Search by name

q finds marks that look or sound like a name, best match first. To keep only marks whose text matches exactly, such as starts with or contains, use text filters. You can use one or both.

Similarity

q returns marks that resemble it, closest first. similarity chooses how they may resemble it: embedded matches the name as you spell it. A name written as one word does not find the same name split by a hyphen or space inside a longer mark: q=cocacola misses COCA-COLA ZERO, which q=coca-cola finds. Search each spelling (send q as a list), or send mark_text_contains=cocacola without q: an unranked list of marks containing the name, ignoring punctuation and spacing. Adding mark_text_contains to q only narrows the results q found; it does not add the missed marks. A q written only in Cyrillic or Greek letters, such as Кока-Кола, gets look-alike matches of the whole mark only, not look-alike matches with a changed letter. The default is every channel except phonetic, which adds many distant matches. identical always runs. For a more thorough search, turn on all five:
A q of several words generally requires its words to appear in the mark, each as its similarity channels allow, so a mark that shares only some of them is usually missed: q=stone lion capital does not find LION CAPITAL. To widen the search, send q as a list of shorter phrases, such as q=["stone lion","lion capital"], which ranks the marks of each phrase together. A common single word in the list returns many marks that share only that word. When a q of several words returns fewer than 5 rows in all, search_meta.warnings on page 1 carries all_words_required (not when phonetic is among the channels, which also finds marks sharing one sound-alike word), and multi_word_retry_skipped when Signa skipped its second search (one that allows a one-letter difference in each word) because the first took too long. q is plain text, with no operators or wildcards. It takes 2 to 500 characters and up to 22 words. You can also paste an application, registration or international registration number into q, such as 97134218, 79412883 or IR 1939139: the matching records come first, with identifier in match.via. A number in q is a lookup. Unless you set international_registrations, it works like this:
  • A US serial or registration number returns that US record, with its own US status. This includes a US designation of an international registration (a 79-series serial).
  • A labelled international registration number, such as IR 1939139, returns one row for the international registration and its designations (the grouped view).
  • A bare number returns the records it names, one row per record, each shown the way its detail is. Records whose own number is the one you searched come first. For an international registration number, these are the international registration (grain: "mark") and any national record with the same number. Designations that only carry the international registration number follow.
  • A tm_ ID returns that record.
All but the labelled international registration number carry an identifier_lookup warning.

Several names at once

Send q as a list to rank up to 100 names in one search, such as every spelling of a mark you are clearing. Each name runs through the same similarity channels. A mark that resembles several names appears once, ranked by its closest name, and match.terms lists the names that found it.
With lookalike, onyx also finds 0NYX (a zero for the O).
  • Up to 100 names when similarity is only identical and lookalike; with fuzzy, embedded or phonetic (including the default), up to 10 names and 30 words. Over the limit returns 400 (too_big or too_complex).
  • Send long lists with POST: GET URLs are limited to 2 KB. A list is never read as a trademark number.
  • Results are ranked across all names, so a page is not complete per name. A name with no hits on the pages you read is not proof it is clear: page to the end, or search it on its own.
  • A list skips two single-q boosts (similar length, word starts with the name) and the word-by-word fuzzy retry. include=match_details adds each name’s own tier and channels in match.details.terms.
string | string[]
The name to search for, or a list of up to 100 names.
string
default:"identical,fuzzy,embedded,lookalike"
Channels, comma-separated. Requires q.

Filters

Filters narrow a search, with or without q. Every filter must match. Most take comma-separated lists, such as nice_classes=9,42. Not every office publishes every field; List Offices shows coverage per office.

Offices and jurisdictions

There are two ways to filter by place:
  • jurisdictions finds marks that protect a territory, however they were filed. jurisdictions=FR returns French national marks, EU trade marks, and Madrid registrations designating France.
  • offices finds records filed at a specific office. offices=FR returns only what the French office publishes.
Use jurisdictions to see everything that covers a market. Use offices when you need one office’s own register. A country code also matches the regional rights that cover it, but a regional code is matched strictly. jurisdictions=NL returns rights protecting the Netherlands: marks whose territories include NL, EU trade marks and Benelux (BX) rights. jurisdictions=BX returns Benelux rights only and leaves out EU trade marks, even though a EUTM also protects the Benelux. For a Benelux clearance, request jurisdictions=BX,EU, or use Screening, which adds the overlapping regions for you.
string
Territories the mark protects, such as US, EU or FR. List Jurisdictions has every code.
string
Offices the record was filed at, as ST.3 codes such as US, EM or WO. List Offices has every office we cover.
string
default:"protection"
Set to direct to match only rights filed for the exact territory, leaving out regional rights such as EU trade marks.

Classes, goods and services

Filter by Nice class to find marks covering the same kind of goods or services. If you only have a description, Suggest Classifications turns it into classes, for example “running shoes” into class 25.
string
Nice classes, 1 to 45.
string
Words in the goods and services description, such as footwear.

Status

Every office uses its own status codes. Signa maps them all onto one status model, so the same filter works across offices. The office’s own code stays in status.raw.
  • status_primary is the broad status. For marks that are still alive, use active,pending: registered marks and pending applications.
  • status_stage is where the mark is in its lifecycle, such as published or registered.
  • status_reason says why a mark ended, such as refused or expired, and challenge_states lists open challenges, such as opposition_pending.
  • opposition_status=open finds marks that can be opposed right now.
string
active, pending, inactive or unknown.
string
Such as examining, published, registered, abandoned or expired.
string
Such as refused, withdrawn, abandoned, cancelled or expired.
string
Such as opposition_pending, cancellation_pending or appeal_pending.
string
open, not_started, closed or unknown.

Text filters

Text filters keep only marks whose text passes a test. They don’t rank or match similar spellings. Use them alone for a plain list, or with q to narrow a ranked search. Repeat a key to check several values at once, such as a list of spellings: mark_text_is=nike&mark_text_is=mike. Each result lists the values it matched in match.terms. To rank a list of spellings, with look-alike characters and close spellings, send them as a list in q.
Every mark that equals one of three spellings:
Exclusions leave marks out of the results, for example your client’s own marks. A request needs something besides exclusions.
  • Every filter ignores case and accents. All except mark_text_word also ignore punctuation and spacing, so mark_text_contains=cacola matches COCA-COLA.
  • A mark passes when it matches any value of a filter. Commas are part of the value.
  • A filter takes up to 100 values of up to 200 characters. GET URLs are limited to 2 KB, which holds roughly 30 IDs (each trademark_ids_not=tm_... takes 58 characters), so send longer lists with POST, which accepts bodies up to 64 KB: enough for 1,000 trademark_ids.
  • mark_text_contains, mark_text_ends_with and patterns that start with a wildcard need at least 3 characters, and a request can use at most 4 of these values, exclusions included.

Dates

Date filters take a _gte (on or after) or _lt (before) suffix, such as filing_date_gte, with dates as YYYY-MM-DD. Every live US mark in class 9 filed this year:
Each takes _gte and _lt, and also _gt and _lte.

Advanced filters

To find an owner’s or company’s ID, use Search Owners or Search Entities.

Madrid registrations

A Madrid international registration is one filing with WIPO that covers many countries, each called a designation. New to Madrid? Start with the Madrid Protocol guide. international_registrations sets how search returns them:
  • grouped (default): one row per registration, with each country’s status under coverage.
  • expanded: one row per designated country. Use it when you need each country as its own row, for example to filter or count by country.
The same registration, designating the EU, the UK and Japan. Grouped returns one row; expanded repeats the shared fields on a row per country:
Some requests can only be answered per country: aggregations, most sorts, and some filter combinations such as offices with nice_classes. They return expanded rows with an expanded_fallback warning, or a 400 if you set grouped explicitly.
string
default:"grouped"
grouped or expanded.

Sorting

Without sort, results come back in this order:
  • With q: best match first.
  • With text filters only: closest text first. Exact matches lead, then marks that start with the value, then shorter marks.
  • Filters only: newest filing first.
search_meta.order says which order applied.
string
Up to 3 fields, comma-separated. Prefix with - for descending, e.g. -filing_date. Available: filing_date, registration_date, expiry_date, renewal_due_date, publication_date, termination_date, updated_at, mark_text, owner_name, jurisdiction_code. On grouped results, filing_date sorts an IR family by the earliest filing date among its records, which can differ from the filing_date its row shows.

Count results

aggregations counts the matching records by field, for dashboards and filter sidebars. Each Madrid designation counts as its own record.
string
Fields to count, comma-separated: office_code, jurisdiction_code, nice_classes, status_stage, filing_year, mark_feature_type, mark_legal_category, filing_route, right_kind, scope_kind, owner_id, owner_country, entity_id, attorney_id, firm_id. Also owner_count and entity_count for distinct counts.
boolean
default:"false"
Return the counts without results.
string
default:"filtered"
Set to exclude_own_filter for a filter sidebar: each count then ignores its own filter, so with offices=US the office_code counts still show the other offices.

Response options

integer
default:"20"
Results per page, from 1 to 100. Page through results with cursor, as described in Pagination. A search with q reaches at most 10,000 rows; see Search depth.
string
Cursor from the previous page.
boolean
default:"false"
Adds pagination.total_count. Counts stop at 10,000, with total_count_approximate: true when more match.
boolean
default:"false"
A search that times out returns a retryable 503. Set this to get the results found so far instead, marked search_meta.complete: false.
string
Return only these top-level fields, e.g. mark_text,status,owners,match. id and object are always kept. The other fields are left out of each row, although the OpenAPI response schema still lists every field.
string
full_goods_services returns the full goods and services text instead of the first 280 characters. match_details adds match.details to each result: the matched lanes and the ranking factors applied.

POST

POST /v1/trademarks runs the same search with a JSON body, which suits long value lists. The response is the same. q (a string or a list), similarity, territory_match, international_registrations, sort, limit, cursor, fields and include stay at the top level. Lists are JSON arrays, and date ranges become objects: "filing_date": { "gte": "2020-01-01" }.

Response

Each result in data is a trademark with its key facts: mark text, status, office, numbers and dates, classes, owners, and the deadlines Signa computes. For the full record, pass a result’s id to Retrieve Trademark, or up to 100 IDs to Batch Retrieve. The full record adds attorneys, images, the complete goods and services, per-country Madrid details, related marks and where the data came from. Search results also include:
number | null
0 to 100, for ordering only. It is not a likelihood of confusion. Set on results found by resemblance to q, even when sorted, and null for results found only by a trademark number or without q.
object
Why the result matched.
object
On grouped Madrid registrations: each designated territory’s status, plus the designation’s office code, application number and registration number.
object[]
When you filter by jurisdictions: how the mark covers each requested territory, e.g. an EU trade mark matched for FR.
object
How the search ran.
object
Counts per field, when requested.

Match tiers

match.tier groups results by how closely they match q, which helps you triage a long list. Tiers describe how a mark was found, not a legal conclusion.