Batch Retrieve
curl --request POST \
--url https://api.signa.so/v1/trademarks/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"<string>"
],
"identifiers": [
{
"application_number": "<string>",
"registration_number": "<string>",
"ir_number": "<string>",
"office_code": "<string>"
}
],
"include": [
"<string>"
]
}
'import requests
url = "https://api.signa.so/v1/trademarks/batch"
payload = {
"ids": ["<string>"],
"identifiers": [
{
"application_number": "<string>",
"registration_number": "<string>",
"ir_number": "<string>",
"office_code": "<string>"
}
],
"include": ["<string>"]
}
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({
ids: ['<string>'],
identifiers: [
{
application_number: '<string>',
registration_number: '<string>',
ir_number: '<string>',
office_code: '<string>'
}
],
include: ['<string>']
})
};
fetch('https://api.signa.so/v1/trademarks/batch', 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/trademarks/batch",
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([
'ids' => [
'<string>'
],
'identifiers' => [
[
'application_number' => '<string>',
'registration_number' => '<string>',
'ir_number' => '<string>',
'office_code' => '<string>'
]
],
'include' => [
'<string>'
]
]),
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/trademarks/batch"
payload := strings.NewReader("{\n \"ids\": [\n \"<string>\"\n ],\n \"identifiers\": [\n {\n \"application_number\": \"<string>\",\n \"registration_number\": \"<string>\",\n \"ir_number\": \"<string>\",\n \"office_code\": \"<string>\"\n }\n ],\n \"include\": [\n \"<string>\"\n ]\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/trademarks/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"<string>\"\n ],\n \"identifiers\": [\n {\n \"application_number\": \"<string>\",\n \"registration_number\": \"<string>\",\n \"ir_number\": \"<string>\",\n \"office_code\": \"<string>\"\n }\n ],\n \"include\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/trademarks/batch")
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 \"ids\": [\n \"<string>\"\n ],\n \"identifiers\": [\n {\n \"application_number\": \"<string>\",\n \"registration_number\": \"<string>\",\n \"ir_number\": \"<string>\",\n \"office_code\": \"<string>\"\n }\n ],\n \"include\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "list",
"data": [
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"grain": "mark",
"mark_text": "AURORA",
"status": {
"primary": "active",
"stage": "registered",
"reason": null,
"challenges": [],
"effective_date": "2025-03-04",
"basis": "office",
"raw": { "code": "700", "label": null }
},
"office_code": "US",
"jurisdiction_code": "US",
"office_record_id": "97123456",
"office_url": "https://tsdr.uspto.gov/#caseNumber=97123456",
"application_number": "97123456",
"registration_number": "6789012",
"filing_date": "2023-11-02",
"registration_date": "2025-03-04",
"expiry_date": null,
"renewal_due_date": null,
"owners": [
{
"id": "own_R3jK9mN2",
"name": "Aurora Digital Inc.",
"country_code": "US",
"legal_form": "corporation",
"entity_id": null,
"role": "owner",
"is_current": true,
"address": {
"lines": ["500 Market Street"],
"city": "SAN FRANCISCO",
"region": "CA",
"postal_code": "94105",
"country_code": "US",
"formatted": null
}
}
],
"derived": {
"ruleset_version": "rs_7ea3d965e3e4",
"as_of_date": "2026-10-02",
"expiry_date": "2035-03-04",
"term": {
"state": "in_term",
"grace_expiry_date": "2035-09-04",
"restoration_expiry_date": null,
"renewed": false
},
"next_deadline": {
"occurrence_key": "us_declaration_of_use_s8:1",
"rule_id": "us_declaration_of_use_s8",
"type": "declaration_of_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": false,
"consequence_if_missed": "cancellation"
},
"deadlines": {
"supported": true,
"reason": null,
"unsupported_rules": [],
"items": [
{
"occurrence_key": "us_declaration_of_incontestability_s15:1",
"rule_id": "us_declaration_of_incontestability_s15",
"type": "declaration_of_incontestability",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-03-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": true,
"consequence_if_missed": "none"
},
{
"occurrence_key": "us_declaration_of_use_s8:1",
"rule_id": "us_declaration_of_use_s8",
"type": "declaration_of_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": false,
"consequence_if_missed": "cancellation"
},
{
"occurrence_key": "us_renewal_s9:1",
"rule_id": "us_renewal_s9",
"type": "combined_renewal_and_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2034-03-04",
"due_date": "2035-03-05",
"due_date_adjustment": "moved",
"grace_expiry_date": "2035-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": true,
"is_optional": false,
"consequence_if_missed": "cancellation_and_expiration"
},
{
"occurrence_key": "us_renewal_s9:2",
"rule_id": "us_renewal_s9",
"type": "combined_renewal_and_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2044-03-04",
"due_date": "2045-03-06",
"due_date_adjustment": "moved",
"grace_expiry_date": "2045-09-05",
"grace_expiry_adjustment": "moved",
"holiday_calendar": "uspto_dc",
"is_recurring": true,
"is_optional": false,
"consequence_if_missed": "cancellation_and_expiration"
}
]
},
"opposition_window": {
"supported": false,
"reason": "stage_not_opposable",
"rule_id": "us_opposition"
}
},
"events_count": 5,
"proceedings_count": { "contested": 0, "asserted": 0 },
"citations_count": 0
},
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"mark_text": "AURORA"
}
],
"not_found": ["tm_Zr5nK8jL"],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_bK1mN3pQ"
}
{
"object": "list",
"data": [
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"mark_text": "AURORA",
"office_code": "US",
"application_number": "97123456"
}
],
"not_found": [
{ "registration_number": "9999999", "office_code": "US" }
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_cL2nP4qR"
}
Retrieve
Batch Retrieve
Retrieve multiple trademarks by ID or office-native identifiers in a single request
POST
/
v1
/
trademarks
/
batch
Batch Retrieve
curl --request POST \
--url https://api.signa.so/v1/trademarks/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"<string>"
],
"identifiers": [
{
"application_number": "<string>",
"registration_number": "<string>",
"ir_number": "<string>",
"office_code": "<string>"
}
],
"include": [
"<string>"
]
}
'import requests
url = "https://api.signa.so/v1/trademarks/batch"
payload = {
"ids": ["<string>"],
"identifiers": [
{
"application_number": "<string>",
"registration_number": "<string>",
"ir_number": "<string>",
"office_code": "<string>"
}
],
"include": ["<string>"]
}
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({
ids: ['<string>'],
identifiers: [
{
application_number: '<string>',
registration_number: '<string>',
ir_number: '<string>',
office_code: '<string>'
}
],
include: ['<string>']
})
};
fetch('https://api.signa.so/v1/trademarks/batch', 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/trademarks/batch",
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([
'ids' => [
'<string>'
],
'identifiers' => [
[
'application_number' => '<string>',
'registration_number' => '<string>',
'ir_number' => '<string>',
'office_code' => '<string>'
]
],
'include' => [
'<string>'
]
]),
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/trademarks/batch"
payload := strings.NewReader("{\n \"ids\": [\n \"<string>\"\n ],\n \"identifiers\": [\n {\n \"application_number\": \"<string>\",\n \"registration_number\": \"<string>\",\n \"ir_number\": \"<string>\",\n \"office_code\": \"<string>\"\n }\n ],\n \"include\": [\n \"<string>\"\n ]\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/trademarks/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"<string>\"\n ],\n \"identifiers\": [\n {\n \"application_number\": \"<string>\",\n \"registration_number\": \"<string>\",\n \"ir_number\": \"<string>\",\n \"office_code\": \"<string>\"\n }\n ],\n \"include\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/trademarks/batch")
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 \"ids\": [\n \"<string>\"\n ],\n \"identifiers\": [\n {\n \"application_number\": \"<string>\",\n \"registration_number\": \"<string>\",\n \"ir_number\": \"<string>\",\n \"office_code\": \"<string>\"\n }\n ],\n \"include\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "list",
"data": [
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"grain": "mark",
"mark_text": "AURORA",
"status": {
"primary": "active",
"stage": "registered",
"reason": null,
"challenges": [],
"effective_date": "2025-03-04",
"basis": "office",
"raw": { "code": "700", "label": null }
},
"office_code": "US",
"jurisdiction_code": "US",
"office_record_id": "97123456",
"office_url": "https://tsdr.uspto.gov/#caseNumber=97123456",
"application_number": "97123456",
"registration_number": "6789012",
"filing_date": "2023-11-02",
"registration_date": "2025-03-04",
"expiry_date": null,
"renewal_due_date": null,
"owners": [
{
"id": "own_R3jK9mN2",
"name": "Aurora Digital Inc.",
"country_code": "US",
"legal_form": "corporation",
"entity_id": null,
"role": "owner",
"is_current": true,
"address": {
"lines": ["500 Market Street"],
"city": "SAN FRANCISCO",
"region": "CA",
"postal_code": "94105",
"country_code": "US",
"formatted": null
}
}
],
"derived": {
"ruleset_version": "rs_7ea3d965e3e4",
"as_of_date": "2026-10-02",
"expiry_date": "2035-03-04",
"term": {
"state": "in_term",
"grace_expiry_date": "2035-09-04",
"restoration_expiry_date": null,
"renewed": false
},
"next_deadline": {
"occurrence_key": "us_declaration_of_use_s8:1",
"rule_id": "us_declaration_of_use_s8",
"type": "declaration_of_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": false,
"consequence_if_missed": "cancellation"
},
"deadlines": {
"supported": true,
"reason": null,
"unsupported_rules": [],
"items": [
{
"occurrence_key": "us_declaration_of_incontestability_s15:1",
"rule_id": "us_declaration_of_incontestability_s15",
"type": "declaration_of_incontestability",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-03-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": true,
"consequence_if_missed": "none"
},
{
"occurrence_key": "us_declaration_of_use_s8:1",
"rule_id": "us_declaration_of_use_s8",
"type": "declaration_of_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": false,
"consequence_if_missed": "cancellation"
},
{
"occurrence_key": "us_renewal_s9:1",
"rule_id": "us_renewal_s9",
"type": "combined_renewal_and_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2034-03-04",
"due_date": "2035-03-05",
"due_date_adjustment": "moved",
"grace_expiry_date": "2035-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": true,
"is_optional": false,
"consequence_if_missed": "cancellation_and_expiration"
},
{
"occurrence_key": "us_renewal_s9:2",
"rule_id": "us_renewal_s9",
"type": "combined_renewal_and_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2044-03-04",
"due_date": "2045-03-06",
"due_date_adjustment": "moved",
"grace_expiry_date": "2045-09-05",
"grace_expiry_adjustment": "moved",
"holiday_calendar": "uspto_dc",
"is_recurring": true,
"is_optional": false,
"consequence_if_missed": "cancellation_and_expiration"
}
]
},
"opposition_window": {
"supported": false,
"reason": "stage_not_opposable",
"rule_id": "us_opposition"
}
},
"events_count": 5,
"proceedings_count": { "contested": 0, "asserted": 0 },
"citations_count": 0
},
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"mark_text": "AURORA"
}
],
"not_found": ["tm_Zr5nK8jL"],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_bK1mN3pQ"
}
{
"object": "list",
"data": [
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"mark_text": "AURORA",
"office_code": "US",
"application_number": "97123456"
}
],
"not_found": [
{ "registration_number": "9999999", "office_code": "US" }
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_cL2nP4qR"
}
Credits: 1 per record.
Overview
Fetch up to 100 trademarks in a single request. This is significantly more efficient than making individualGET /v1/trademarks/{id} calls when hydrating a list of known marks, e.g. after a search or when loading a portfolio view.
The endpoint accepts either:
ids: an array of Signa public IDs (tm_*), oridentifiers: an array of office-native identifiers (application number + office code, registration number + office code, or IR number).
ids or identifiers. Every submitted item is answered exactly once, in input order: items that resolve are in data, items that do not match any trademark are in not_found. An item submitted twice appears twice.
Batch is billed as read, 1 credit per submitted identifier, including the ones that come back in not_found. The reservation is taken before the lookup runs, so a batch of 100 needs 100 credits of balance; see Get Credit Pricing.
Request Body
string[]
Array of Signa trademark IDs (
tm_*), max 100. Mutually exclusive with identifiers.object[]
Array of office-native identifiers, max 100. Mutually exclusive with
ids. Each entry must include exactly one of:application_number+office_code(uppercase ST.3 office code, e.g.US; legacy lowercase likeusptoaccepted as an alias)registration_number+office_code(for an international registration, the IR number without anyWOprefix)ir_number(no office; Madrid IRs are global)
WO removed from an ir_number, when what is left is a number: 73/273,292, 1,201,370 and WO1874500 find 73273292, 1201370 and IR 1874500. A record stored with the separators always wins over the cleaned-up form. The response does not flag which form answered: each row in data carries the record’s own application_number, registration_number and ir_number, so compare those with what you sent when the difference matters.Show Identifier object
Show Identifier object
string[]
Optional detail projections, applied to every trademark in the response.
office_extensions includes each trademark’s office_extensions object (raw office-specific data), which is otherwise omitted. There is no fields= sparse projection on batch; each returned trademark is the full detail tier.Response
string
Always
list.object[]
Trademark detail-tier objects, one per submitted id or identifier that matched, in input order. An item submitted twice appears twice.
(string | object)[]
Inputs that could not be resolved, echoed verbatim in input order (malformed ids included). When
ids was supplied, this is an array of the unresolved Signa IDs. When identifiers was supplied, this is an array of the original identifier objects that did not match. Every submitted item is in exactly one of data or not_found.boolean
Always
false. Batch is not paginated.object
Always
{ "cursor": null }.string
Unique request identifier for support and debugging.
{
"object": "list",
"data": [
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"grain": "mark",
"mark_text": "AURORA",
"status": {
"primary": "active",
"stage": "registered",
"reason": null,
"challenges": [],
"effective_date": "2025-03-04",
"basis": "office",
"raw": { "code": "700", "label": null }
},
"office_code": "US",
"jurisdiction_code": "US",
"office_record_id": "97123456",
"office_url": "https://tsdr.uspto.gov/#caseNumber=97123456",
"application_number": "97123456",
"registration_number": "6789012",
"filing_date": "2023-11-02",
"registration_date": "2025-03-04",
"expiry_date": null,
"renewal_due_date": null,
"owners": [
{
"id": "own_R3jK9mN2",
"name": "Aurora Digital Inc.",
"country_code": "US",
"legal_form": "corporation",
"entity_id": null,
"role": "owner",
"is_current": true,
"address": {
"lines": ["500 Market Street"],
"city": "SAN FRANCISCO",
"region": "CA",
"postal_code": "94105",
"country_code": "US",
"formatted": null
}
}
],
"derived": {
"ruleset_version": "rs_7ea3d965e3e4",
"as_of_date": "2026-10-02",
"expiry_date": "2035-03-04",
"term": {
"state": "in_term",
"grace_expiry_date": "2035-09-04",
"restoration_expiry_date": null,
"renewed": false
},
"next_deadline": {
"occurrence_key": "us_declaration_of_use_s8:1",
"rule_id": "us_declaration_of_use_s8",
"type": "declaration_of_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": false,
"consequence_if_missed": "cancellation"
},
"deadlines": {
"supported": true,
"reason": null,
"unsupported_rules": [],
"items": [
{
"occurrence_key": "us_declaration_of_incontestability_s15:1",
"rule_id": "us_declaration_of_incontestability_s15",
"type": "declaration_of_incontestability",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-03-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": true,
"consequence_if_missed": "none"
},
{
"occurrence_key": "us_declaration_of_use_s8:1",
"rule_id": "us_declaration_of_use_s8",
"type": "declaration_of_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2030-03-04",
"due_date": "2031-03-04",
"due_date_adjustment": "unchanged",
"grace_expiry_date": "2031-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": false,
"is_optional": false,
"consequence_if_missed": "cancellation"
},
{
"occurrence_key": "us_renewal_s9:1",
"rule_id": "us_renewal_s9",
"type": "combined_renewal_and_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2034-03-04",
"due_date": "2035-03-05",
"due_date_adjustment": "moved",
"grace_expiry_date": "2035-09-04",
"grace_expiry_adjustment": "unchanged",
"holiday_calendar": "uspto_dc",
"is_recurring": true,
"is_optional": false,
"consequence_if_missed": "cancellation_and_expiration"
},
{
"occurrence_key": "us_renewal_s9:2",
"rule_id": "us_renewal_s9",
"type": "combined_renewal_and_use",
"jurisdiction_code": "US",
"trigger_date": "2025-03-04",
"trigger_field": "registration_date",
"window_opens": "2044-03-04",
"due_date": "2045-03-06",
"due_date_adjustment": "moved",
"grace_expiry_date": "2045-09-05",
"grace_expiry_adjustment": "moved",
"holiday_calendar": "uspto_dc",
"is_recurring": true,
"is_optional": false,
"consequence_if_missed": "cancellation_and_expiration"
}
]
},
"opposition_window": {
"supported": false,
"reason": "stage_not_opposable",
"rule_id": "us_opposition"
}
},
"events_count": 5,
"proceedings_count": { "contested": 0, "asserted": 0 },
"citations_count": 0
},
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"mark_text": "AURORA"
}
],
"not_found": ["tm_Zr5nK8jL"],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_bK1mN3pQ"
}
{
"object": "list",
"data": [
{
"id": "tm_8kLm2nPq",
"object": "trademark",
"mark_text": "AURORA",
"office_code": "US",
"application_number": "97123456"
}
],
"not_found": [
{ "registration_number": "9999999", "office_code": "US" }
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_cL2nP4qR"
}
Each
data item is the full Retrieve Trademark detail; the examples are abridged. The first example answers {"ids": ["tm_8kLm2nPq", "tm_8kLm2nPq", "tm_Zr5nK8jL"]}: the repeated id appears twice, and the unknown one is in not_found.Code Examples
curl -X POST "https://api.signa.so/v1/trademarks/batch" \
-H "Authorization: Bearer sig_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"ids": ["tm_8kLm2nPq", "tm_Xp4wQ7vR", "tm_Zr5nK8jL"]
}'
curl -X POST "https://api.signa.so/v1/trademarks/batch" \
-H "Authorization: Bearer sig_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"identifiers": [
{ "application_number": "97123456", "office_code": "US" },
{ "registration_number": "6789012", "office_code": "US" },
{ "ir_number": "1234567" }
]
}'
import { Signa } from "@signa-so/sdk";
const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });
const result = await signa.trademarks.batch({
identifiers: [
{ application_number: "97123456", office_code: "US" },
{ registration_number: "6789012", office_code: "US" },
{ ir_number: "1234567" },
],
});
console.log(`Resolved ${result.data.length}, missing ${result.not_found.length}`);
When to Use Batch vs. Individual Lookups
| Scenario | Recommended Approach |
|---|---|
| Display a single trademark detail page | Individual Retrieve Trademark |
| Hydrate a dashboard with 10-50 known IDs | Batch (this endpoint) |
| Sync a portfolio of trademarks periodically | Batch, chunked into groups of 100 |
| Search for trademarks matching criteria | Search Trademarks |
| Iterate through all trademarks in your org | Paginated Search Trademarks |
A batch request of 50 IDs counts as one request against your rate limit, not 50. Use batches whenever you know the IDs upfront. See Rate Limits.
Keep batch sizes at or below 100 items. Requests with more than 100 IDs are rejected with a
400 validation error.A batch request returns HTTP
200 even if some requested items are not found. Always check the not_found array to reconcile against your input list. For chunking strategies when you have more than 100 IDs, see the Bulk operations guide.Related Endpoints
- Retrieve Trademark: single trademark lookup
- Search Trademarks: filtered listing with pagination