Cast Office Votes
curl --request POST \
--url https://api.signa.so/v1/offices/votes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"office_codes": [
"<string>"
]
}
'import requests
url = "https://api.signa.so/v1/offices/votes"
payload = { "office_codes": ["<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({office_codes: ['<string>']})
};
fetch('https://api.signa.so/v1/offices/votes', 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/offices/votes",
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([
'office_codes' => [
'<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/offices/votes"
payload := strings.NewReader("{\n \"office_codes\": [\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/offices/votes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"office_codes\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/offices/votes")
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 \"office_codes\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "list",
"data": [
{
"object": "office_vote",
"office_code": "CL",
"office_status": "not_covered",
"created_at": "2026-08-29T12:00:00.000Z"
},
{
"object": "office_vote",
"office_code": "MX",
"office_status": "not_covered",
"created_at": "2026-08-29T12:00:00.000Z"
}
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_01kabc..."
}
Offices
Cast Office Votes
Vote for trademark offices you want on Signa
POST
/
v1
/
offices
/
votes
Cast Office Votes
curl --request POST \
--url https://api.signa.so/v1/offices/votes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"office_codes": [
"<string>"
]
}
'import requests
url = "https://api.signa.so/v1/offices/votes"
payload = { "office_codes": ["<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({office_codes: ['<string>']})
};
fetch('https://api.signa.so/v1/offices/votes', 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/offices/votes",
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([
'office_codes' => [
'<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/offices/votes"
payload := strings.NewReader("{\n \"office_codes\": [\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/offices/votes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"office_codes\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/offices/votes")
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 \"office_codes\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"object": "list",
"data": [
{
"object": "office_vote",
"office_code": "CL",
"office_status": "not_covered",
"created_at": "2026-08-29T12:00:00.000Z"
},
{
"object": "office_vote",
"office_code": "MX",
"office_status": "not_covered",
"created_at": "2026-08-29T12:00:00.000Z"
}
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_01kabc..."
}
Overview
Tell us which trademark offices your organization wants covered next — votes directly drive our coverage roadmap. Vote for as many offices as you like: each office counts once per organization, no matter how many times (or through how many API keys) you vote, so re-votes are harmless no-ops. The office-vote endpoints are the one write surface in the reference-data section —POST and DELETE both take the usual write ceremony: an Idempotency-Key header is required, and the request counts against the write rate bucket (responses carry the standard RateLimit-* headers).
Voting is free — POST and DELETE bill 0 units. Reading your votes back with List Office Votes bills 1 read unit.
Retrying with the same Idempotency-Key replays the cached response of that attempt; a new logical attempt — re-casting a vote you previously retracted, say — needs a fresh key. Either way the once-per-org, once-per-office counting is enforced server-side, so a fresh key can never double-count you.
Votable codes
Office codes are WIPO ST.3 two-letter codes. You can vote for:- Any ISO 3166-1 country code —
CL,MX,IN, … (UKis accepted and canonicalized toGB,ELtoGR). - Intergovernmental offices with no ISO country code:
BX(Benelux/BOIP),AP(ARIPO),OA(OAPI) — plusXK(Kosovo — ST.3-assigned, no ISO code), which is a national office rather than an IGO but is votable on the same footing. - Legacy lowercase office codes are accepted as aliases and canonicalized —
ukipo→GB,dpma→DE.
- Offices already covered by Signa — including
EM(EUIPO) andWO(WIPO), which are covered today. Voting for one returns400with anoffice_already_liveerror entry. (List Offices shows the offices currently serving data — an office that is covered but temporarily offline is absent from it, yet still not votable, so the rejection is the authoritative answer.) A dependent territory has no register of its own, so it resolves through the office that registers its marks —PR/GU→ USPTO,RE/GF→ INPI-FR,SJ→ NIPO,CX/CC/NF→ IP Australia — and a vote for it is a vote for that parent office: rejected as already covered when the parent is covered, otherwise stored under the parent’s code. - Codes with no trademark register of their own — uninhabited or non-filing territories such as
AQ(Antarctica),BV,HM,TF,GS,IO,UM, andPN. These return400with ano_trademark_registererror entry: there is nothing to connect, so there is nothing to vote for.
Body Parameters
string[]
required
Office codes to vote for (1–50). Any case; aliases are canonicalized. Codes your organization already voted for are no-ops.
Response
A list of the stored votes for every requested code — newly cast or pre-existing alike.created_at is when your organization first voted for that office.
string
Always
list.object[]
boolean
Always
false — the votable vocabulary is bounded, so results are a single page.{
"object": "list",
"data": [
{
"object": "office_vote",
"office_code": "CL",
"office_status": "not_covered",
"created_at": "2026-08-29T12:00:00.000Z"
},
{
"object": "office_vote",
"office_code": "MX",
"office_status": "not_covered",
"created_at": "2026-08-29T12:00:00.000Z"
}
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_01kabc..."
}
Code Examples
curl -X POST "https://api.signa.so/v1/offices/votes" \
-H "Authorization: Bearer sig_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: office-votes-cl-mx-001" \
-d '{ "office_codes": ["CL", "MX"] }'
import { Signa } from "@signa-so/sdk";
const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });
const votes = await signa.references.castOfficeVotes({ office_codes: ["CL", "MX"] });
for (const vote of votes.data) {
console.log(vote.office_code, vote.office_status, vote.created_at);
}
Errors
| Status | Type | Description |
|---|---|---|
| 400 | validation_error | One or more codes rejected: unknown_office_code (not a known office or country code), office_already_live (already covered by Signa, including territories of a covered office), no_trademark_register (no register of its own, e.g. AQ). Also an empty or over-50 office_codes array |
| 400 | validation_error | Missing Idempotency-Key header |
| 401 | unauthorized | Missing or invalid API key |
| 409 | conflict | Idempotency-Key reused with a different body |
| 409 | idempotency_processing | A request with the same Idempotency-Key is still in flight |
| 429 | rate_limited | Too many requests |
errors[], each with field: "office_codes" and one of the codes above.
Related Endpoints
- List Office Votes, read your organization’s votes back
- Retract Office Vote, remove a vote
- List Offices, the offices already covered by Signa