> ## 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.

# Retrieve Trademark

> Retrieve a single trademark by ID

## Overview

Returns the full detail-tier representation of a single trademark: identification, status, filing and key dates, owners, attorneys, classifications, computed deadlines, media, and Madrid enrichment when applicable. All bounded children (owners, attorneys, classifications, media, etc.) are inlined. Unbounded children (events, proceedings, coverage, relationships) appear as counts only; fetch them from their own sub-resource endpoints.

## Path Parameters

<ParamField path="id" type="string" required default="tm_8kLm2nPq">
  Trademark ID (e.g., `tm_8kLm2nPq`)
</ParamField>

## Query Parameters

<ParamField query="include" type="string">
  Comma-separated optional detail projections. `office_extensions` includes the `office_extensions` object (raw office-specific data), which is otherwise omitted.
</ParamField>

<ParamField query="fields" type="string">
  Sparse top-level field projection, comma-separated (e.g. `?fields=mark_text,status,owners`). `id` and `object` are always retained. Unknown field names, or nested paths like `status.primary`, return `400`.
</ParamField>

<ParamField query="language" type="string">
  Preferred goods/services language for `classifications[]` rows, applied only to records that carry per-language variants (direct and Madrid designation records; 2-3 letters with optional 2-letter region, e.g. `en`, `eng`, or `en-US`). When multiple language variants exist for the same Nice class, Signa returns the requested language if present; groups without the requested language — and IR-parent rollup classifications, which have no per-language variants — keep all rows in default classification order.
</ParamField>

<Note>
  The `ETag` on this response varies with the requested projection and language: a request with `?include=`, `?fields=`, and/or `?language=` gets a different validator than the plain request, so a cached full response never `304`s a different representation.
</Note>

## Response

Returns the full detail-tier representation of a trademark, including all bounded children
(owners, attorneys, classifications, etc.) inline. Unbounded children (events, proceedings)
appear as counts only. Maintenance deadlines and opposition windows are computed at read time
from the normalized record and rule registry.

<ResponseField name="id" type="string">Prefixed trademark ID (`tm_*`)</ResponseField>
<ResponseField name="object" type="string">Always `"trademark"`</ResponseField>

<Expandable title="Mark identification">
  <ResponseField name="mark_text" type="string | null">Word mark as filed (null for design-only marks)</ResponseField>
  <ResponseField name="mark_text_language" type="string | null">ISO 639-1 language code of the mark text</ResponseField>
  <ResponseField name="mark_text_script" type="string | null">ISO 15924 script code</ResponseField>
  <ResponseField name="mark_feature_type" type="string | null">Mark feature type (e.g., `word`, `figurative`, `combined`)</ResponseField>
  <ResponseField name="mark_legal_category" type="string | null">Legal category (e.g., `standard`, `certification`, `collective`)</ResponseField>
  <ResponseField name="right_kind" type="string">Right kind (`trademark`, `trade_name`, `geographical_indication`, etc.)</ResponseField>
  <ResponseField name="is_series_mark" type="boolean | null">Whether the mark is a series mark</ResponseField>
  <ResponseField name="series_count" type="integer | null">Number of marks in the series</ResponseField>
</Expandable>

<Expandable title="Status">
  <ResponseField name="status" type="object">
    <Expandable title="Status object">
      <ResponseField name="primary" type="string">Primary status: `active`, `pending`, `inactive`, `unknown`</ResponseField>
      <ResponseField name="stage" type="string">Lifecycle stage: `filed`, `examined`, `published`, `registered`, `renewed`, `abandoned`, `cancelled`, `expired`</ResponseField>
      <ResponseField name="reason" type="string | null">Reason for current status (e.g., `section_8_accepted`)</ResponseField>
      <ResponseField name="challenges" type="string[]">Active challenge states (e.g., `opposition_pending`, `cancellation_pending`)</ResponseField>
      <ResponseField name="effective_date" type="string | null">ISO date when this status became effective</ResponseField>
      <ResponseField name="source" type="string">How the status was determined: `explicit` (the office reported it directly), `event_derived` (derived from the prosecution event timeline), `dispatch_derived` (derived from a bulk data dispatch), or `computed` (the mark spans a mixed-status family and Signa computed a representative status)</ResponseField>
      <ResponseField name="raw_code" type="string | null">Office-native status code (e.g., `800`)</ResponseField>
      <ResponseField name="raw_label" type="string | null">Office-native status label (e.g., `Registered and renewed`)</ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

<Expandable title="Office and filing">
  <ResponseField name="office_code" type="string | null">Uppercase ST.3 office code (e.g., `US`, `EM`). Null if the stored office identifier cannot be resolved (fail-closed — internal codes are never leaked).</ResponseField>
  <ResponseField name="jurisdiction_code" type="string">ISO 2-letter jurisdiction (e.g., `US`, `EU`)</ResponseField>
  <ResponseField name="filing_route" type="string">Filing route (`direct_national`, `madrid_designation`, etc.)</ResponseField>
  <ResponseField name="scope_kind" type="string">Scope kind (`national`, `regional`, `international`)</ResponseField>
  <ResponseField name="origin_office_code" type="string | null">Origin office for Madrid designations</ResponseField>
  <ResponseField name="source_primary_id" type="string">Source system primary identifier</ResponseField>
  <ResponseField name="application_number" type="string | null">Application/serial number</ResponseField>
  <ResponseField name="registration_number" type="string | null">Registration number</ResponseField>
  <ResponseField name="ir_number" type="string | null">International registration number (Madrid system)</ResponseField>
</Expandable>

<Expandable title="Key dates">
  <ResponseField name="filing_date" type="string | null">ISO date</ResponseField>
  <ResponseField name="registration_date" type="string | null">ISO date</ResponseField>
  <ResponseField name="expiry_date" type="string | null">ISO date</ResponseField>
  <ResponseField name="expiry_date_basis" type="string">Basis for the expiry date: `reported` (the office reported it directly), `derived` (Signa computed it from other dates), or `unknown`</ResponseField>
  <ResponseField name="renewal_due_date" type="string | null">ISO date</ResponseField>
  <ResponseField name="publication_date" type="string | null">First publication date (ISO)</ResponseField>
  <ResponseField name="priority_date" type="string | null">Earliest priority date (ISO), derived from priority claims</ResponseField>
  <ResponseField name="termination_date" type="string | null">ISO date</ResponseField>
  <ResponseField name="office_updated_at" type="string | null">Timestamp reported by the source office for this record, when available</ResponseField>
  <ResponseField name="retrieved_at" type="string | null">Most recent detail enrichment fetch timestamp when an office populates it; otherwise `null`</ResponseField>
  <ResponseField name="protection_effective_date" type="string | null">ISO date</ResponseField>
  <ResponseField name="designation_date" type="string | null">ISO date (Madrid designations)</ResponseField>
  <ResponseField name="dependency_period_end_date" type="string | null">ISO date (Madrid dependency period)</ResponseField>
  <ResponseField name="transformation_deadline_date" type="string | null">ISO date</ResponseField>
</Expandable>

<ResponseField name="is_retracted" type="boolean">Whether the record has been retracted by the source office</ResponseField>

<Expandable title="Owners">
  <ResponseField name="owners" type="object[]">
    <Expandable title="Owner object">
      <ResponseField name="id" type="string">Owner ID (`own_*`)</ResponseField>
      <ResponseField name="name" type="string">Canonical owner name</ResponseField>
      <ResponseField name="country_code" type="string | null">ISO 2-letter country code</ResponseField>
      <ResponseField name="entity_type" type="string | null">Entity type (e.g., `corporation`, `individual`)</ResponseField>
      <ResponseField name="role" type="string">Owner role (e.g., `owner`, `applicant`)</ResponseField>

      <ResponseField name="address" type="object | null">
        Postal address as reported by the office. All fields optional; whole object is `null` when no address is on file.

        <Expandable title="Address object">
          <ResponseField name="lines" type="string[]">Street address lines</ResponseField>
          <ResponseField name="city" type="string">City</ResponseField>
          <ResponseField name="state" type="string">State / region / province</ResponseField>
          <ResponseField name="postal_code" type="string">Postal or ZIP code</ResponseField>
          <ResponseField name="country_code" type="string">ISO 2-letter country code</ResponseField>
        </Expandable>
      </ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

<Expandable title="Attorneys">
  <ResponseField name="attorneys" type="object[]">
    <Expandable title="Attorney object">
      <ResponseField name="id" type="string">Attorney ID (`att_*`)</ResponseField>
      <ResponseField name="name" type="string">Canonical attorney name</ResponseField>
      <ResponseField name="firm_id" type="string | null">Firm ID (`firm_*`)</ResponseField>
      <ResponseField name="firm_name" type="string | null">Firm name</ResponseField>
      <ResponseField name="role" type="string">Attorney role (e.g., `representative`)</ResponseField>

      <ResponseField name="address" type="object | null">
        Postal address as reported by the office. All fields optional; whole object is `null` when no address is on file. Same shape as the owner `address` object.
      </ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

<Expandable title="Classifications">
  <ResponseField name="classifications" type="object[]">
    <Expandable title="Classification object">
      <ResponseField name="nice_class" type="integer | null">Nice class number (1-45)</ResponseField>
      <ResponseField name="nice_edition" type="string | null">Nice classification edition</ResponseField>
      <ResponseField name="goods_services_text" type="string | null">Goods/services description</ResponseField>
      <ResponseField name="goods_services_language" type="string | null">Language of the description</ResponseField>
      <ResponseField name="status" type="string | null">Class status</ResponseField>
      <ResponseField name="class_status_raw" type="string | null">Raw class status from the office</ResponseField>
      <ResponseField name="subclass_codes" type="string[] | null">Office-native subclass codes, or `null` when not reported</ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

<Expandable title="Deadlines (computed)">
  <ResponseField name="deadlines" type="object[]">
    Computed maintenance deadlines based on jurisdiction rules and the mark's lifecycle dates. Deadline rules are authored to be non-overlapping per jurisdiction. These are first-class API fields, not scraped office text, and supplement office-reported dates such as `renewal_due_date`.

    <Expandable title="Deadline object">
      <ResponseField name="type" type="string">Deadline type (e.g., `renewal`, `declaration_of_use`)</ResponseField>
      <ResponseField name="name" type="string">Human-readable deadline name</ResponseField>
      <ResponseField name="due_date" type="string">ISO date when the deadline is due</ResponseField>
      <ResponseField name="grace_expiry" type="string | null">ISO date when the grace period ends</ResponseField>
      <ResponseField name="window_opens" type="string | null">ISO date when the filing window opens</ResponseField>
      <ResponseField name="jurisdiction_code" type="string">Jurisdiction this deadline applies to</ResponseField>
      <ResponseField name="status" type="string">Deadline status relative to today: `future`, `window_open`, `due_soon`, `in_grace`, `missed`</ResponseField>
      <ResponseField name="urgency" type="string">Urgency level for filtering/display: `critical`, `upcoming`, `routine`, `overdue`, `in_grace`, `missed`</ResponseField>
      <ResponseField name="days_until_due" type="integer">Days until the deadline (negative if overdue)</ResponseField>
      <ResponseField name="consequence_if_missed" type="string">What happens if this deadline is missed</ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

<Expandable title="Opposition window (computed)">
  <ResponseField name="opposition_window" type="object | null">
    Computed opposition period for offices and routes covered by Signa's opposition rule registry. `null` means the office/route is not modeled yet or the rule engine intentionally fell back; an object with `status: "unknown"` means the office/route is modeled but the publication date needed to compute the window is missing.
  </ResponseField>
</Expandable>

<Expandable title="Other children">
  <ResponseField name="design_codes" type="object[]">Vienna classification design codes</ResponseField>
  <ResponseField name="text_variants" type="object[]">Alternative text representations of the mark</ResponseField>
  <ResponseField name="statements" type="object[]">Disclaimers, descriptions of mark, etc.</ResponseField>
  <ResponseField name="media" type="object[]">Media files (images, sounds) with URLs. Each media object includes an `id` with the `med_` prefix, `media_type`, `url`, and `content_type`.</ResponseField>
  <ResponseField name="priority_claims" type="object[]">Convention priority claims</ResponseField>
  <ResponseField name="filing_bases" type="object[]">Filing bases (US-specific: use in commerce, intent to use, etc.)</ResponseField>
  <ResponseField name="publications" type="object[]">Publication history (gazette/journal entries)</ResponseField>
  <ResponseField name="office_extensions" type="object | undefined">Office-specific data not captured by the standard schema. Omitted by default; returned only when `?include=office_extensions` is requested.</ResponseField>
  <ResponseField name="us_register" type="object">USPTO register data promoted from `office_extensions`; absent for non-USPTO records or when register data is unavailable</ResponseField>
  <ResponseField name="seniority_claims" type="object[]">EUIPO seniority claims promoted from trademark relationships. `country_code` is uppercased, `kind` is `national` or `international` when EUIPO provides a known raw kind, and `status` uses lowercased EUIPO vocabulary: `claimed`, `accepted`, `refused`, `partially_refused`, `abandoned`, or `deficiency`. Empty array when none exist.</ResponseField>
  <ResponseField name="madrid" type="object | null">Madrid system enrichment data (only for international registrations)</ResponseField>
</Expandable>

<Expandable title="Counts and metadata">
  <ResponseField name="has_media" type="boolean">Whether the mark has any media files</ResponseField>
  <ResponseField name="events_count" type="integer">Total number of events (fetch via [Trademark History](/api-reference/trademarks/trademark-history))</ResponseField>
  <ResponseField name="proceedings_count" type="integer">Total number of proceedings</ResponseField>
  <ResponseField name="coverage_count" type="integer">Total number of coverage entries</ResponseField>
  <ResponseField name="relationships_count" type="integer">Total number of relationships</ResponseField>

  <ResponseField name="data_freshness" type="object">
    <Expandable title="Data freshness">
      <ResponseField name="source_data_date" type="string | null">Date of the source data file</ResponseField>
      <ResponseField name="source_format" type="string | null">Format of the source data</ResponseField>
      <ResponseField name="last_updated_at" type="string">ISO timestamp of last update in Signa</ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="created_at" type="string">ISO timestamp</ResponseField>
  <ResponseField name="updated_at" type="string">ISO timestamp</ResponseField>
</Expandable>

<ResponseField name="request_id" type="string">Unique request identifier</ResponseField>

<ResponseExample>
  ```json Response theme={null}
  {
    "id": "tm_8kLm2nPq",
    "object": "trademark",
    "mark_text": "NIKE",
    "mark_text_language": "en",
    "mark_text_script": null,
    "mark_feature_type": "word",
    "mark_legal_category": "standard",
    "right_kind": "trademark",
    "is_series_mark": null,
    "series_count": null,
    "status": {
      "primary": "active",
      "stage": "registered",
      "reason": null,
      "challenges": [],
      "effective_date": "1974-04-16",
      "source": "explicit",
      "raw_code": "800",
      "raw_label": null
    },
    "office_code": "US",
    "jurisdiction_code": "US",
    "filing_route": "direct_national",
    "scope_kind": "national",
    "origin_office_code": null,
    "source_primary_id": "72396458",
    "application_number": "72396458",
    "registration_number": "0978952",
    "ir_number": null,
    "filing_date": "1971-02-04",
    "registration_date": "1974-04-16",
    "expiry_date": "2034-04-16",
    "expiry_date_basis": "derived",
    "renewal_due_date": "2034-04-16",
    "publication_date": "1974-01-29",
    "priority_date": null,
    "termination_date": null,
    "office_updated_at": "2022-10-28T00:00:00.000Z",
    "retrieved_at": null,
    "protection_effective_date": null,
    "designation_date": null,
    "dependency_period_end_date": null,
    "transformation_deadline_date": null,
    "is_retracted": false,
    "owners": [
      {
        "id": "own_R3jK9mN2",
        "name": "Nike, Inc.",
        "country_code": "US",
        "entity_type": "corporation",
        "role": "owner",
        "address": {
          "lines": ["One Bowerman Drive"],
          "city": "BEAVERTON",
          "state": "OR",
          "postal_code": "97005",
          "country_code": "US"
        }
      }
    ],
    "attorneys": [
      {
        "id": "att_Lp3mN7qR",
        "name": "Katelyn Andrews",
        "firm_id": "firm_Xk9pQ2rS",
        "firm_name": "Banner & Witcoff, Ltd.",
        "role": "representative",
        "address": {
          "lines": ["1100 13th Street NW", "Suite 1200"],
          "city": "WASHINGTON",
          "state": "DC",
          "postal_code": "20005",
          "country_code": "US"
        }
      }
    ],
    "classifications": [
      {
        "nice_class": 25,
        "nice_edition": null,
        "goods_services_text": "Clothing, footwear, headgear",
        "goods_services_language": "en",
        "status": "accepted",
        "class_status_raw": "6",
        "subclass_codes": null
      }
    ],
    "design_codes": [],
    "text_variants": [],
    "statements": [],
    "media": [
      {
        "id": "med_9mQ4pXk2",
        "media_type": "image",
        "mime_type": "image/png",
        "url": "https://api.signa.so/v1/trademarks/tm_8kLm2nPq/media/med_9mQ4pXk2",
        "is_primary": true
      }
    ],
    "priority_claims": [],
    "filing_bases": [
      {
        "basis_type": "use_in_commerce",
        "nice_class_number": 25,
        "first_use_date": "1971-01-01",
        "first_use_in_commerce_date": "1972-01-01",
        "foreign_application_number": null,
        "foreign_country_code": null
      }
    ],
    "publications": [],
    "office_extensions": {
      "register_type": "principal"
    },
    "us_register": {
      "register": "principal",
      "acquired_distinctiveness": null,
      "incontestable": false,
      "standard_characters_claimed": false
    },
    "seniority_claims": [],
    "deadlines": [
      {
        "type": "combined_renewal_and_use",
        "name": "Section 8+9: Renewal + Declaration of Use",
        "due_date": "2034-04-16",
        "grace_expiry": "2034-10-16",
        "window_opens": "2033-04-16",
        "jurisdiction_code": "US",
        "status": "future",
        "urgency": "routine",
        "days_until_due": 2831,
        "consequence_if_missed": "cancellation_and_expiration"
      }
    ],
    "opposition_window": null,
    "madrid": null,
    "has_media": true,
    "events_count": 21,
    "proceedings_count": 0,
    "coverage_count": 0,
    "relationships_count": 0,
    "data_freshness": {
      "source_data_date": "2026-03-18",
      "source_format": "dtd_v2",
      "last_updated_at": "2026-03-30T02:13:13.704Z"
    },
    "created_at": "2026-03-22T08:27:23.446Z",
    "updated_at": "2026-03-30T02:13:13.704Z",
    "request_id": "req_01kp4v2yycy3pq3czhxcsmn9md"
  }
  ```
</ResponseExample>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.signa.so/v1/trademarks/tm_8kLm2nPq" \
    -H "Authorization: Bearer $SIGNA_API_KEY"
  ```

  ```typescript TypeScript theme={null}
  import { Signa } from "@signa-so/sdk";

  const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });

  const trademark = await signa.trademarks.retrieve("tm_8kLm2nPq");
  console.log(trademark.mark_text, trademark.status.stage);
  ```
</CodeGroup>

## Errors

| Status | Type               | When                                      |
| ------ | ------------------ | ----------------------------------------- |
| 400    | `validation_error` | Invalid trademark ID format               |
| 401    | `unauthorized`     | Missing or invalid API key                |
| 403    | `forbidden`        | API key lacks the `trademarks:read` scope |
| 404    | `not_found`        | Trademark ID does not exist               |
| 429    | `rate_limited`     | Rate limit exceeded                       |

## Related Endpoints

* [Search Trademarks](/api-reference/trademarks/search-trademarks): filtered search and browsing
* [Batch Retrieve](/api-reference/trademarks/batch-trademarks): hydrate multiple known IDs in one request
* [Trademark History](/api-reference/trademarks/trademark-history): prosecution event timeline
* [Trademark Media](/api-reference/trademarks/trademark-media): fetch an image or drawing referenced in `media[]`
