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

# Deadline Rules

> How Signa computes trademark maintenance deadlines across jurisdictions

Signa includes a rule-based deadline engine that computes upcoming maintenance deadlines for every registered trademark. The engine has rules defined for 21 jurisdictions (10 offices in production, more planned), producing actionable deadline objects with status, urgency, and consequence information.

## How Deadlines Are Computed

Given a trademark's date fields and jurisdiction, the deadline engine returns an array of computed deadlines. Each one carries its type, due date, urgency, grace period (where applicable), and consequence-if-missed information. The engine is pure: no database access, no side effects -- the same inputs always produce the same output.

Each computed deadline includes:

| Field                   | Description                                                                                                                            |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `type`                  | `renewal`, `declaration_of_use`, `combined_renewal_and_use`, `declaration_of_incontestability`, `restoration`, `international_renewal` |
| `name`                  | Human-readable label (e.g., "Section 8 -- Declaration of Use")                                                                         |
| `due_date`              | The date the deadline falls                                                                                                            |
| `window_opens`          | Earliest date you can file                                                                                                             |
| `grace_expiry`          | Last day of grace period (if applicable)                                                                                               |
| `status`                | `future`, `window_open`, `due_soon`, `in_grace`, `missed`                                                                              |
| `urgency`               | `routine`, `upcoming`, `critical`, `in_grace`, `overdue`, `missed`                                                                     |
| `days_until_due`        | Signed integer (negative = overdue)                                                                                                    |
| `consequence_if_missed` | What happens if you miss it entirely                                                                                                   |

### Trigger Dates

Each jurisdiction defines a **trigger field** -- the date from which deadlines are calculated. This varies by jurisdiction:

| Trigger                  | Jurisdictions                  |
| ------------------------ | ------------------------------ |
| `registration_date`      | US (domestic), CA, PH          |
| `filing_date`            | EU, DE, FR, CH, BX, GB, AU, PL |
| `protection_grant_date`  | US (Madrid)                    |
| `intl_registration_date` | WIPO                           |

Some jurisdictions changed their trigger field on a specific date. For example, Sweden switched from `registration_date` to `filing_date` on 2019-01-01. The engine handles this automatically based on the mark's filing date.

## US Trademark Deadlines

The United States has the most complex deadline structure of any jurisdiction, because it requires proof of continued use in addition to renewal.

### US Domestic Marks

<Frame>
  ```mermaid theme={null}
  gantt
      title US Trademark Deadline Timeline (Domestic)
      dateFormat YYYY
      axisFormat %Y

      section Registration
      Registration Date           :milestone, reg, 2025, 0d

      section Year 5-6
      Section 8 (Use) window      :active, s8w, 2030, 365d
      Section 8 due               :milestone, s8, 2031, 0d
      Section 8 grace             :crit, s8g, 2031, 182d
      Section 15 (Optional)       :done, s15, 2030, 365d

      section Year 9-10
      Section 8+9 (Renewal) window :active, s89w, 2034, 365d
      Section 8+9 due             :milestone, s89, 2035, 0d
      Section 8+9 grace           :crit, s89g, 2035, 182d

      section Year 19-20
      Section 8+9 (2nd Renewal)   :active, s892w, 2044, 365d
      Section 8+9 due             :milestone, s892, 2045, 0d
  ```
</Frame>

**Section 8 -- Declaration of Use (years 5-6)**

* **Due:** 6 years after registration
* **Window opens:** 1 year before (year 5)
* **Grace period:** 6 months (with surcharge)
* **Consequence if missed:** Cancellation
* Required for all US domestic registrations

**Section 15 -- Declaration of Incontestability (years 5-6)**

* **Due:** Eligible from year 5, commonly filed with Section 8 by year 6
* **Optional:** No penalty for missing it
* **Benefit:** Makes the registration conclusive evidence of validity
* No grace period

**Section 8+9 -- Combined Renewal and Declaration of Use (every 10 years)**

* **Due:** 10 years after registration, then every 10 years
* **Window opens:** 1 year before
* **Grace period:** 6 months (with surcharge)
* **Consequence if missed:** Cancellation and expiration

### US Madrid Marks

Madrid Protocol registrations designating the US use **Section 71** (the Madrid equivalent of Section 8) instead of Section 8. The trigger date is `protection_grant_date` instead of `registration_date`. Renewal is handled at WIPO, not at the USPTO.

| Deadline                | Trigger                 | Due            | Grace           |
| ----------------------- | ----------------------- | -------------- | --------------- |
| Section 71 (first)      | protection\_grant\_date | Year 6         | 6 months        |
| Section 15              | protection\_grant\_date | Year 6         | None (optional) |
| Section 71 (at renewal) | protection\_grant\_date | Every 10 years | 6 months        |

<CodeGroup>
  ```bash cURL theme={null}
  # Get deadlines for a specific trademark
  curl -s https://api.signa.so/v1/trademarks/tm_abc123 \
    -H "Authorization: Bearer sig_xxx" | jq '.deadlines'
  ```

  ```typescript TypeScript theme={null}
  const tm = await signa.trademarks.retrieve("tm_abc123");
  for (const deadline of tm.deadlines) {
    console.log(deadline.name, deadline.due_date, deadline.status);
  }
  // "Section 8 — Declaration of Use"  "2031-01-20"  "future"
  // "Section 8+9 — Renewal + Declaration of Use"  "2035-01-20"  "future"
  ```

  ```python Python theme={null}
  tm = client.trademarks.retrieve("tm_abc123")
  for deadline in tm.deadlines:
      print(deadline.name, deadline.due_date, deadline.status)
  # Section 8 — Declaration of Use  2031-01-20  future
  # Section 8+9 — Renewal + Declaration of Use  2035-01-20  future
  ```
</CodeGroup>

## EU Trademark Deadlines

The European Union has a simpler structure. No proof of use is required at renewal.

| Field             | Value                    |
| ----------------- | ------------------------ |
| **Trigger**       | `filing_date`            |
| **Renewal cycle** | Every 10 years           |
| **Window opens**  | 6 months before due date |
| **Grace period**  | 6 months after due date  |
| **Consequence**   | Cancellation             |
| **Proof of use**  | Not required at renewal  |

## Jurisdiction Quirks

### Germany (DPMA) -- End-of-Month Rule

For marks filed **before 2019-01-14**, the expiry date is the last day of the month in which the anniversary falls, not the exact anniversary date. For example, a mark filed on 2015-03-15 expires on 2025-03-31, not 2025-03-15.

Marks filed on or after 2019-01-14 use the exact anniversary (standard behavior).

### Canada (CIPO) -- Legacy 15-Year Terms

Canada changed its trademark law on 2019-06-17:

* **Before 2019-06-17:** Initial term of 15 years, renewal every 15 years
* **On or after 2019-06-17:** Initial term of 10 years, renewal every 10 years

Signa applies the correct term based on the mark's registration date.

### Nordic Countries -- Trigger Field Change

Sweden, Denmark, and Finland changed their trigger field from `registration_date` to `filing_date` around 2019. Norway made the same change earlier, on 2010-07-01. Signa resolves the correct trigger based on when the mark was filed.

### Mexico -- Post-Anniversary Windows

Mexico has a unique Declaration of Use requirement:

* **Due:** 3 years after grant
* **Window opens:** The day **after** the 3rd anniversary (not before)
* **Window duration:** 3 months

This differs from most jurisdictions where the filing window opens before the due date.

### Philippines -- Mixed Trigger DAUs

The Philippines requires Declarations of Actual Use at years 3 and 5 after filing, each with different extension rules. The year-3 DAU has a 6-month extension option.

### UK and Iceland -- Restoration Periods

After the grace period expires, these jurisdictions offer an additional restoration window (6 months for UK, variable for Iceland) during which a lapsed registration can be re-established.

## Covered Jurisdictions

| Code | Office           | Renewal Cycle | Trigger                  | Proof of Use            |
| ---- | ---------------- | ------------- | ------------------------ | ----------------------- |
| US   | USPTO (domestic) | 10 years      | registration\_date       | Yes (Sections 8, 8+9)   |
| US   | USPTO (Madrid)   | 10 years      | protection\_grant\_date  | Yes (Section 71)        |
| EU   | EUIPO            | 10 years      | filing\_date             | No                      |
| DE   | DPMA             | 10 years      | filing\_date             | No                      |
| GB   | UKIPO            | 10 years      | filing\_date             | No                      |
| CH   | IGE/IPI          | 10 years      | filing\_date             | No                      |
| FR   | INPI             | 10 years      | filing\_date             | No                      |
| BX   | BOIP             | 10 years      | filing\_date             | No                      |
| SE   | PRV              | 10 years      | filing\_date\*           | No                      |
| CA   | CIPO             | 10 years      | registration\_date       | No                      |
| AU   | IP Australia     | 10 years      | filing\_date             | No                      |
| NO   | NIPO             | 10 years      | filing\_date\*           | No                      |
| DK   | DKPTO            | 10 years      | filing\_date\*           | No                      |
| FI   | PRH              | 10 years      | filing\_date\*           | No                      |
| IS   | ISIPO            | 10 years      | filing\_date             | No                      |
| PL   | UPRP             | 10 years      | filing\_date             | No                      |
| TH   | DIP              | 10 years      | filing\_date             | No                      |
| VN   | IP Vietnam       | 10 years      | filing\_date             | No                      |
| PH   | IPOPHL           | 10 years      | registration\_date       | Yes (DAU at years 3, 5) |
| BR   | INPI Brazil      | 10 years      | grant\_date              | No                      |
| MX   | IMPI             | 10 years      | grant\_date              | Yes (DU at year 3)      |
| WIPO | WIPO             | 10 years      | intl\_registration\_date | No                      |

\* Changed from `registration_date` -- SE, DK, FI around 2019; NO on 2010-07-01

## Filtering by Deadlines

Use the `next_deadline_before` filter to find marks with upcoming deadlines:

<CodeGroup>
  ```bash cURL theme={null}
  # All marks with a deadline in the next 90 days
  curl -s "https://api.signa.so/v1/trademarks?next_deadline_before=2026-06-22" \
    -H "Authorization: Bearer sig_xxx"
  ```

  ```typescript TypeScript theme={null}
  const marks = await signa.trademarks.list({
    next_deadline_before: "2026-06-22",
    sort: "next_deadline_date",
  });
  ```

  ```python Python theme={null}
  marks = client.trademarks.list(
      next_deadline_before="2026-06-22",
      sort="next_deadline_date",
  )
  ```
</CodeGroup>

You can also filter by `renewal_due_date` range for renewal-specific views:

<CodeGroup>
  ```bash cURL theme={null}
  curl -s "https://api.signa.so/v1/trademarks?renewal_due_date_gte=2026-01-01&renewal_due_date_lt=2027-01-01" \
    -H "Authorization: Bearer sig_xxx"
  ```

  ```typescript TypeScript theme={null}
  const marks = await signa.trademarks.list({
    renewal_due_date_gte: "2026-01-01",
    renewal_due_date_lt: "2027-01-01",
  });
  ```

  ```python Python theme={null}
  marks = client.trademarks.list(
      renewal_due_date_gte="2026-01-01",
      renewal_due_date_lt="2027-01-01",
  )
  ```
</CodeGroup>
