Skip to main content
You are preparing to launch a new brand called “Vyntra” for a line of cloud security software. Before investing in branding and legal filings, you need to determine whether the name is available across your target markets (US, EU, and Canada) in Nice classes 9 and 42. This guide walks through a first-pass clearance workflow using the Signa API, from initial search to conflict analysis. It is a search-based screen of registered and pending marks, not a substitute for a clearance opinion from trademark counsel. For a scored conflict check of a proposed mark against its goods and services, also run it through screening.

Prerequisites

  • A Signa API key with trademarks:read scope
  • Your target brand name, jurisdictions, and Nice classes

1

Run a knockout search

Start with a fast knockout. It runs q through the identical, fuzzy, and embedded channels, which is what Presets.knockout holds in the SDK. It catches the same name after folding case and punctuation, spelling edits like “Vintra”, and marks that contain the term, like “VYNTRA CLOUD”.
An identical or near_identical hit on a live mark in your classes is often enough to drop the name. If the knockout is clean, run the full search.
2

Run a full similarity search across jurisdictions

The full search adds the phonetic and lookalike channels, which is what Presets.clearance holds. Phonetic matching catches sound-alikes that spelling edits miss, for example “Wyntra”. Lookalike matching catches character substitutions, such as a zero for an O or a Cyrillic letter that looks Latin.
Expected output:
Use jurisdictions (where a right protects), not offices (which register a record came from), for clearance. jurisdictions=EU covers EU trade marks and IRs designating the EU, and jurisdictions=CA covers IRs designating Canada as well as CIPO filings. Requesting aggregations serves the search one row per record (expanded), so the counts above count records, not marks, and search_meta.warnings[] says so. Without aggregations, jurisdictions with nice_classes returns one row per mark. See Filters and grouped results.
Clearing the Benelux takes two codes. jurisdictions=NL matches everything that protects the Netherlands, including EU trade marks and Benelux rights. jurisdictions=BX matches Benelux rights only and leaves out EU trade marks, even though a EUTM protects the Benelux. Request ["BX", "EU"] together, or run the name through Screening, which adds the overlapping regions and reports coverage per region.
match tells you why each result matched. match.tier is the closest similarity category the hit reached: identical, near_identical, similar, or related. match.via lists the channels that found it. VENTRA above is one letter away from VYNTRA and sounds alike, so it arrives as near_identical via fuzzy and phonetic. See Match tiers.
relevance_score (0 to 100) orders the results. It is not a likelihood of confusion. Use match.tier, the classes, and the status to judge risk. See Response.
3

Exclude your client's own marks

When you clear a name for a client that already holds marks, remove them from the results. entity_id_not drops every mark whose owner is linked to that entity. Exclusions narrow the results and never change the ranking.
owner_id_not excludes single owner records, entity_group_not excludes a whole corporate family, and trademark_ids_not excludes specific marks. On POST, send them under exclude ("exclude": { "entity_id": ["ent_4mRt8vQa"] }). See Exclusions.
4

Check the spelling variants you plan to file

If the brand team has shortlisted variants, check each one’s exact text with the mark_text_is filter. On GET, repeat the key once per value. Values are never split on commas, because commas are legal in marks. mark_text_is ignores case, accents, punctuation, spacing, and trademark notices, so VYNTRA also matches “Vyntra™”.
Text filters are deterministic and do not score. Without q, the results come in text order and relevance_score is null. match.terms lists the values each mark satisfied. Combined with q, text filters narrow the ranked results instead. See Text filters.
5

Triage results by risk level

Use match.tier, match.via, the classes, and the status to categorize matches:Filter the full search results to isolate high-risk conflicts:
TypeScript
6

Pull full details on each conflict

For every high-risk match, fetch the detail tier to see classifications, owners, attorneys, and prosecution history.
Expected output (per mark):
Pay close attention to the goods_services_text in each classification. Two marks in the same Nice class can coexist if their goods and services descriptions do not overlap. “Payment processing software” and “cybersecurity software” are both Class 9 but serve different markets.
7

Review the owner's full portfolio

Understanding the conflicting owner’s portfolio reveals how aggressively they protect their brand and whether they operate in adjacent spaces.
Expected output:
A high grant_rate (above 80%) and broad jurisdiction coverage suggest an owner with an active legal team. They are more likely to oppose a confusingly similar filing.
8

Check for proceedings history

See whether the conflicting mark has been involved in oppositions or cancellations. This tells you how actively the owner enforces their rights.
Expected output:
An owner who has successfully opposed similar marks in the past poses a higher risk. In this example, Cubic already won an opposition against another “Ventra”-variant mark, strong evidence they would oppose “Vyntra” too.
9

Compile a clearance summary

Bring together all findings into a structured report. Repeat the opposition lookup from the previous step for each distinct conflict owner, then fold the count into the risk assessment:

Watch for new conflicts

Rather than re-running this search on a schedule, create a watch scoped to the same query and register a webhook. Signa then evaluates every data update against the watch and pushes an alert the moment a conflicting mark is filed, instead of you polling for one. If you would rather pull results yourself, keep the POST /v1/trademarks body in version control and re-run it on your own schedule, narrowing to filing_date so each call only returns conflicts filed since the last run. filing_date is a leg-level filter, so combined with the other filters it serves the search one row per record (expanded):
TypeScript
Persist the timestamp of your last successful run. On the next invocation, pass it as filing_date.gte so the API only returns marks filed since then.

What’s next

Opposition Tracking

Monitor TTAB proceedings if a conflict owner files an opposition against your application.

Competitor Intelligence

Track competing owners to catch new filings in your space before they publish.