Documentation Index Fetch the complete documentation index at: https://docs.signa.so/llms.txt
Use this file to discover all available pages before exploring further.
The canonical endpoint for discovering trademarks. Pass a text query to search by brand name with relevance ranking, or use filters to browse by office, status, class, date, and more. Every request must include at least one filter or a text query (q).
Query Parameters
Search query text (1-500 characters). When provided, results are ranked by relevance using multi-strategy matching (exact + fuzzy by default). Optional — omit for filter-only browsing.
strategies
string
default: "exact,fuzzy"
Search strategies to apply when q is provided, comma-separated. Any combination of exact, fuzzy, phonetic, prefix. Defaults to exact,fuzzy for fast results. Use exact,phonetic,fuzzy,prefix for comprehensive trademark clearance searches.
Results per page (1-100).
Opaque pagination cursor from a previous response.
When true, includes an accurate total count in pagination.total_count.
When true, includes highlight snippets for mark_text and owner_names fields.
Filters
All filter parameters are accepted at the top level of the query string. Arrays use comma-separated values. Date ranges use _gte and _lt suffixes.
Office codes, comma-separated (e.g. ?offices=uspto,euipo).
ISO jurisdiction codes, comma-separated (e.g. ?jurisdictions=US,EU).
Nice classification numbers 1-45, comma-separated (e.g. ?nice_classes=9,42).
Primary status: active, pending, inactive, unknown. Comma-separated for multiple.
Status stage, comma-separated (e.g. registered, published, examining).
Mark type: word, figurative, combined, three_dimensional.
Filing route: direct_national, madrid_designation, direct_regional.
Owner name substring match.
Filing date lower bound (YYYY-MM-DD).
Filing date upper bound (exclusive).
Registration date lower bound.
Registration date upper bound.
true to require at least one image.
true to restrict to Madrid Protocol filings.
Parameter Type Description officestring Single office code shortcut vienna_codesstring Vienna figurative codes, comma-separated status_reasonstring Status reason codes, comma-separated challenge_statesstring Active challenge states, comma-separated mark_legal_categorystring standard, certification, collectiveright_kindstring Right kind (e.g. trademark) scope_kindstring Territorial scope kind, comma-separated owner_countrystring Two-letter owner country code goods_services_textstring Free-text search in G&S descriptions application_numberstring Exact application number (requires office) registration_numberstring Exact registration number (requires office) ir_numberstring Madrid International Registration number origin_office_codestring Origin office code for Madrid filings renewal_due_date_gtestring Renewal due date lower bound renewal_due_date_ltstring Renewal due date upper bound publication_date_gtestring Publication date lower bound publication_date_ltstring Publication date upper bound termination_date_gtestring Termination date lower bound termination_date_ltstring Termination date upper bound updated_at_gtestring Record updated-at lower bound. Accepts YYYY-MM-DD (coerced to start of day UTC) or full ISO 8601 datetime (e.g. 2024-01-15T00:00:00Z). updated_at_ltstring Record updated-at upper bound. Accepts YYYY-MM-DD or full ISO 8601 datetime. has_proceedingsboolean true to require at least one proceedingis_retractedboolean true to restrict to retracted marksis_series_markboolean true to restrict to series marksrenewal_due_beforestring Alias for renewal_due_date_lt
Examples
cURL — search by name
cURL — filter by office and class
cURL — clearance search (all strategies)
Python
TypeScript (SDK)
curl -G "https://api.signa.so/v1/trademarks" \
-H "Authorization: Bearer $SIGNA_API_KEY " \
--data-urlencode "q=nike" \
--data-urlencode "offices=uspto"
Response
{
"object" : "list" ,
"data" : [
{
"id" : "tm_abc123" ,
"object" : "trademark" ,
"mark_text" : "NIKE" ,
"relevance_score" : 95 ,
"match_explanation" : {
"strategies_matched" : [ "exact" ],
"boost_factors" : [
{ "factor" : "status_active" , "weight" : 1.2 }
]
},
"primary_image_url" : null ,
"status" : { "primary" : "active" , "stage" : "registered" },
"office_code" : "uspto" ,
"jurisdiction_code" : "US" ,
"filing_date" : "1971-02-04" ,
"registration_date" : "1974-04-16" ,
"classifications" : [
{ "nice_class" : 25 , "goods_services_text" : "Clothing, footwear, headgear" }
],
"owner_name" : "Nike, Inc."
}
],
"has_more" : true ,
"pagination" : {
"cursor" : "eyJpZCI6ImFiYyJ9" ,
"total_count" : 142 ,
"total_count_approximate" : false
},
"search_meta" : {
"search_id" : "srch_abc123" ,
"query" : "nike" ,
"strategies_used" : [ "exact" , "fuzzy" ],
"total_results" : 142 ,
"total_count_exact" : true ,
"total_count_approximate" : false ,
"execution_time_ms" : 15
},
"aggregations" : {},
"request_id" : "req_xyz789"
}
Trademark summary records — the slimmer list shape with the fields most useful for result cards. See
Get Trademark for the full record shape returned by single-record lookups.
Whether more results are available.
Pass this as ?cursor= to get the next page.
Total matches. Only present when include_total=true. Canonical location — read this field across every list endpoint.
Emitted alongside total_count. false when the count is exact; true when OpenSearch capped the count at 10,000 for a deep search.
Query metadata: search_id, query, strategies_used, execution_time_ms. Unique search identifier.
search_meta.strategies_used
Search strategies that were applied.
search_meta.total_results
Deprecated — use pagination.total_count instead. Will be removed in v1.1. Total matching results (same as pagination.total_count when include_total is true).
search_meta.total_count_exact
Deprecated — use pagination.total_count_approximate (inverse of this flag) instead. Will be removed in v1.1. Whether the total count is exact.
search_meta.total_count_approximate
Deprecated — use pagination.total_count_approximate instead. Will be removed in v1.1. Whether the total count is approximate.
search_meta.execution_time_ms
Query execution time in milliseconds.
Empty object {} on GET requests. Populated with faceted counts on POST when options.aggregations is provided.
Normalized relevance score. Present when q is provided, null for filter-only queries or when sort is specified.
Explains relevance scoring. Omitted when sort is specified. Show match_explanation fields
match_explanation.strategies_matched
Array of strategy names that matched (e.g. ["exact", "fuzzy"]).
match_explanation.boost_factors
Array of {factor, weight} objects describing score adjustments.
URL to the primary trademark image. Format: https://api.signa.so/v1/trademarks/{id}/media/{media_id}. Only present when has_media is true, null otherwise.
Sort
By default, results are ranked by relevance when q is provided. For filter-only queries (no q), results are returned in index order (fast, unordered).
To explicitly sort results, use the sort parameter:
?sort=-filing_date # newest filings first
?sort=expiry_date # earliest expiry first
?sort=-filing_date,office_code # multi-field (max 3)
Available sort fields: filing_date, registration_date, expiry_date, renewal_due_date, updated_at, publication_date, termination_date, office_code, jurisdiction_code.
When sort is specified alongside q, relevance scoring is bypassed — results are ordered purely by the sort field(s) and relevance_score will be null.
Errors
Status Type When 400 validation_errorNo filter or query supplied, invalid date range, unknown sort field 401 unauthorizedMissing or invalid API key 429 rate_limitedRate limit exceeded (details )
Advanced: POST with JSON body
For complex queries with aggregations or long filter lists, use POST /v1/trademarks with a JSON body. This accepts the same filters and returns the same response shape.
The Idempotency-Key header is recommended for POST requests (for safe retries and caching) but not required. GET does not need one.
POST-only features
options.aggregations — an array of field names to aggregate. Returns faceted counts for building filter UIs. Valid values: status_stage, office_code, jurisdiction_code, nice_classes, filing_year, mark_feature_type, mark_legal_category, filing_route, right_kind, scope_kind.
options.aggregations_only — return only counts, skip result documents
POST example
curl -X POST "https://api.signa.so/v1/trademarks" \
-H "Authorization: Bearer $SIGNA_API_KEY " \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-search-1" \
-d '{
"query": "nova",
"strategies": ["exact", "phonetic", "fuzzy", "prefix"],
"filters": {
"offices": ["uspto", "euipo"],
"nice_classes": [9, 42],
"status_stage": ["registered"],
"filing_date": { "gte": "2020-01-01" }
},
"options": {
"aggregations": ["office_code", "nice_classes", "status_stage"]
},
"limit": 20
}'
Show Full POST body reference
Field Type Description querystring Search query text (1-500 chars). Optional. sortstring Sort field(s), same as GET sort parameter. strategiesstring[] Search strategies. Default: ["exact", "fuzzy"]. filtersobject Same filters as GET, nested in an object. Arrays use JSON arrays, dates use {"gte": "...", "lt": "..."}. options.aggregationsstring[] Faceted counts: status_stage, office_code, jurisdiction_code, nice_classes, filing_year, mark_feature_type, mark_legal_category, filing_route, right_kind, scope_kind. options.aggregations_onlyboolean Return only counts, no documents. Default: false. options.include_totalboolean Include accurate total count. Default: false. options.highlightsboolean Include highlight snippets. Default: false. limitinteger Results per page (0-100). Default: 20. cursorstring Pagination cursor from previous response.