Compute Deadlines
curl --request POST \
--url https://api.signa.so/v1/deadlines/compute \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"jurisdiction": "<string>",
"filing_route": "<string>",
"status": "<string>",
"filing_date": {},
"registration_date": {},
"grant_date": {},
"expiry_date": {},
"renewal_due_date": {},
"designation_date": {},
"protection_grant_date": {},
"international_registration_date": {}
}
],
"as_of_date": "<string>",
"horizon_years": 123,
"include_optional": true,
"include_missed": true
}
'import requests
url = "https://api.signa.so/v1/deadlines/compute"
payload = {
"items": [
{
"jurisdiction": "<string>",
"filing_route": "<string>",
"status": "<string>",
"filing_date": {},
"registration_date": {},
"grant_date": {},
"expiry_date": {},
"renewal_due_date": {},
"designation_date": {},
"protection_grant_date": {},
"international_registration_date": {}
}
],
"as_of_date": "<string>",
"horizon_years": 123,
"include_optional": True,
"include_missed": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
jurisdiction: '<string>',
filing_route: '<string>',
status: '<string>',
filing_date: {},
registration_date: {},
grant_date: {},
expiry_date: {},
renewal_due_date: {},
designation_date: {},
protection_grant_date: {},
international_registration_date: {}
}
],
as_of_date: '<string>',
horizon_years: 123,
include_optional: true,
include_missed: true
})
};
fetch('https://api.signa.so/v1/deadlines/compute', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.signa.so/v1/deadlines/compute",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
'jurisdiction' => '<string>',
'filing_route' => '<string>',
'status' => '<string>',
'filing_date' => [
],
'registration_date' => [
],
'grant_date' => [
],
'expiry_date' => [
],
'renewal_due_date' => [
],
'designation_date' => [
],
'protection_grant_date' => [
],
'international_registration_date' => [
]
]
],
'as_of_date' => '<string>',
'horizon_years' => 123,
'include_optional' => true,
'include_missed' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/deadlines/compute"
payload := strings.NewReader("{\n \"items\": [\n {\n \"jurisdiction\": \"<string>\",\n \"filing_route\": \"<string>\",\n \"status\": \"<string>\",\n \"filing_date\": {},\n \"registration_date\": {},\n \"grant_date\": {},\n \"expiry_date\": {},\n \"renewal_due_date\": {},\n \"designation_date\": {},\n \"protection_grant_date\": {},\n \"international_registration_date\": {}\n }\n ],\n \"as_of_date\": \"<string>\",\n \"horizon_years\": 123,\n \"include_optional\": true,\n \"include_missed\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.signa.so/v1/deadlines/compute")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"jurisdiction\": \"<string>\",\n \"filing_route\": \"<string>\",\n \"status\": \"<string>\",\n \"filing_date\": {},\n \"registration_date\": {},\n \"grant_date\": {},\n \"expiry_date\": {},\n \"renewal_due_date\": {},\n \"designation_date\": {},\n \"protection_grant_date\": {},\n \"international_registration_date\": {}\n }\n ],\n \"as_of_date\": \"<string>\",\n \"horizon_years\": 123,\n \"include_optional\": true,\n \"include_missed\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/deadlines/compute")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"jurisdiction\": \"<string>\",\n \"filing_route\": \"<string>\",\n \"status\": \"<string>\",\n \"filing_date\": {},\n \"registration_date\": {},\n \"grant_date\": {},\n \"expiry_date\": {},\n \"renewal_due_date\": {},\n \"designation_date\": {},\n \"protection_grant_date\": {},\n \"international_registration_date\": {}\n }\n ],\n \"as_of_date\": \"<string>\",\n \"horizon_years\": 123,\n \"include_optional\": true,\n \"include_missed\": true\n}"
response = http.request(request)
puts response.read_body{
"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"
}
Deadlines
Compute Deadlines
Compute trademark maintenance deadlines without persisting data
POST
/
v1
/
deadlines
/
compute
Compute Deadlines
curl --request POST \
--url https://api.signa.so/v1/deadlines/compute \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"jurisdiction": "<string>",
"filing_route": "<string>",
"status": "<string>",
"filing_date": {},
"registration_date": {},
"grant_date": {},
"expiry_date": {},
"renewal_due_date": {},
"designation_date": {},
"protection_grant_date": {},
"international_registration_date": {}
}
],
"as_of_date": "<string>",
"horizon_years": 123,
"include_optional": true,
"include_missed": true
}
'import requests
url = "https://api.signa.so/v1/deadlines/compute"
payload = {
"items": [
{
"jurisdiction": "<string>",
"filing_route": "<string>",
"status": "<string>",
"filing_date": {},
"registration_date": {},
"grant_date": {},
"expiry_date": {},
"renewal_due_date": {},
"designation_date": {},
"protection_grant_date": {},
"international_registration_date": {}
}
],
"as_of_date": "<string>",
"horizon_years": 123,
"include_optional": True,
"include_missed": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
jurisdiction: '<string>',
filing_route: '<string>',
status: '<string>',
filing_date: {},
registration_date: {},
grant_date: {},
expiry_date: {},
renewal_due_date: {},
designation_date: {},
protection_grant_date: {},
international_registration_date: {}
}
],
as_of_date: '<string>',
horizon_years: 123,
include_optional: true,
include_missed: true
})
};
fetch('https://api.signa.so/v1/deadlines/compute', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.signa.so/v1/deadlines/compute",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
'jurisdiction' => '<string>',
'filing_route' => '<string>',
'status' => '<string>',
'filing_date' => [
],
'registration_date' => [
],
'grant_date' => [
],
'expiry_date' => [
],
'renewal_due_date' => [
],
'designation_date' => [
],
'protection_grant_date' => [
],
'international_registration_date' => [
]
]
],
'as_of_date' => '<string>',
'horizon_years' => 123,
'include_optional' => true,
'include_missed' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/deadlines/compute"
payload := strings.NewReader("{\n \"items\": [\n {\n \"jurisdiction\": \"<string>\",\n \"filing_route\": \"<string>\",\n \"status\": \"<string>\",\n \"filing_date\": {},\n \"registration_date\": {},\n \"grant_date\": {},\n \"expiry_date\": {},\n \"renewal_due_date\": {},\n \"designation_date\": {},\n \"protection_grant_date\": {},\n \"international_registration_date\": {}\n }\n ],\n \"as_of_date\": \"<string>\",\n \"horizon_years\": 123,\n \"include_optional\": true,\n \"include_missed\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.signa.so/v1/deadlines/compute")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"jurisdiction\": \"<string>\",\n \"filing_route\": \"<string>\",\n \"status\": \"<string>\",\n \"filing_date\": {},\n \"registration_date\": {},\n \"grant_date\": {},\n \"expiry_date\": {},\n \"renewal_due_date\": {},\n \"designation_date\": {},\n \"protection_grant_date\": {},\n \"international_registration_date\": {}\n }\n ],\n \"as_of_date\": \"<string>\",\n \"horizon_years\": 123,\n \"include_optional\": true,\n \"include_missed\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/deadlines/compute")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"jurisdiction\": \"<string>\",\n \"filing_route\": \"<string>\",\n \"status\": \"<string>\",\n \"filing_date\": {},\n \"registration_date\": {},\n \"grant_date\": {},\n \"expiry_date\": {},\n \"renewal_due_date\": {},\n \"designation_date\": {},\n \"protection_grant_date\": {},\n \"international_registration_date\": {}\n }\n ],\n \"as_of_date\": \"<string>\",\n \"horizon_years\": 123,\n \"include_optional\": true,\n \"include_missed\": true\n}"
response = http.request(request)
puts response.read_body{
"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"
}
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 to inspect the underlying rules, renewal cycles, and statutory citations behind each computation.Request Body
object[]
required
Marks to compute, max 1,000 items. Results are returned in the same order, with one
deadline_computation per input item.Show Item object
Show Item object
string
required
Deadline jurisdiction code, e.g.
US, EU, or WIPO. Values are normalized to uppercase.string
Filing route. One of
national, regional, or madrid. Defaults to national.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.string | null
Filing date as
YYYY-MM-DD.string | null
Registration date as
YYYY-MM-DD.string | null
Grant date as
YYYY-MM-DD.string | null
Current expiry date as
YYYY-MM-DD.string | null
Known renewal due date as
YYYY-MM-DD.string | null
Madrid designation date as
YYYY-MM-DD.string | null
Protection grant date as
YYYY-MM-DD.string | null
Madrid international registration date as
YYYY-MM-DD.string
Calendar date to compute relative to, as
YYYY-MM-DD. Defaults to today.integer
How many years ahead to include. Minimum
1, maximum 15, default 5.boolean
Include optional deadlines such as US Section 15 incontestability. Defaults to
true.boolean
Include deadlines already past their grace period. Defaults to
false.Response
A standard list response withdata: DeadlineComputation[]. Pagination is not used; data[i] corresponds to items[i].
string
Always
list.object[]
Show DeadlineComputation
Show DeadlineComputation
string
Always
deadline_computation.string
Jurisdiction used for the computation.
string
One of
national, regional, or madrid.boolean
true when Signa has a deadline configuration for the jurisdiction.string | null
unsupported_jurisdiction when no rule configuration exists, otherwise null.object[]
Show ComputedDeadline
Show ComputedDeadline
string
Deadline type code, e.g.
declaration_of_use or renewal.string
Human-readable deadline name.
string
Jurisdiction for this deadline.
string
Date used as the computation trigger.
string
Input field used as the trigger, e.g.
registration_date.string
First filing date for the deadline window.
string
Statutory due date.
string
End of the grace period after the due date.
string
Deadline status:
future, window_open, due_soon, in_grace, or missed.integer
Calendar days from
as_of_date to due_date.integer
Calendar days from
as_of_date to grace_expiry.string
Urgency bucket:
critical, upcoming, routine, overdue, in_grace, or missed.string
Outcome if the deadline plus grace is missed, e.g.
cancellation or expiration.boolean
Whether the deadline repeats in later cycles.
boolean
Whether the filing is optional.
boolean
Always
false.object
Always
{ "cursor": null }.string
Unique request identifier for support and debugging.
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.
{
"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"
}
Code Examples
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"
}'
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);
}
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, inspect the rule corpus and statutory citations
- List Jurisdictions, jurisdiction overview
⌘I