List Portfolio Deadlines
curl --request GET \
--url https://api.signa.so/v1/portfolios/{id}/deadlines \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/portfolios/{id}/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/portfolios/{id}/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/portfolios/{id}/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/portfolios/{id}/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/portfolios/{id}/deadlines")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/portfolios/{id}/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_bodyPortfolios
List Portfolio Deadlines
List deadlines computed from a portfolio’s trademark records
GET
/
v1
/
portfolios
/
{id}
/
deadlines
List Portfolio Deadlines
curl --request GET \
--url https://api.signa.so/v1/portfolios/{id}/deadlines \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/portfolios/{id}/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/portfolios/{id}/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/portfolios/{id}/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/portfolios/{id}/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/portfolios/{id}/deadlines")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/portfolios/{id}/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_bodyCredits: 1 per page.
Works for portfolios of up to 5,000 marks. Split larger portfolios.
See portfolio limits and references for current caps and
external_ref semantics.
Overview
Computes deadlines on demand and returns a paginated list. Each row identifies itstrademark_id and statutory
rule_id, with the deadline type, due date, and jurisdiction, plus the
effective_from, last_verified, sources[], trigger_date and
trigger_field provenance fields. sources[] carries the statutory citations
behind the rule, matching
Compute Deadlines.
This endpoint is an alias of List Deadlines
with portfolio_id fixed to {id}: same rows, same filters, same cursor.
The one deliberate difference is scope: this path requires portfolios:manage
alone, while GET /v1/deadlines?portfolio_id=... requires trademarks:read as
its base scope and portfolios:manage on top. A key holding only
portfolios:manage therefore reaches portfolio deadlines here and nowhere
else. This endpoint’s scope is unchanged from the day it shipped, and adding a
required scope to a published operation would break every such key.
Marks belonging to the synthetic canary office are excluded: they carry no
jurisdictional deadline rules, so no row could be acted on. This matches every
other deadline surface: GET /v1/deadlines, POST /v1/deadlines/compute, the
calendar download and the trademark detail route all treat those marks as
non-retrievable.
Marks whose deadlines could not be computed, or were computed only in part,
are named in the top-level unsupported_marks array on the first page (null
on continuation pages), for the whole portfolio. See
List Deadlines for the shape.
For a calendar file, use Download Portfolio Calendar.
Query Parameters
Usedue_before to bound the due date (default: 720 days after the computation
date), a comma-separated type to filter deadline types, urgency (critical,
upcoming, routine, in_grace, missed). Deadlines are computed five years
ahead: a due_before later than that lists rows only up to the horizon, and the
response carries warnings: [{ "code": "horizon_truncated" }] with a message
naming the horizon date.
due_before must be an ISO 8601 calendar date, YYYY-MM-DD (for example
2027-06-30). Anything else (a bare year, a datetime, free text) is rejected
with 400 validation_error. type is a closed set (renewal,
declaration_of_use, combined_renewal_and_use,
declaration_of_incontestability, restoration, international_renewal); an
unrecognized value is also a 400 validation_error rather than a silent empty
page.
The list is forward-looking by default and omits deadlines whose grace period
has already closed; urgency=missed selects exactly those rows instead. A renewal
cycle the office data proves paid (any cycle before the office-stated expiry, or
the cycle the office’s recorded renewal paid) is not missed and is never listed.
The signed cursor pins the computation date and binds the selector and
filters, so keep those parameters unchanged while paging. Cursors issued before
this endpoint moved to the shared deadline list return 400 cursor_expired;
restart at page one.