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

# List Opposition Rules

> List all opposition window rules across modeled offices

## Overview

Returns a flat list of opposition window rules — the statutory windows during which third parties may oppose a published trademark application or registration. Each rule includes the office's local time zone, holiday calendar (used for close-date rollover), statutory citations, and any common (non-statutory but routinely granted) extensions.

Composite key: each rule is uniquely identified by (`office_code`, `filing_route`, `trigger_event`).

This endpoint exposes the same rule corpus that powers the `opposition_window` field on a trademark detail response. Use it to build educational UI, surface citations alongside a watch alert, or document what your customers can expect for a given office.

## Query Parameters

<ParamField query="jurisdiction" type="string">
  Filter by jurisdiction code (uppercase ISO-2). Comma-separated for multiple values.
</ParamField>

<ParamField query="office" type="string">
  Filter by office code (lowercase, as returned by `/v1/offices`). Comma-separated for multiple values, e.g. `?office=uspto,euipo`.
</ParamField>

<ParamField query="filing_route" type="string">
  Filter by the rule's filing route discriminator. Accepted values: `domestic`, `madrid_designation`. Comma-separated for multiple values.
</ParamField>

<ParamField query="trigger_event" type="string">
  Filter by trigger event. Accepted values: `application_publication`, `registration_publication`, `international_designation_publication`. Comma-separated for multiple values.
</ParamField>

## Response

A standard list response with `data: OppositionRule[]`. The corpus is small (\~24 rules today) and is returned in a single page.

<ResponseField name="object" type="string">Always `list`</ResponseField>

<ResponseField name="data" type="object[]">
  <Expandable title="OppositionRule">
    <ResponseField name="object" type="string">Always `opposition_rule`</ResponseField>
    <ResponseField name="jurisdiction_code" type="string">Jurisdiction (uppercase ISO-2)</ResponseField>
    <ResponseField name="office_code" type="string">Office (lowercase, e.g. `uspto`, `euipo`, `cipo`)</ResponseField>
    <ResponseField name="filing_route" type="string">Either `domestic` or `madrid_designation`</ResponseField>
    <ResponseField name="trigger_event" type="string">Which event starts the opposition clock: `application_publication`, `registration_publication`, or `international_designation_publication`</ResponseField>
    <ResponseField name="window_months" type="integer | null">Window duration in months (null when expressed in days)</ResponseField>
    <ResponseField name="window_days" type="integer | null">Window duration in days (null when expressed in months)</ResponseField>
    <ResponseField name="window_starts_offset_months" type="integer | null">Months to wait after publication before the window opens (e.g. EUIPO Madrid-EU = 1 month between Bulletin Part M republication and window opening)</ResponseField>
    <ResponseField name="window_starts_on" type="string">Either `date_of_publication` or `day_after`</ResponseField>
    <ResponseField name="office_time_zone" type="string">IANA office time zone (display-only — date math uses calendar dates)</ResponseField>
    <ResponseField name="holiday_calendar" type="string | null">Holiday calendar key used for close-date rollover, e.g. `uspto_dc`</ResponseField>

    <ResponseField name="common_extension" type="object | null">
      <Expandable title="Extension">
        <ResponseField name="days" type="integer | null">Extension length in days</ResponseField>
        <ResponseField name="months" type="integer | null">Extension length in months</ResponseField>
        <ResponseField name="as_of_right" type="boolean">`true` if granted automatically on timely request, `false` if discretionary but routinely granted</ResponseField>
        <ResponseField name="notes" type="string">Human-readable note for UI surfacing</ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="applicable_from_date" type="string | null">Marks published before this date use a different rule (null = always applies)</ResponseField>

    <ResponseField name="sources" type="object[]">
      <Expandable title="RuleSource">
        <ResponseField name="citation" type="string">Statutory citation, e.g. `Article 196(2) EUTMR`</ResponseField>
        <ResponseField name="url" type="string">Authoritative URL for the citation</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="has_more" type="boolean">Always `false`</ResponseField>
<ResponseField name="pagination" type="object">Standard pagination envelope (`cursor: null`)</ResponseField>

<ResponseExample>
  ```json theme={null}
  {
    "object": "list",
    "data": [
      {
        "object": "opposition_rule",
        "jurisdiction_code": "EU",
        "office_code": "euipo",
        "filing_route": "madrid_designation",
        "trigger_event": "international_designation_publication",
        "window_months": 3,
        "window_days": null,
        "window_starts_offset_months": 1,
        "window_starts_on": "day_after",
        "office_time_zone": "Europe/Madrid",
        "holiday_calendar": "euipo_alicante",
        "common_extension": null,
        "applicable_from_date": null,
        "sources": [
          {
            "citation": "Article 196(2) EUTMR",
            "url": "https://eur-lex.europa.eu/eli/reg/2017/1001"
          }
        ]
      }
    ],
    "has_more": false,
    "pagination": { "cursor": null }
  }
  ```
</ResponseExample>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.signa.so/v1/opposition-rules?office=euipo" \
    -H "Authorization: Bearer sig_xxxxxxxxxxxx"
  ```

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

  const signa = new Signa({ api_key: "sig_xxxxxxxxxxxx" });

  const rules = await signa.references.oppositionRules({ office: "euipo" });
  for (const rule of rules.data) {
    console.log(rule.office_code, rule.filing_route, rule.window_months);
  }
  ```

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

  resp = requests.get(
      "https://api.signa.so/v1/opposition-rules",
      params={"office": "euipo"},
      headers={"Authorization": "Bearer sig_xxxxxxxxxxxx"},
  )
  for rule in resp.json()["data"]:
      print(rule["office_code"], rule["filing_route"], rule["window_months"])
  ```
</CodeGroup>

## Errors

| Status | Type               | Description                                     |
| ------ | ------------------ | ----------------------------------------------- |
| 400    | `validation_error` | Invalid `filing_route` or `trigger_event` value |
| 401    | `unauthorized`     | Missing or invalid API key                      |
| 403    | `forbidden`        | API key missing the `trademarks:read` scope     |
| 429    | `rate_limited`     | Too many requests                               |

## Related Endpoints

* [List Deadline Rules](/api-reference/reference/deadline-rules) — maintenance deadline rules (renewals, declarations)
* [List Offices](/api-reference/reference/list-offices) — office overview
