Skip to main content
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 for cross-mark dispute sets, Trademark Proceedings for a single mark’s dispute history, and Search 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
1

Start with the named opposer

Search proceedings where the named owner appeared as the challenger. For TTAB oppositions, that usually means party_role=opponent.
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"
{
  "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"
}
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.
2

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.
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"
{
  "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"
}
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.
3

Inspect the contested mark

Use the per-mark proceedings endpoint when you need the dispute history attached to the application you are defending.
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"
{
  "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"
}
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.
4

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.
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"
{
  "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"
}
After you find the relevant marks, call Trademark Proceedings for each mark that needs party-level detail.

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.