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

# Firm Trademarks

> List trademarks handled by attorneys at a specific firm with the full Appendix A filter set

## Overview

Returns a paginated list of trademarks where one of the attorneys belongs to the specified firm. Use this for firm-level competitive intelligence, client portfolio sweeps, or auditing prosecution patterns.

When no `sort` parameter is supplied and no `q` text query is given, results are returned in the search index's internal document order (not sorted by any specific field). When a `q` text query is provided, results are ranked by relevance score with filing date as a tiebreaker. You can pass an explicit `sort` parameter to control ordering (e.g. `sort=-filing_date`). Every Appendix A filter from the main [`List Trademarks`](/api-reference/trademarks/list-trademarks) endpoint is available here.

Arrays are comma-separated, date ranges use flat `_gte`, `_gt`, `_lte`, and `_lt` operators, and booleans must be the literal strings `true` or `false`.

## Path Parameters

<ParamField path="id" type="string" required>
  Firm ID (`firm_...`).
</ParamField>

## Query Parameters

### Pagination

<ParamField query="limit" type="integer" default="20">Items per page (1-100).</ParamField>
<ParamField query="cursor" type="string">Pagination cursor from a previous response.</ParamField>

### Status filters

<ParamField query="status_primary" type="string | string[]">Primary status: `active`, `pending`, `inactive`, `unknown`. Accepts a single value or a comma-separated list — e.g. `?status_primary=active,pending` matches TESS-style "live" marks.</ParamField>
<ParamField query="status_stage" type="string">Status stage(s), comma-separated.</ParamField>
<ParamField query="status_reason" type="string">Status reason(s), comma-separated.</ParamField>
<ParamField query="challenge_states" type="string">Challenge state(s), comma-separated.</ParamField>

### Mark classification

<ParamField query="mark_feature_type" type="string">Mark feature type(s), comma-separated.</ParamField>
<ParamField query="mark_legal_category" type="string">Legal category(ies), comma-separated.</ParamField>
<ParamField query="right_kind" type="string">Right kind.</ParamField>
<ParamField query="filing_route" type="string">Filing route(s), comma-separated.</ParamField>
<ParamField query="scope_kind" type="string">Scope kind(s), comma-separated.</ParamField>

### Identifiers

<ParamField query="application_number" type="string">Application number. Requires `office`.</ParamField>
<ParamField query="registration_number" type="string">Registration number. Requires `office`.</ParamField>
<ParamField query="ir_number" type="string">Madrid international registration number.</ParamField>
<ParamField query="office" type="string">Office code (required with `application_number` or `registration_number`).</ParamField>

### Geography

<ParamField query="jurisdictions" type="string">Jurisdiction codes, comma-separated.</ParamField>
<ParamField query="offices" type="string">Office codes, comma-separated (e.g. `?offices=uspto,euipo`).</ParamField>
<ParamField query="owner_country" type="string">Owner country code (ISO 3166-1 alpha-2).</ParamField>

### Classification codes

<ParamField query="nice_classes" type="string">Nice classes 1-45, comma-separated.</ParamField>
<ParamField query="vienna_codes" type="string">Vienna figurative codes, comma-separated.</ParamField>

### Date ranges

Lower bounds must be before upper bounds. Date fields use `YYYY-MM-DD`; `updated_at_*` accepts ISO 8601 timestamps.

<ParamField query="filing_date_gte" type="string">Filing date >=.</ParamField>
<ParamField query="filing_date_gt" type="string">Filing date >.</ParamField>
<ParamField query="filing_date_lte" type="string">Filing date \<=.</ParamField>
<ParamField query="filing_date_lt" type="string">Filing date \<.</ParamField>
<ParamField query="registration_date_gte" type="string">Registration date >=.</ParamField>
<ParamField query="registration_date_gt" type="string">Registration date >.</ParamField>
<ParamField query="registration_date_lte" type="string">Registration date \<=.</ParamField>
<ParamField query="registration_date_lt" type="string">Registration date \<.</ParamField>
<ParamField query="expiry_date_gte" type="string">Expiry date >=.</ParamField>
<ParamField query="expiry_date_gt" type="string">Expiry date >.</ParamField>
<ParamField query="expiry_date_lte" type="string">Expiry date \<=.</ParamField>
<ParamField query="expiry_date_lt" type="string">Expiry date \<.</ParamField>
<ParamField query="renewal_due_date_gte" type="string">Renewal due date >=.</ParamField>
<ParamField query="renewal_due_date_gt" type="string">Renewal due date >.</ParamField>
<ParamField query="renewal_due_date_lte" type="string">Renewal due date \<=.</ParamField>
<ParamField query="renewal_due_date_lt" type="string">Renewal due date \<.</ParamField>
<ParamField query="publication_date_gte" type="string">Publication date >=.</ParamField>
<ParamField query="publication_date_gt" type="string">Publication date >.</ParamField>
<ParamField query="publication_date_lte" type="string">Publication date \<=.</ParamField>
<ParamField query="publication_date_lt" type="string">Publication date \<.</ParamField>
<ParamField query="termination_date_gte" type="string">Termination date >=.</ParamField>
<ParamField query="termination_date_gt" type="string">Termination date >.</ParamField>
<ParamField query="termination_date_lte" type="string">Termination date \<=.</ParamField>
<ParamField query="termination_date_lt" type="string">Termination date \<.</ParamField>
<ParamField query="updated_at_gte" type="string">Updated at >= (ISO 8601).</ParamField>
<ParamField query="updated_at_gt" type="string">Updated at > (ISO 8601).</ParamField>
<ParamField query="updated_at_lte" type="string">Updated at \<= (ISO 8601).</ParamField>
<ParamField query="updated_at_lt" type="string">Updated at \< (ISO 8601).</ParamField>

### Entity filters

<ParamField query="owner_id" type="string">Owner ID (`own_...`).</ParamField>
<ParamField query="owner_name" type="string">Fuzzy owner name match.</ParamField>
<ParamField query="attorney_id" type="string">Attorney ID (`att_...`).</ParamField>

### Public company filters

<ParamField query="owner_publicly_traded" type="boolean">`true` to return marks whose owner has a confirmed active SEC ticker match. `false` means no confirmed public-company match, not confirmed private.</ParamField>
<ParamField query="owner_has_lei" type="boolean">`true` to return marks whose owner has a confirmed GLEIF LEI match. `false` means no confirmed LEI match.</ParamField>
<ParamField query="owner_ticker" type="string">Exact owner ticker match, uppercased server-side.</ParamField>
<ParamField query="owner_lei" type="string">Exact owner LEI match, uppercased server-side.</ParamField>

### Boolean flags

<ParamField query="has_media" type="boolean">Marks with media.</ParamField>
<ParamField query="has_proceedings" type="boolean">Marks with proceedings.</ParamField>
<ParamField query="is_madrid" type="boolean">Madrid-routed marks only.</ParamField>
<ParamField query="is_retracted" type="boolean">Retracted marks only.</ParamField>
<ParamField query="is_series_mark" type="boolean">Series marks only.</ParamField>

## Response

Returns a `list` envelope of trademark summary objects.

<ResponseExample>
  ```json theme={null}
  {
    "object": "list",
    "data": [
      {
        "id": "tm_8kLm2nPq",
        "object": "trademark",
        "mark_text": "AURORA",
        "status": { "primary": "active", "stage": "registered" },
        "office_code": "uspto",
        "jurisdiction_code": "US",
        "filing_date": "2023-04-12",
        "registration_date": "2024-09-18",
        "classifications": [
          { "nice_class": 9, "goods_services_text": "Downloadable software for digital image processing" },
          { "nice_class": 35, "goods_services_text": "Online retail store services featuring digital media" },
          { "nice_class": 42, "goods_services_text": "Software as a service (SaaS) featuring media management tools" }
        ],
        "owner_name": "Aurora Digital Inc."
      }
    ],
    "has_more": true,
    "pagination": { "cursor": "eyJpZCI6..." },
    "request_id": "req_xyz"
  }
  ```
</ResponseExample>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.signa.so/v1/firms/firm_2kLm9X/trademarks?status_stage=registered&filing_date_gte=2024-01-01&limit=20" \
    -H "Authorization: Bearer sig_YOUR_KEY_HERE"
  ```

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

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

  const page = await signa.firms.trademarks("firm_2kLm9X", {
    status_stage: ["registered"],
    filing_date_gte: "2024-01-01",
    limit: 20,
  });
  ```

  ```python Python theme={null}
  import requests

  resp = requests.get(
      "https://api.signa.so/v1/firms/firm_2kLm9X/trademarks",
      headers={"Authorization": "Bearer sig_YOUR_KEY_HERE"},
      params={"status_stage": "registered", "filing_date_gte": "2024-01-01"},
  )
  ```
</CodeGroup>

## Errors

| Status | Type               | Description                           |
| ------ | ------------------ | ------------------------------------- |
| 400    | `validation_error` | Invalid query parameter or date range |
| 401    | `unauthorized`     | Missing or invalid API key            |
| 404    | `not_found`        | Firm ID does not exist                |
| 429    | `rate_limited`     | Too many requests                     |

## Related Endpoints

* [Get Firm](/api-reference/parties/get-firm) -- firm profile and stats
* [Firm Attorneys](/api-reference/parties/firm-attorneys) -- attorneys at this firm
* [Attorney Trademarks](/api-reference/parties/attorney-trademarks) -- same view scoped to one attorney
