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

# Compute Deadlines

> Compute trademark maintenance deadlines without persisting data

## Overview

Compute maintenance deadlines for any set of trademarks — renewal windows, declarations of use, grace periods, and what happens if each is missed — without storing anything in Signa.

Send the facts you already have — jurisdiction, filing and registration dates, status — and Signa returns the exact dated obligations, computed from the same rules that power its trademark data. A missed renewal can cost a registration, and this is the deadline logic you'd otherwise build and maintain office by office, kept current behind a single request.

Pair it with [List Deadline Rules](/api-reference/reference/deadline-rules) to inspect the underlying rules, renewal cycles, and statutory citations behind each computation.

## Request Body

<ParamField body="items" type="object[]" required>
  Marks to compute, max 1,000 items. Results are returned in the same order, with one `deadline_computation` per input item.

  <Expandable title="Item object">
    <ParamField body="jurisdiction" type="string" required>
      Deadline jurisdiction code, e.g. `US`, `EU`, or `WIPO`. Values are normalized to uppercase.
    </ParamField>

    <ParamField body="filing_route" type="string">
      Filing route. One of `national`, `regional`, or `madrid`. Defaults to `national`.
    </ParamField>

    <ParamField body="status" type="string">
      Trademark status. Defaults to `registered`. Accepted values are `filed`, `examining`, `pending_publication`, `published`, `opposition_period`, `pending_opposition`, `pending_cancellation`, `pending_issuance`, `registered`, `allowed`, `abandoned`, `withdrawn`, `surrendered`, `refused`, `cancelled`, `invalidated`, `expired`, or `unknown`.
    </ParamField>

    <ParamField body="filing_date" type="string | null">Filing date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="registration_date" type="string | null">Registration date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="grant_date" type="string | null">Grant date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="expiry_date" type="string | null">Current expiry date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="renewal_due_date" type="string | null">Known renewal due date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="designation_date" type="string | null">Madrid designation date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="protection_grant_date" type="string | null">Protection grant date as `YYYY-MM-DD`.</ParamField>
    <ParamField body="international_registration_date" type="string | null">Madrid international registration date as `YYYY-MM-DD`.</ParamField>
  </Expandable>
</ParamField>

<ParamField body="as_of_date" type="string">
  Calendar date to compute relative to, as `YYYY-MM-DD`. Defaults to today.
</ParamField>

<ParamField body="horizon_years" type="integer">
  How many years ahead to include. Minimum `1`, maximum `15`, default `5`.
</ParamField>

<ParamField body="include_optional" type="boolean">
  Include optional deadlines such as US Section 15 incontestability. Defaults to `true`.
</ParamField>

<ParamField body="include_missed" type="boolean">
  Include deadlines already past their grace period. Defaults to `false`.
</ParamField>

## Response

A standard list response with `data: DeadlineComputation[]`. Pagination is not used; `data[i]` corresponds to `items[i]`.

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

<ResponseField name="data" type="object[]">
  <Expandable title="DeadlineComputation">
    <ResponseField name="object" type="string">Always `deadline_computation`.</ResponseField>
    <ResponseField name="jurisdiction_code" type="string">Jurisdiction used for the computation.</ResponseField>
    <ResponseField name="filing_route" type="string">One of `national`, `regional`, or `madrid`.</ResponseField>
    <ResponseField name="supported" type="boolean">`true` when Signa has a deadline configuration for the jurisdiction.</ResponseField>
    <ResponseField name="unsupported_reason" type="string | null">`unsupported_jurisdiction` when no rule configuration exists, otherwise `null`.</ResponseField>

    <ResponseField name="deadlines" type="object[]">
      <Expandable title="ComputedDeadline">
        <ResponseField name="type" type="string">Deadline type code, e.g. `declaration_of_use` or `renewal`.</ResponseField>
        <ResponseField name="name" type="string">Human-readable deadline name.</ResponseField>
        <ResponseField name="jurisdiction_code" type="string">Jurisdiction for this deadline.</ResponseField>
        <ResponseField name="trigger_date" type="string">Date used as the computation trigger.</ResponseField>
        <ResponseField name="trigger_field" type="string">Input field used as the trigger, e.g. `registration_date`.</ResponseField>
        <ResponseField name="window_opens" type="string">First filing date for the deadline window.</ResponseField>
        <ResponseField name="due_date" type="string">Statutory due date.</ResponseField>
        <ResponseField name="grace_expiry" type="string">End of the grace period after the due date.</ResponseField>
        <ResponseField name="status" type="string">Deadline status: `future`, `window_open`, `due_soon`, `in_grace`, or `missed`.</ResponseField>
        <ResponseField name="days_until_due" type="integer">Calendar days from `as_of_date` to `due_date`.</ResponseField>
        <ResponseField name="days_until_grace_expiry" type="integer">Calendar days from `as_of_date` to `grace_expiry`.</ResponseField>
        <ResponseField name="urgency" type="string">Urgency bucket: `critical`, `upcoming`, `routine`, `overdue`, `in_grace`, or `missed`.</ResponseField>
        <ResponseField name="consequence_if_missed" type="string">Outcome if the deadline plus grace is missed, e.g. `cancellation` or `expiration`.</ResponseField>
        <ResponseField name="recurring" type="boolean">Whether the deadline repeats in later cycles.</ResponseField>
        <ResponseField name="optional" type="boolean">Whether the filing is optional.</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="has_more" type="boolean">Always `false`.</ResponseField>
<ResponseField name="pagination" type="object">Always `{ "cursor": null }`.</ResponseField>
<ResponseField name="request_id" type="string">Unique request identifier for support and debugging.</ResponseField>

Unsupported jurisdictions return `supported: false` with an empty `deadlines` array. Dead statuses such as `cancelled`, `expired`, or `abandoned` return `supported: true` with an empty `deadlines` array when the jurisdiction is supported.

<ResponseExample>
  ```json theme={null}
  {
    "object": "list",
    "data": [
      {
        "object": "deadline_computation",
        "jurisdiction_code": "US",
        "filing_route": "national",
        "supported": true,
        "unsupported_reason": null,
        "deadlines": [
          {
            "type": "declaration_of_use",
            "name": "Section 8 Declaration of Use",
            "jurisdiction_code": "US",
            "trigger_date": "2020-03-10",
            "trigger_field": "registration_date",
            "window_opens": "2025-03-10",
            "due_date": "2026-03-10",
            "grace_expiry": "2026-09-10",
            "status": "window_open",
            "days_until_due": 248,
            "days_until_grace_expiry": 432,
            "urgency": "routine",
            "consequence_if_missed": "cancellation",
            "recurring": false,
            "optional": false
          }
        ]
      }
    ],
    "has_more": false,
    "pagination": { "cursor": null },
    "request_id": "req_bT9kM3nP"
  }
  ```
</ResponseExample>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.signa.so/v1/deadlines/compute" \
    -H "Authorization: Bearer sig_xxxxxxxxxxxx" \
    -H "Content-Type: application/json" \
    -d '{
      "items": [
        {
          "jurisdiction": "US",
          "filing_date": "2019-01-15",
          "registration_date": "2020-03-10"
        }
      ],
      "as_of_date": "2025-07-05"
    }'
  ```

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

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

  const results = await signa.deadlines.compute({
    items: [{ jurisdiction: 'US', filing_date: '2019-01-15', registration_date: '2020-03-10' }]
  });

  for (const computation of results.data) {
    console.log(computation.jurisdiction_code, computation.deadlines.length);
  }
  ```

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

  resp = requests.post(
      "https://api.signa.so/v1/deadlines/compute",
      headers={
          "Authorization": "Bearer sig_xxxxxxxxxxxx",
          "Content-Type": "application/json",
      },
      json={
          "items": [
              {
                  "jurisdiction": "US",
                  "filing_date": "2019-01-15",
                  "registration_date": "2020-03-10",
              }
          ],
          "as_of_date": "2025-07-05",
      },
  )
  for computation in resp.json()["data"]:
      print(computation["jurisdiction_code"], len(computation["deadlines"]))
  ```
</CodeGroup>

## Errors

| Status | Type               | Description                                                                                                  |
| ------ | ------------------ | ------------------------------------------------------------------------------------------------------------ |
| 400    | `validation_error` | Malformed body, missing `items`, invalid date format, invalid enum value, or `horizon_years` outside `1..15` |
| 401    | `unauthorized`     | Missing or invalid API key                                                                                   |
| 403    | `forbidden`        | API key missing the `trademarks:read` scope                                                                  |
| 422    | `batch_too_large`  | More than 1,000 items. The error carries `item_count` and `item_count_limit`                                 |
| 429    | `rate_limited`     | Too many requests                                                                                            |

## Related Endpoints

* [List Deadline Rules](/api-reference/reference/deadline-rules) -- inspect the rule corpus and statutory citations
* [List Jurisdictions](/api-reference/reference/list-jurisdictions) -- jurisdiction overview
