List Deadlines
curl --request GET \
--url https://api.signa.so/v1/deadlines \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/deadlines"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signa.so/v1/deadlines', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/deadlines"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.signa.so/v1/deadlines")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/deadlines")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyDeadlines
List Deadlines
List computed maintenance deadlines for a portfolio or trademark
GET
/
v1
/
deadlines
List Deadlines
curl --request GET \
--url https://api.signa.so/v1/deadlines \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/deadlines"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signa.so/v1/deadlines', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.signa.so/v1/deadlines"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.signa.so/v1/deadlines")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/deadlines")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodySupply exactly one of
A single row looks like this:
portfolio_id or trademark_id. Every request requires
trademarks:read; a portfolio_id request additionally requires
portfolios:manage, and a key missing either scope gets 403 forbidden.
Portfolio requests return 404 for a portfolio outside your organization.
Trademark requests accept any retrievable mark.
Each page costs one read unit, with a default of 20 and a maximum of 100 rows.
Deadlines are computed when requested. Rows carry rule_id, effective_from,
last_verified, sources[], trigger_date, and trigger_field, alongside
trademark identity, due date, window opening, grace expiry and urgency.
sources[] holds the statutory citations behind the rule, the same ones
Compute Deadlines returns; join
rule_id to List Deadline Rules for
the full rule record. For prosecution deadlines, use
Compute Deadlines.
Filter with a comma-separated type, an inclusive due_before date (YYYY-MM-DD),
or urgency (critical, upcoming, routine, in_grace, missed). The list is
forward-looking by default and omits deadlines whose grace period has already
closed; urgency=missed selects exactly those rows instead.
The default cutoff is 720 days after the computation date, within a five-year
computation horizon. Portfolios are capped at 5,000 marks; split larger portfolios.
Results sort by due_date, trademark_id, then rule_id, all ascending. Follow
pagination.cursor while has_more is true. The signed cursor pins the computation
date and binds the selector and filters. Keep those parameters unchanged on the
next page. A cursor that fails to decode or verify — malformed, unsigned, minted
for another endpoint, or an old offset cursor — returns 400 cursor_expired; a
cursor that verifies but whose selector or filters have changed returns
400 cursor_invalid. Either way, restart at page one. Records and portfolio
membership may change between pages: the cursor pins the clock, not a historical
snapshot.
GET /v1/portfolios/{id}/deadlines is an alias using the same rows, filters and
cursor. Both paths preserve the portfolio list’s inclusive cutoff semantics, and
a cursor minted on one can be followed on the other. The alias differs in one
deliberate way: it requires portfolios:manage alone, without the base
trademarks:read this path also requires, because its scope is unchanged from
the day it shipped and adding a required scope to a published operation would
break existing keys.
const deadlines = await signa.deadlines.list({
portfolio_id: 'ptf_12345678-1234-1234-1234-123456789012',
type: ['renewal', 'international_renewal'],
limit: 100,
});
for await (const deadline of deadlines) {
console.log(deadline.trademark_id, deadline.due_date, deadline.rule_id);
}
{
"trademark_id": "tm_019d2141-6ce9-771b-872e-bc8b20e49fcf",
"rule_id": "us_declaration_of_use_s8",
"effective_from": null,
"last_verified": "2026-03-10",
"mark_text": "EXAMPLE",
"office_code": "US",
"type": "declaration_of_use",
"due_date": "2026-03-10",
"grace_expiry": "2026-09-10",
"window_opens": "2025-03-10",
"jurisdiction_code": "US",
"description": "Declaration of Use (Section 8)",
"trigger_date": "2020-03-10",
"trigger_field": "registration_date",
"urgency": "upcoming",
"sources": [
{
"citation": "15 U.S.C. § 1058(a) — registration term and affidavit requirement",
"url": "https://www.law.cornell.edu/uscode/text/15/1058"
}
]
}