Download Portfolio Calendar
curl --request GET \
--url https://api.signa.so/v1/portfolios/{id}/deadlines.ics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/portfolios/{id}/deadlines.ics"
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.ics', 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.ics",
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.ics"
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.ics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/portfolios/{id}/deadlines.ics")
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
Download Portfolio Calendar
Download computed deadlines as an iCalendar file
GET
/
v1
/
portfolios
/
{id}
/
deadlines.ics
Download Portfolio Calendar
curl --request GET \
--url https://api.signa.so/v1/portfolios/{id}/deadlines.ics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/portfolios/{id}/deadlines.ics"
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.ics', 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.ics",
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.ics"
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.ics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/portfolios/{id}/deadlines.ics")
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 request.
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
Returns a one-time RFC 5545 calendar file withContent-Type: text/calendar and
Content-Disposition: attachment. Download it using your bearer API key, then
import the file into your calendar application. This is not a subscribable
calendar URL: the endpoint requires an Authorization header. Importing the file
does not keep it synchronized with later changes.
The file carries the same deadlines as the
JSON list, so marks belonging to the
synthetic canary office are excluded here too: they carry no jurisdictional
deadline rules, and no event could be acted on.
A calendar file can only hold dated events, so it cannot say which marks are
missing from it. A mark whose deadlines could not be computed (for example an
unmodelled jurisdiction, or a record without the date the statute needs) has no
events, and a rule declined for want of its anchor has no event either. To see
which marks and rules are missing and why, read unsupported_marks on the
first page of the JSON list.
Event identity
Each event’sUID is tm_<id>:<occurrence_key>@signa.so, the trademark ID plus the deadline row’s stable occurrence_key (see List Portfolio Deadlines). Re-importing a newer file therefore updates an event whose due date was corrected instead of adding a duplicate. The UID format changed in the provenance release: a file downloaded after it adds every event again next to the ones imported earlier, so delete those once.
Event contents
SUMMARYnames the deadline, the mark and its office with the mark’s number (the registration number, else the application number, else the international registration number), so marks with the same name stay apart.DTSTARTis the due date. For a deadline already in its grace period it is the grace period’s last day instead, so the event and its alarms are still ahead of you;DESCRIPTIONthen gives the passed due date.URLlinks to the office’s own record when the office serves a working link.- Long lines are folded at 75 octets, as RFC 5545 requires.
Query Parameters
Optionalreminder_days is a comma-separated list of offsets, each from 1 to 3,650
days. The default is 90,30,7. These become alarms inside the downloaded file;
Signa does not send calendar reminders from this endpoint.
Code Example
curl "https://api.signa.so/v1/portfolios/$PORTFOLIO_ID/deadlines.ics" \
-H "Authorization: Bearer $SIGNA_API_KEY" \
--output portfolio-deadlines.ics