Retrieve Attorney
curl --request GET \
--url https://api.signa.so/v1/attorneys/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/attorneys/{id}"
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/attorneys/{id}', 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/attorneys/{id}",
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/attorneys/{id}"
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/attorneys/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/attorneys/{id}")
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_body{
"id": "att_3kPq9X",
"object": "attorney",
"name": "Jane Smith",
"canonical_name": "JANE SMITH",
"firm_id": "firm_2kLm9X",
"firm_name": "Smith & Partners LLP",
"firms": [
{ "id": "firm_2kLm9X", "name": "Smith & Partners LLP", "trademark_count": 310, "latest_filing_date": "2025-09-30" },
{ "id": "firm_8hTq2W", "name": "Baker Lane IP", "trademark_count": 32, "latest_filing_date": "2019-06-14" }
],
"country_code": "US",
"source_office_code": "US",
"trademark_count": 342,
"active_count": 328,
"address": {
"lines": ["100 Patent Way"],
"city": "Alexandria",
"region": "VA",
"postal_code": "22314",
"country_code": "US",
"formatted": null
},
"aliases": [
{ "name": "Jane M Smith", "type": "office_reported", "source_office_code": "US" }
],
"identifiers": [
{ "office_code": "US", "identifier": "JS-12345", "identifier_type": "attorney_docket_id" }
],
"stats": {
"trademark_count": 342,
"registered_count": 287,
"pending_count": 41,
"expired_count": 8,
"cancelled_count": 4,
"abandoned_count": 2,
"unknown_count": 0,
"grant_rate": 0.84,
"abandonment_rate": 0.006,
"jurisdiction_count": 7,
"earliest_filing_date": "2014-03-22",
"latest_filing_date": "2025-09-30",
"avg_prosecution_days": 312,
"computed_at": "2026-04-08T14:23:11Z"
},
"created_at": "2023-01-11T08:00:00Z",
"updated_at": "2026-04-08T14:23:11Z",
"request_id": "req_xyz789"
}
Attorneys
Retrieve Attorney
Retrieve an attorney profile by ID
GET
/
v1
/
attorneys
/
{id}
Retrieve Attorney
curl --request GET \
--url https://api.signa.so/v1/attorneys/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/attorneys/{id}"
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/attorneys/{id}', 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/attorneys/{id}",
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/attorneys/{id}"
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/attorneys/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/attorneys/{id}")
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_body{
"id": "att_3kPq9X",
"object": "attorney",
"name": "Jane Smith",
"canonical_name": "JANE SMITH",
"firm_id": "firm_2kLm9X",
"firm_name": "Smith & Partners LLP",
"firms": [
{ "id": "firm_2kLm9X", "name": "Smith & Partners LLP", "trademark_count": 310, "latest_filing_date": "2025-09-30" },
{ "id": "firm_8hTq2W", "name": "Baker Lane IP", "trademark_count": 32, "latest_filing_date": "2019-06-14" }
],
"country_code": "US",
"source_office_code": "US",
"trademark_count": 342,
"active_count": 328,
"address": {
"lines": ["100 Patent Way"],
"city": "Alexandria",
"region": "VA",
"postal_code": "22314",
"country_code": "US",
"formatted": null
},
"aliases": [
{ "name": "Jane M Smith", "type": "office_reported", "source_office_code": "US" }
],
"identifiers": [
{ "office_code": "US", "identifier": "JS-12345", "identifier_type": "attorney_docket_id" }
],
"stats": {
"trademark_count": 342,
"registered_count": 287,
"pending_count": 41,
"expired_count": 8,
"cancelled_count": 4,
"abandoned_count": 2,
"unknown_count": 0,
"grant_rate": 0.84,
"abandonment_rate": 0.006,
"jurisdiction_count": 7,
"earliest_filing_date": "2014-03-22",
"latest_filing_date": "2025-09-30",
"avg_prosecution_days": 312,
"computed_at": "2026-04-08T14:23:11Z"
},
"created_at": "2023-01-11T08:00:00Z",
"updated_at": "2026-04-08T14:23:11Z",
"request_id": "req_xyz789"
}
Credits: 1 per record.
Overview
Returns the full detail tier for a single attorney: canonical name, the firms its filings name, country, address, aliases, alternate identifiers (bar numbers and similar office-issued IDs), and computed practice statistics. There are no?include= parameters on this endpoint, the full detail is always returned.
If the attorney record was merged into another (entity resolution), the endpoint returns 410 entity_merged with the new ID in the error body.
Path Parameters
string
required
Attorney ID prefixed with
att_ (e.g. att_3kPq9X).Response
string
Attorney ID prefixed with
att_.string
Always
attorney.string
Display name of the attorney.
string
Normalized name used for search and deduplication.
string | null
Deprecated: use
firms. Firm ID (firm_...) on the attorney’s most recent current filing (by filing date) that names a firm; null when no filing names one.string | null
Deprecated: use
firms. Display name of that firm.object[]
Firms named on the attorney’s current filings, most trademarks first, at most 20; the firm in
firm_id is added when it ranks lower. Empty when no filing names a firm. An attorney who filed with several firms lists each of them.string | null
ISO 3166-1 alpha-2 country code.
string | null
WIPO ST.3 code of the office whose records this attorney row comes from (for example
US, EM, WO). Attorney records are per office: the same person appears once per office they file at, each row with its own source_office_code.object | null
Postal address on the attorney’s most recent current filing that carries one, in the one address shape:
lines[] (verbatim), city, region, postal_code, country_code and formatted (the office’s single-string rendering, or null). Components are filled only when the office supplied them; null when no filing carries an address. For WIPO (WO), Sweden (SE) and Italy (IT) attorneys, whose older filings were stored without an attorney address, it is the address the office holds for the representative when no filing address is on record.integer
Distinct marks represented (mark grain): a Madrid IR and its designations count once, matching the default grouped trademark listings. 0 when stats are not yet computed.
integer
Count of active trademarks (registered + pending). Always present; 0 when stats not yet computed.
object[]
object[]
Alternate office-issued identifiers (bar numbers, attorney docket IDs), each
{office_code, identifier, identifier_type}.object | null
Show Stats object
Show Stats object
integer
Total trademarks represented. Counts marks: a Madrid IR family counts once, matching the default grouped
GET /v1/trademarks listings.integer
Office records (record grain) in this status bucket. Every record is in exactly one of the six buckets (
registered, pending, expired, cancelled, abandoned, unknown), so the six counts sum to the records counted. A Madrid IR counts once per designation record, so the counts can sum to more than trademark_count. Includes records whose cancellation is pending (pending_cancellation): they stay registered until it is decided.integer
Office records (record grain) in this status bucket. Every record is in exactly one of the six buckets (
registered, pending, expired, cancelled, abandoned, unknown), so the six counts sum to the records counted. A Madrid IR counts once per designation record, so the counts can sum to more than trademark_count. Every stage before registration, including opposition_period and allowed.integer
Office records (record grain) in this status bucket. Every record is in exactly one of the six buckets (
registered, pending, expired, cancelled, abandoned, unknown), so the six counts sum to the records counted. A Madrid IR counts once per designation record, so the counts can sum to more than trademark_count.integer
Office records (record grain) in this status bucket. Every record is in exactly one of the six buckets (
registered, pending, expired, cancelled, abandoned, unknown), so the six counts sum to the records counted. A Madrid IR counts once per designation record, so the counts can sum to more than trademark_count. Includes surrendered and invalidated records.integer
Office records (record grain) in this status bucket. Every record is in exactly one of the six buckets (
registered, pending, expired, cancelled, abandoned, unknown), so the six counts sum to the records counted. A Madrid IR counts once per designation record, so the counts can sum to more than trademark_count. Includes withdrawn and refused records.integer
Office records (record grain) in this status bucket. Every record is in exactly one of the six buckets (
registered, pending, expired, cancelled, abandoned, unknown), so the six counts sum to the records counted. A Madrid IR counts once per designation record, so the counts can sum to more than trademark_count. Records whose office status is not known (status stage unknown).number
Share of concluded prosecutions (registered + expired + cancelled) that were ever granted. Record grain.
number
Share of concluded prosecutions (record grain) that ended abandoned, withdrawn or refused: abandoned / (registered + expired + cancelled + abandoned).
integer
Distinct offices among the records. A Madrid IR’s designations recorded by WIPO count as one office.
string | null
Earliest filing date observed.
string | null
Latest filing date observed.
number | null
Mean days from
filing_date to registration_date over records with both dates (record grain).string
When this stats row was last recomputed. The row only changes when a value changes.
string
ISO 8601 creation timestamp.
string
ISO 8601 last update timestamp.
string
Unique request identifier for support and debugging.
To enumerate an attorney’s clients, use the dedicated
GET /v1/attorneys/:id/clients endpoint.{
"id": "att_3kPq9X",
"object": "attorney",
"name": "Jane Smith",
"canonical_name": "JANE SMITH",
"firm_id": "firm_2kLm9X",
"firm_name": "Smith & Partners LLP",
"firms": [
{ "id": "firm_2kLm9X", "name": "Smith & Partners LLP", "trademark_count": 310, "latest_filing_date": "2025-09-30" },
{ "id": "firm_8hTq2W", "name": "Baker Lane IP", "trademark_count": 32, "latest_filing_date": "2019-06-14" }
],
"country_code": "US",
"source_office_code": "US",
"trademark_count": 342,
"active_count": 328,
"address": {
"lines": ["100 Patent Way"],
"city": "Alexandria",
"region": "VA",
"postal_code": "22314",
"country_code": "US",
"formatted": null
},
"aliases": [
{ "name": "Jane M Smith", "type": "office_reported", "source_office_code": "US" }
],
"identifiers": [
{ "office_code": "US", "identifier": "JS-12345", "identifier_type": "attorney_docket_id" }
],
"stats": {
"trademark_count": 342,
"registered_count": 287,
"pending_count": 41,
"expired_count": 8,
"cancelled_count": 4,
"abandoned_count": 2,
"unknown_count": 0,
"grant_rate": 0.84,
"abandonment_rate": 0.006,
"jurisdiction_count": 7,
"earliest_filing_date": "2014-03-22",
"latest_filing_date": "2025-09-30",
"avg_prosecution_days": 312,
"computed_at": "2026-04-08T14:23:11Z"
},
"created_at": "2023-01-11T08:00:00Z",
"updated_at": "2026-04-08T14:23:11Z",
"request_id": "req_xyz789"
}
Code Examples
curl "https://api.signa.so/v1/attorneys/att_3kPq9X" \
-H "Authorization: Bearer sig_YOUR_KEY"
import { Signa } from "@signa-so/sdk";
const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });
const attorney = await signa.attorneys.retrieve("att_3kPq9X");
console.log(attorney.name, attorney.firms.map((f) => f.name));
Related Endpoints
- Search Attorneys: filtered listing of attorneys
- Attorney Trademarks: portfolio of marks an attorney represents
- Attorney Clients: owners represented by an attorney
- Retrieve Firm: detail for a firm in
firms