> ## 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. 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_YOUR_KEY" \
    -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 theme={null}
  import { Signa } from "@signa-so/sdk";

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

  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);
  }
  ```
</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
