Skip to main content
Signa returns trademark data at three detail levels. Choose the right tier to balance payload size, latency, and the information you need.

Overview

The response tier is fixed per endpoint — there is no tier query parameter. Each endpoint always returns a specific tier based on its use case.
TierFieldsTypical SizeLatency
Compact5 fields~100 bytesFastest
Summary22 fields~500 bytesFast
DetailAll fields + nested arrays2—10 KBSlower
You do not need to specify a tier. Each endpoint returns the appropriate level of detail automatically: detail for single-record lookups, summary for list and search results, and compact for suggest/autocomplete.

When to Use Each Tier

EndpointTierWhat You Get
GET /v1/trademarks/{id}DetailFull record with all nested entities
POST /v1/trademarks/batchDetailFull records for each ID
GET /v1/trademarks (list)SummaryStatus, dates, owner, Nice classes
POST /v1/trademarks/searchSummarySearch results with relevance scores
GET /v1/owners/{id}/trademarksSummaryOwner portfolio listing
POST /v1/trademarks/suggestCompactAutocomplete with minimal payload

Compact Tier

The minimal representation. Used by suggest endpoints and inline cross-references. 5 fields:
FieldTypeDescription
idstringPrefixed trademark ID (e.g., tm_7d4e1f2a)
objectstringAlways "trademark"
mark_textstring | nullThe word mark as filed (null for pure design marks)
office_codestringOffice that processed the mark (e.g., "uspto")
status_stagestringCurrent lifecycle stage (e.g., "registered")
{
  "id": "tm_7d4e1f2a3b8c9d0e",
  "object": "trademark",
  "mark_text": "SIGNA",
  "office_code": "uspto",
  "status_stage": "registered"
}

Summary Tier

The default for list and search endpoints. Enough information to render a useful search result or table row without fetching the full record. 22 fields:
FieldTypeDescription
idstringPrefixed trademark ID
objectstringAlways "trademark"
mark_textstring | nullWord mark as filed
mark_feature_typestringVisual form: word, figurative, combined, etc.
mark_legal_categorystringLegal type: standard, certification, collective, etc.
right_kindstringIP right category: trademark, trade_name, geographical_indication, etc.
statusobject{ primary, stage, reason, challenges }
office_codestringOffice code (e.g., "euipo")
jurisdiction_codestringJurisdiction (e.g., "EU")
scope_kindstringnational, regional, or international_registration
filing_routestringHow filed: direct_national, madrid_ir, madrid_designation, etc.
application_numberstring | nullOffice application number
registration_numberstring | nullOffice registration number
filing_datestringISO date
registration_datestring | nullISO date
expiry_datestring | nullISO date
renewal_due_datestring | nullISO date — the key actionable date
nice_classesinteger[]Nice class numbers (e.g., [9, 42])
owner_namestring | nullPrimary owner name
has_mediabooleanWhether mark images exist
updated_atstringISO timestamp of last update
{
  "id": "tm_7d4e1f2a3b8c9d0e",
  "object": "trademark",
  "mark_text": "SIGNA",
  "mark_feature_type": "word",
  "mark_legal_category": "standard",
  "right_kind": "trademark",
  "status": {
    "primary": "active",
    "stage": "registered",
    "reason": null,
    "challenges": []
  },
  "office_code": "uspto",
  "jurisdiction_code": "US",
  "scope_kind": "national",
  "filing_route": "direct_national",
  "application_number": "97123456",
  "registration_number": "6789012",
  "filing_date": "2024-03-15",
  "registration_date": "2025-01-20",
  "expiry_date": "2035-01-20",
  "renewal_due_date": "2035-01-20",
  "nice_classes": [9, 42],
  "owner_name": "Signa Technologies Inc.",
  "has_media": true,
  "updated_at": "2026-03-18T04:00:00Z"
}

Detail Tier

The complete record. Includes everything in the summary tier plus all nested child entities, computed deadlines, and data freshness metadata. Additional fields beyond summary:
FieldTypeDescription
mark_text_languagestring | nullISO 639-1 language code
mark_text_scriptstring | nullISO 15924 script code
is_series_markbooleanWhether this is a series mark (AU/NZ/UK/IE)
series_countinteger | nullNumber of marks in the series
status.effective_datestring | nullWhen the current status took effect
status.sourcestringHow status was determined: explicit, event_derived, dispatch_derived, computed
status.raw_codestring | nullOffice’s original status code
status.raw_labelstring | nullOffice’s original status text
source_primary_idstringOffice’s own identifier
origin_office_codestring | nullOffice of origin for Madrid marks
ir_numberstring | nullInternational registration number
expiry_date_basisstringreported, derived, or unknown
publication_datestring | nullDate of official publication
priority_datestring | nullEarliest priority claim date
termination_datestring | nullDate mark was terminated
protection_effective_datestring | nullWhen protection started (Madrid)
designation_datestring | nullWhen designation was filed (Madrid)
dependency_period_end_datestring | nullMadrid dependency period end
transformation_deadline_datestring | nullMadrid transformation deadline
is_retractedbooleanWhether the office retracted this record
owners[]arrayFull owner objects with ID, name, country, entity type, role
attorneys[]arrayAttorney objects with ID, name, firm ID, firm name, role
classifications[]arrayFull Nice classification with goods/services text
design_codes[]arrayVienna classification codes
text_variants[]arrayTranslations and transliterations
statements[]arrayDisclaimers and descriptions of mark
media[]arrayMark images with URLs and metadata
priority_claims[]arrayParis Convention priority claims
filing_bases[]arrayUS filing bases (Section 1(a), 1(b), etc.)
publications[]arrayPublication history with opposition windows
office_extensionsobjectOffice-specific data that does not fit the canonical model
deadlines[]arrayComputed deadlines with urgency and grace periods
events_countintegerTotal number of history events
proceedings_countintegerTotal number of proceedings
coverage_countintegerNumber of coverage records
relationships_countintegerNumber of related marks
data_freshnessobject{ source_data_date, source_format, last_updated_at }
created_atstringWhen Signa first ingested this record
Unbounded child entities (events, proceedings) are returned as counts only in the detail tier. Use the sub-resource endpoints (e.g., GET /v1/trademarks/{id}/events) to paginate through the full data.

Code Examples

Fetching a Single Trademark

# Single trademark (returns detail tier)
curl -H "Authorization: Bearer sig_live_xxx" \
  "https://api.signa.so/v1/trademarks/tm_7d4e1f2a"

# List trademarks (returns summary tier)
curl -H "Authorization: Bearer sig_live_xxx" \
  "https://api.signa.so/v1/trademarks?limit=100"

Listing Trademarks (Summary Tier)

List endpoints return summary-tier data, which includes status, dates, owner, Nice classes, and more.
curl -H "Authorization: Bearer sig_live_xxx" \
  "https://api.signa.so/v1/trademarks?owner_id=own_abc123&limit=100"

Search Results (Summary Tier)

Search always returns the summary tier, which provides enough context for displaying results.
curl -X POST \
  -H "Authorization: Bearer sig_live_xxx" \
  -H "Content-Type: application/json" \
  "https://api.signa.so/v1/trademarks/search" \
  -d '{
    "query": "signa",
    "filters": {
      "offices": ["uspto", "euipo"],
      "nice_classes": [9, 42]
    }
  }'

Performance Guidance

Payload Size

The tier you choose directly affects payload size. For a list of 100 trademarks:
TierApprox. PayloadRelative Size
Compact~10 KB1x
Summary~50 KB5x
Detail~500 KB — 1 MB50—100x

Best Practices

The summary tier is designed to provide everything a typical search result card or table row needs: mark text, status, owner, jurisdiction, dates, and Nice classes. List and search endpoints always return this tier.
The detail tier includes nested arrays (classifications with full goods/services text, events counts, deadlines, filing bases, media) that increase both payload size and server-side query complexity. It is returned by GET /v1/trademarks/{id} and POST /v1/trademarks/batch.
Detail-tier responses include ETags. Use If-None-Match headers to avoid re-transferring unchanged records:
# First request
GET /v1/trademarks/tm_abc
# Response includes: ETag: "v12-1710732000"

# Subsequent request
GET /v1/trademarks/tm_abc
If-None-Match: "v12-1710732000"
# Returns 304 Not Modified if unchanged
Do not call GET /v1/trademarks/{id} in a loop for large lists. Instead, use the list endpoint for summary data, identify the marks you need, and then use the batch endpoint to fetch up to 100 detail records at once.