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

# Opposition & Dispute Intelligence

> Profile an opposer before responding to an opposition

You received a notice of opposition and need to decide whether to answer, negotiate, or narrow the application. This recipe shows how to profile the opposer across prior proceedings, broaden the view from a single owner to the resolved entity, inspect the contested mark, and find portfolio marks that already have proceedings.

Use [List Proceedings](/api-reference/proceedings/list-proceedings) for cross-mark dispute sets, [Trademark Proceedings](/api-reference/trademarks/trademark-proceedings) for a single mark's dispute history, and [Search Trademarks](/api-reference/trademarks/list-trademarks) with `has_proceedings=true` when you need marks that have any proceeding history.

## Prerequisites

* A Signa API key with `trademarks:read`
* The opposer's `owner_id` or `entity_id`
* The contested trademark ID, if you are already responding to a specific opposition

<Steps>
  <Step title="Start with the named opposer">
    Search proceedings where the named owner appeared as the challenger. For TTAB oppositions, that usually means `party_role=opponent`.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -G "https://api.signa.so/v1/proceedings" \
        -H "Authorization: Bearer $SIGNA_API_KEY" \
        --data-urlencode "party_owner_id=own_019f34d6-1111-7777-8888-111111111111" \
        --data-urlencode "party_role=opponent" \
        --data-urlencode "proceeding_type=opposition" \
        --data-urlencode "office_code=uspto" \
        --data-urlencode "filed_date_gte=2021-01-01" \
        --data-urlencode "aggregations=outcome,party_role,nice_class,office_code,filed_year" \
        --data-urlencode "limit=2"
      ```

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

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

      const ownerTrackRecord = await signa.proceedings.list({
        party_owner_id: "own_019f34d6-1111-7777-8888-111111111111",
        party_role: "opponent",
        proceeding_type: "opposition",
        office_code: "uspto",
        filed_date_gte: "2021-01-01",
        aggregations: ["outcome", "party_role", "nice_class", "office_code", "filed_year"],
        limit: 2,
      });
      ```
    </CodeGroup>

    <ResponseExample>
      ```json theme={null}
      {
        "object": "list",
        "data": [
          {
            "id": "prc_019f34d6-aaaa-7777-8888-aaaaaaaaaaaa",
            "object": "proceeding",
            "trademark_id": "tm_019f34d6-2000-7777-8888-000000000001",
            "proceeding_type": "opposition",
            "proceeding_number": "91281234",
            "status": "decided_granted",
            "outcome": "challenger_won",
            "duration_days": 231,
            "office_code": "uspto",
            "filed_date": "2024-01-18",
            "decision_date": "2024-09-05",
            "contested_classes": [9, 42],
            "decision_outcome": "Opposition Sustained",
            "description": "Opposition proceeding",
            "created_at": "2024-01-18T10:00:00.000Z",
            "updated_at": "2024-09-05T10:00:00.000Z"
          },
          {
            "id": "prc_019f34d6-bbbb-7777-8888-bbbbbbbbbbbb",
            "object": "proceeding",
            "trademark_id": "tm_019f34d6-2000-7777-8888-000000000002",
            "proceeding_type": "opposition",
            "proceeding_number": "91274567",
            "status": "decided_rejected",
            "outcome": "challenger_lost",
            "duration_days": 289,
            "office_code": "uspto",
            "filed_date": "2023-03-01",
            "decision_date": "2023-12-15",
            "contested_classes": [9],
            "decision_outcome": "Opposition Dismissed",
            "description": "Opposition proceeding",
            "created_at": "2023-03-01T10:00:00.000Z",
            "updated_at": "2023-12-15T10:00:00.000Z"
          }
        ],
        "has_more": true,
        "pagination": {
          "cursor": "eyJpZCI6IjAxOWYzNGQ2In0"
        },
        "aggregations": {
          "outcome": {
            "challenger_won": 4,
            "challenger_lost": 2,
            "settled": 3
          },
          "party_role": {
            "opponent": 9,
            "respondent": 9
          },
          "nice_class": {
            "9": 6,
            "35": 2,
            "42": 3
          },
          "office_code": {
            "uspto": 9
          },
          "filed_year": {
            "2021": 1,
            "2022": 2,
            "2023": 3,
            "2024": 3
          }
        },
        "request_id": "req_019f34d6-track"
      }
      ```
    </ResponseExample>

    Because `outcome` is from the challenger perspective, `challenger_won` and `default_judgment` are wins for the opposer when `party_role=opponent`. `challenger_lost` is a loss. `settled`, `withdrawn`, and `pending` are not win/loss buckets, so keep them out of win-rate denominators.
  </Step>

  <Step title="Broaden to the resolved entity">
    If the owner belongs to a resolved entity, repeat the query with `party_entity_id`. This expands the entity to member owner records before matching proceedings, which catches the same business acting through different owner names or offices.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -G "https://api.signa.so/v1/proceedings" \
        -H "Authorization: Bearer $SIGNA_API_KEY" \
        --data-urlencode "party_entity_id=ent_019f34d6-3333-7777-8888-333333333333" \
        --data-urlencode "party_role=opponent" \
        --data-urlencode "proceeding_type=opposition" \
        --data-urlencode "filed_date_gte=2021-01-01" \
        --data-urlencode "aggregations=outcome,party_role,nice_class,office_code,filed_year" \
        --data-urlencode "limit=1"
      ```

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

      resp = requests.get(
          "https://api.signa.so/v1/proceedings",
          headers={"Authorization": f"Bearer {os.environ['SIGNA_API_KEY']}"},
          params={
              "party_entity_id": "ent_019f34d6-3333-7777-8888-333333333333",
              "party_role": "opponent",
              "proceeding_type": "opposition",
              "filed_date_gte": "2021-01-01",
              "aggregations": "outcome,party_role,nice_class,office_code,filed_year",
              "limit": 1,
          },
      )
      profile = resp.json()
      ```
    </CodeGroup>

    <ResponseExample>
      ```json theme={null}
      {
        "object": "list",
        "data": [
          {
            "id": "prc_019f34d6-cccc-7777-8888-cccccccccccc",
            "object": "proceeding",
            "trademark_id": "tm_019f34d6-2000-7777-8888-000000000003",
            "proceeding_type": "opposition",
            "proceeding_number": "91269001",
            "status": "decided_granted",
            "outcome": "default_judgment",
            "duration_days": 96,
            "office_code": "uspto",
            "filed_date": "2022-07-11",
            "decision_date": "2022-10-15",
            "contested_classes": [35],
            "decision_outcome": "Default judgment entered",
            "description": "Opposition proceeding",
            "created_at": "2022-07-11T10:00:00.000Z",
            "updated_at": "2022-10-15T10:00:00.000Z"
          }
        ],
        "has_more": true,
        "pagination": {
          "cursor": "eyJpZCI6IjAxOWYzNGQ2LWNjY2MifQ"
        },
        "aggregations": {
          "outcome": {
            "challenger_won": 8,
            "default_judgment": 1,
            "challenger_lost": 3,
            "settled": 4,
            "withdrawn": 1
          },
          "party_role": {
            "opponent": 17,
            "respondent": 17
          },
          "nice_class": {
            "9": 10,
            "35": 5,
            "42": 6
          },
          "office_code": {
            "uspto": 15,
            "euipo": 2
          },
          "filed_year": {
            "2021": 3,
            "2022": 4,
            "2023": 5,
            "2024": 5
          }
        },
        "request_id": "req_019f34d6-entity"
      }
      ```
    </ResponseExample>

    In this entity-wide profile, decided outcomes are `8 + 1 + 3 = 12`, and challenger wins are `8 + 1 = 9`, so the opposer's decided win rate is 75%. The `duration_days` field on each returned proceeding lets you compute case length over the full paginated set. `nice_class` can sum above the proceeding count because one multi-class proceeding contributes to each contested class.
  </Step>

  <Step title="Inspect the contested mark">
    Use the per-mark proceedings endpoint when you need the dispute history attached to the application you are defending.

    <CodeGroup>
      ```bash cURL theme={null}
      curl "https://api.signa.so/v1/trademarks/tm_019f34d6-2000-7777-8888-000000000010/proceedings?proceeding_type=opposition&limit=20" \
        -H "Authorization: Bearer $SIGNA_API_KEY"
      ```

      ```typescript TypeScript theme={null}
      const markProceedings = await signa.trademarks.proceedings(
        "tm_019f34d6-2000-7777-8888-000000000010",
        { proceeding_type: "opposition", limit: 20 },
      );
      ```
    </CodeGroup>

    <ResponseExample>
      ```json theme={null}
      {
        "object": "list",
        "data": [
          {
            "id": "prc_019f34d6-dddd-7777-8888-dddddddddddd",
            "proceeding_type": "opposition",
            "proceeding_number": "91284567",
            "status": "pending",
            "outcome": "pending",
            "duration_days": null,
            "filed_date": "2026-02-03",
            "decision_date": null,
            "decision_outcome": null,
            "parties": [
              {
                "owner_id": "own_019f34d6-1111-7777-8888-111111111111",
                "name": "Apex Outdoor Group LLC",
                "role": "opponent",
                "country_code": "US"
              },
              {
                "owner_id": "own_019f34d6-2222-7777-8888-222222222222",
                "name": "Meridian Labs Inc.",
                "role": "respondent",
                "country_code": "US"
              }
            ],
            "contested_classes": [9, 42],
            "description": "Opposition proceeding"
          }
        ],
        "has_more": false,
        "pagination": {
          "cursor": null
        },
        "request_id": "req_019f34d6-mark"
      }
      ```
    </ResponseExample>

    This mark-level view is the quickest way to confirm the active parties, the case number, and whether the mark has any prior opposition or cancellation history beyond the current matter.
  </Step>

  <Step title="Find other marks with proceeding history">
    Use trademark search with `has_proceedings=true` to find marks in a portfolio that already have one or more proceedings. This is useful when you want comparable marks, repeat disputes, or a portfolio-level risk queue.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -G "https://api.signa.so/v1/trademarks" \
        -H "Authorization: Bearer $SIGNA_API_KEY" \
        --data-urlencode "owner_id=own_019f34d6-2222-7777-8888-222222222222" \
        --data-urlencode "has_proceedings=true" \
        --data-urlencode "include_total=true" \
        --data-urlencode "limit=10"
      ```

      ```python Python theme={null}
      marks = requests.get(
          "https://api.signa.so/v1/trademarks",
          headers={"Authorization": f"Bearer {os.environ['SIGNA_API_KEY']}"},
          params={
              "owner_id": "own_019f34d6-2222-7777-8888-222222222222",
              "has_proceedings": "true",
              "include_total": "true",
              "limit": 10,
          },
      ).json()
      ```
    </CodeGroup>

    <ResponseExample>
      ```json theme={null}
      {
        "object": "list",
        "data": [
          {
            "id": "tm_019f34d6-2000-7777-8888-000000000010",
            "object": "trademark",
            "mark_text": "MERIDIAN CORE",
            "mark_feature_type": "word",
            "mark_legal_category": "standard",
            "right_kind": "trademark",
            "status": {
              "primary": "pending",
              "stage": "opposition_period",
              "reason": null,
              "challenges": ["opposition_pending"]
            },
            "office_code": "wipo",
            "jurisdiction_code": "WO",
            "scope_kind": "international_registration",
            "filing_route": "madrid_ir",
            "origin_office_code": "US",
            "application_number": "98123456",
            "registration_number": null,
            "ir_number": "1734567",
            "filing_date": "2025-11-12",
            "registration_date": null,
            "expiry_date": "2035-11-12",
            "renewal_due_date": "2035-11-12",
            "classifications": [
              {
                "nice_class": 9,
                "goods_services_text": "Downloadable software for logistics management",
                "goods_services_text_truncated": false,
                "scope": "as_filed"
              },
              {
                "nice_class": 42,
                "goods_services_text": "Software as a service for logistics management",
                "goods_services_text_truncated": false,
                "scope": "as_filed"
              }
            ],
            "nice_classes": [9, 42],
            "owners": [
              {
                "id": "own_019f34d6-2222-7777-8888-222222222222",
                "name": "Meridian Labs Inc.",
                "country_code": "US",
                "entity_id": "ent_019f34d6-2222-7777-8888-222222222222",
                "entity_id_type": "derived"
              }
            ],
            "has_media": false,
            "primary_image_url": null,
            "updated_at": "2026-02-05T12:00:00.000Z",
            "highlights": null,
            "coverage": {
              "territory_count": 1,
              "by_primary": { "pending": 1 },
              "by_stage": { "opposition_period": 1 },
              "matched_territories": [],
              "territories": [
                {
                  "territory": "US",
                  "primary": "pending",
                  "stage": "opposition_period",
                  "protection_status": null,
                  "designation_date": "2025-11-12",
                  "protection_date": null
                }
              ],
              "href": "/v1/trademarks/tm_019f34d6-2000-7777-8888-000000000010/coverage"
            },
            "source_records": [],
            "owners_mixed": false
          }
        ],
        "has_more": false,
        "pagination": {
          "cursor": null,
          "total_count": 1,
          "total_count_approximate": false
        },
        "search_meta": {
          "search_id": "srch_019f34d6",
          "query": null,
          "strategies_used": [],
          "grain": "mark",
          "total_results": 1,
          "total_count_exact": true,
          "total_count_approximate": false,
          "execution_time_ms": 18
        },
        "request_id": "req_019f34d6-search"
      }
      ```
    </ResponseExample>

    After you find the relevant marks, call [Trademark Proceedings](/api-reference/trademarks/trademark-proceedings) for each mark that needs party-level detail.
  </Step>
</Steps>

## Decision Checklist

* Compare owner-level and entity-level outcomes. A single owner may understate a corporate group's dispute pattern.
* Treat `default_judgment` as a challenger win, but keep it visible because it means the respondent defaulted.
* Exclude `settled`, `withdrawn`, and `pending` when calculating a decided win rate.
* Review `duration_days` across decided proceedings to estimate how long a fight may run.
* Use `nice_class` and `office_code` buckets to see whether the opposer concentrates in the classes and offices that matter to your mark.

## Related Reference

* [List Proceedings](/api-reference/proceedings/list-proceedings)
* [Get Proceeding](/api-reference/proceedings/get-proceeding)
* [Trademark Proceedings](/api-reference/trademarks/trademark-proceedings)
* [Search Trademarks](/api-reference/trademarks/list-trademarks)
