> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pinakelai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# The trademark record

> The two record shapes, every field, what null means, and which parts are covered by the stability guarantee.

Every register is mapped to one record model. A record comes in two shapes:

| Shape | `object` value | Returned by |
| - | - | - |
| Full record | `trademark` | [Retrieve](https://docs.pinakelai.com/api-reference/trademarks/retrieve.md), [batch retrieve](https://docs.pinakelai.com/api-reference/trademarks/batch.md), and search or feed with `include=full` |
| Summary | `trademark_summary` | [Search](https://docs.pinakelai.com/api-reference/trademarks/search.md) and [changes feed](https://docs.pinakelai.com/api-reference/changes/list.md) items |

Summaries are built from one row per record, so a page of 100 comes back quickly. The full record adds parties, classification, identifiers, designations and the office's own status wording. Use the summary to decide which records you need, then fetch those in a [batch](https://docs.pinakelai.com/api-reference/trademarks/batch.md) of up to 100.

## Rules that apply to every field

* **Every field is always present.** A field never disappears because it has no value.
* **`null` means the office did not state the value.** Pinakel never fills a gap with a default or a computed value: an expiry date is never calculated from a filing date, and a missing country is never guessed from an address.
* **Arrays are never `null`.** An empty list means the record has none.
* **Dates** are calendar dates as the office states them, `YYYY-MM-DD`, with no time zone. See [Dates](https://docs.pinakelai.com/concepts/dates.md).
* **Timestamps** are UTC with microseconds and a `Z` suffix: `2026-11-10T09:02:13.512000Z`.
* **Enumerations are open.** New values can appear in later versions; treat an unknown value like `other`. See [Versioning](https://docs.pinakelai.com/guides/versioning.md).

## The full record

This is an Albanian application for a figurative mark. It has no mark text, so `mark.text` is `null`, and it carries the office's own status wording in Albanian.

```json theme={null}
{
  "object": "trademark",
  "id": "tm_AL_01380b37-3212-5fc1-8cce-20183f7c15eb",
  "jurisdiction": "AL",
  "office": "AL",
  "origin_office": null,
  "identifiers": {
    "application_number": "AL/T/2026/001305",
    "registration_number": null,
    "international_registration_numbers": [],
    "priority_claims": []
  },
  "mark": {
    "text": null,
    "translation": null,
    "transliteration": null,
    "feature": "figurative",
    "kind": "individual"
  },
  "status": {
    "value": "pending",
    "category": "live",
    "date": null,
    "office_status": "Në proces ekzaminimi",
    "office_status_code": null
  },
  "dates": {
    "application": "2026-10-05",
    "registration": null,
    "publication": null,
    "expiry": null,
    "renewal": null,
    "termination": null,
    "opposition_period_end": null
  },
  "classification": {
    "nice_classes": [9, 35, 36, 42],
    "national_classes": [],
    "similar_group_codes": [],
    "vienna_codes": []
  },
  "parties": {
    "owners": [
      {
        "name": "CONAD-CONSORZIO NAZ. DETTAGLIANTI SOC.COOPERATIVA IN SIGLA CONAD",
        "name_translated": null,
        "name_key": "CONAD CONSORZIO NAZ DETTAGLIANTI SOCCOOPERATIVA IN SIGLA CONAD",
        "country": "IT",
        "address": "VIA MICHELINO, 59 40127 Bolonja, Itali",
        "entity": null,
        "roles": ["applicant"]
      }
    ],
    "representatives": [
      {
        "name": "RENATA LEKA",
        "name_translated": null,
        "name_key": "RENATA LEKA",
        "country": "AL",
        "address": "Njesia bashkiake nr 5, rruga Ibrahim Rugova, Kompleksi Green Park, kulla 1, kati 3,Tirane , AL",
        "entity": null,
        "roles": ["representative"]
      }
    ]
  },
  "designated_countries": [],
  "media": {
    "has_image": true
  },
  "updated_at": "2026-11-10T09:02:13.512000Z",
  "source": {
    "processed_on": "2026-11-10"
  },
  "links": {
    "self": "https://api.pinakelai.com/v1/trademarks/tm_AL_01380b37-3212-5fc1-8cce-20183f7c15eb"
  }
}
```

### Fields

| Field | Type | Meaning |
| - | - | - |
| `object` | string | `trademark` |
| `id` | string | Permanent public id, `tm_` + register code + `_` + an opaque uid. See [Identifiers](https://docs.pinakelai.com/concepts/identifiers.md). |
| `jurisdiction` | string | The register the record comes from, such as `CH`, `EM` or `WO`. See [Registers, offices and origin offices](https://docs.pinakelai.com/concepts/registers-and-offices.md). |
| `office` | string or null | The office the record names as its registering office. Differs from `jurisdiction` for international registrations. |
| `origin_office` | string or null | Only in the `WO` register: the office of origin of the international registration. `null` everywhere else. |
| `identifiers.application_number` | string or null | As the office writes it. |
| `identifiers.registration_number` | string or null | As the office writes it; `null` until registration, and for marks that never registered. |
| `identifiers.international_registration_numbers` | array of strings | Madrid international registration numbers linked to this record. In the `WO` register this includes the record's own registration number, which is the international registration number. |
| `identifiers.priority_claims` | array of objects | `{number, country, date}` for each priority claim; `country` is ISO 3166-1 alpha-2 where it can be resolved. |
| `mark.text` | string or null | The mark as filed. `null` for marks with no word element. |
| `mark.translation` | string or null | A translation of the mark text: the office's own when it publishes one, otherwise generated by Pinakel. |
| `mark.transliteration` | string or null | A Latin-script transliteration, from the office or generated by Pinakel. |
| `mark.feature` | string or null | Word, figurative, combined, sound and so on. See [enumerations](#enumerations). |
| `mark.kind` | string or null | Individual, collective, certification and so on. |
| `status.value` | string or null | Normalized status. See [Status](https://docs.pinakelai.com/concepts/status.md). |
| `status.category` | string or null | `live`, `dead` or `unknown`. |
| `status.date` | date or null | The date of the current status, as the office states it. |
| `status.office_status` | string or null | The office's own status text, untranslated. |
| `status.office_status_code` | string or null | The office's own status code, where it publishes one. |
| `dates.*` | date or null | `application`, `registration`, `publication`, `expiry`, `renewal`, `termination`, `opposition_period_end`. See [Dates](https://docs.pinakelai.com/concepts/dates.md). |
| `classification.nice_classes` | array of integers | Nice classes, 1 to 45. |
| `classification.national_classes` | array of strings | Classes from a national system that are not Nice classes. |
| `classification.similar_group_codes` | array of strings | Similar-group codes (for example from the Chinese and Korean registers). See [Classification](https://docs.pinakelai.com/concepts/classification.md). |
| `classification.vienna_codes` | array of strings | Vienna figurative-element codes, such as `27.05.01`. |
| `parties.owners` | array of parties | Current owners, holders and applicants, primary owner first. See [Parties and name keys](https://docs.pinakelai.com/concepts/parties.md). |
| `parties.representatives` | array of parties | Current representatives and correspondents. |
| `designated_countries` | array of strings | Countries designated under the Madrid system, where the register records them. |
| `media.has_image` | boolean | Whether the office published an image of the mark. Images are not served in v1. |
| `updated_at` | timestamp | When this record last changed in Pinakel. Also moves when a register is reloaded. See [How records change](https://docs.pinakelai.com/data/how-records-change.md). |
| `source.processed_on` | date | The date Pinakel last processed the record from its source. |
| `links.self` | string | The record's retrieve URL. |

Each party has the same fields:

| Field | Meaning |
| - | - |
| `name` | The name as published. |
| `name_translated` | A translated or romanized name, where the office or Pinakel provides one. |
| `name_key` | The normalized name used by the exact name filters. Pass it to `owner_key`, `primary_owner_key` or `representative_key`. |
| `country` | ISO 3166-1 alpha-2 code, or `null` when the record gives no country that can be resolved. |
| `address` | The address as published, in one string. |
| `entity` | The legal form or entity description as published (`SAS`, `Corporation`), or `null`. |
| `roles` | Every role this party holds on the record: `owner`, `holder`, `applicant` for owners; `representative`, `correspondent` for representatives. |

### Enumerations

Filter values and response values are the same strings, so a value you read can be passed straight back as a filter.

| Field | Values |
| - | - |
| `status.value` | `registered`, `pending`, `abandoned`, `cancelled`, `expired`, `unknown`, `other` |
| `status.category` | `live`, `dead`, `unknown` |
| `mark.feature` | `word`, `figurative`, `combined`, `three_dimensional`, `colour`, `combination_of_colours`, `sound`, `hologram`, `olfactory`, `motion`, `multimedia`, `position`, `pattern`, `touch`, `taste`, `stylized_characters`, `other` |
| `mark.kind` | `individual`, `collective`, `certificate`, `guarantee`, `defensive`, `geographical`, `common_right`, `logotype`, `service`, `trademark`, `denomination`, `other` |

`other` means the office used a value that has no mapping yet. For status, the office's wording is in `status.office_status`; for the other fields it is in `source_record`. Each of these fields can also be `null` when the office stated nothing; filter for that with the value `none`. [Status](https://docs.pinakelai.com/concepts/status.md) explains the difference between `null`, `other` and `unknown`.

## The summary

Search results and feed items carry these fields. Their meaning is the same as in the full record.

| Field | Notes |
| - | - |
| `object` | `trademark_summary` |
| `id`, `jurisdiction`, `office`, `origin_office` | As in the full record. |
| `identifiers` | `application_number` and `registration_number` only. |
| `mark` | `text`, `translation`, `transliteration`, `feature`, `kind`. |
| `status` | `value`, `category`, `date`. The office's own wording is only in the full record. |
| `dates` | All seven dates. |
| `primary_owner` | `{name, country}` of the first owner, or both `null` when the record has no owner. |
| `owner_count` | Number of owners in the group that supplies the primary owner (owners, else holders, else applicants). |
| `nice_class_count` | Number of distinct Nice classes. |
| `primary_nice_class` | The first Nice class as an integer, or `null`. |
| `media` | `{has_image}`. |
| `updated_at`, `links` | As in the full record. |

## Optional blocks

[Retrieve](https://docs.pinakelai.com/api-reference/trademarks/retrieve.md) and [batch retrieve](https://docs.pinakelai.com/api-reference/trademarks/batch.md) accept `include` to add blocks. A block appears only when you ask for it.

| `include` value | Adds | Notes |
| - | - | - |
| `goods_services` | `goods_services`: a list of `{nice_class, class_code, language, text, translation}` | The goods and services text per class, with a translation where one exists. For the Chinese and Korean registers only Nice-class entries are kept. |
| `previous_parties` | `previous_parties`: `{owners, representatives}` | Earlier owners, holders and representatives, in the same party shape. |
| `assignments` | `assignments` and `securities` | Recorded transfers (number, filing date, conveyance, assignor and assignee names, security-interest and release flags) and security interests (number, filing date, type, status, holder names). |
| `source_record` | `source_record` | The normalized source document as Pinakel stores it. Useful for fields the record model does not carry. **Not covered by the stability guarantee:** its structure can change without notice. |

Batch requests with `goods_services`, `assignments` or `source_record` are limited to 25 ids. On search and the changes feed, `include` accepts only `full`, which returns full `trademark` objects instead of summaries and limits the page to 25.

## Records that cannot be built

Rarely, a record exists but cannot be assembled at that moment, for example while its source document is being replaced. Such a record is left out of search and feed pages, listed under `unavailable` in a batch response, and answered with 503 [`unavailable`](https://docs.pinakelai.com/errors/unavailable) on retrieve. Retry later.

## What is not in v1

* When Pinakel first saw a record. Backfills restamp that time, so it would mislead; it will be added once it is reliable.
* Images. `media.has_image` tells you whether one exists.
* Opposition details, and removal events in the changes feed.
* Sparse fieldsets (`fields=`).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.