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",
"country_code": "US",
"trademark_count": 342,
"active_count": 328,
"address": {
"lines": ["100 Patent Way"],
"city": "Alexandria",
"state": "VA",
"postal_code": "22314",
"country_code": "US"
},
"aliases": [
{ "name": "Jane M Smith", "type": "office_reported", "source_office": "US" }
],
"identifiers": [
{ "type": "uspto_attorney_docket", "value": "JS-12345", "source_office": "US" }
],
"stats": {
"trademark_count": 342,
"registered_count": 287,
"pending_count": 41,
"expired_count": 8,
"cancelled_count": 4,
"abandoned_count": 2,
"grant_rate": 0.84,
"abandonment_rate": 0.006,
"jurisdiction_count": 7,
"earliest_filing": "2014-03-22",
"latest_filing": "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",
"country_code": "US",
"trademark_count": 342,
"active_count": 328,
"address": {
"lines": ["100 Patent Way"],
"city": "Alexandria",
"state": "VA",
"postal_code": "22314",
"country_code": "US"
},
"aliases": [
{ "name": "Jane M Smith", "type": "office_reported", "source_office": "US" }
],
"identifiers": [
{ "type": "uspto_attorney_docket", "value": "JS-12345", "source_office": "US" }
],
"stats": {
"trademark_count": 342,
"registered_count": 287,
"pending_count": 41,
"expired_count": 8,
"cancelled_count": 4,
"abandoned_count": 2,
"grant_rate": 0.84,
"abandonment_rate": 0.006,
"jurisdiction_count": 7,
"earliest_filing": "2014-03-22",
"latest_filing": "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"
}
Overview
Returns the full detail tier for a single attorney: canonical name, firm linkage, 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
Firm ID prefixed with
firm_, when the attorney is linked to a firm.string | null
Convenience denormalization of the firm’s display name.
string | null
ISO 3166-1 alpha-2 country code.
object | string | null
Postal address as reported by the source office. Shape varies by office: most return a structured object (
lines[], city, state, postal_code, country_code); some offices provide only a free-text string.integer
Total trademarks represented at mark grain.
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).
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
Currently registered marks, counted per office record. For Madrid-heavy portfolios this may exceed
trademark_count, since trademark_count counts distinct marks while status counts are per office record.integer
Marks in pending status.
integer
Expired marks.
integer
Cancelled marks.
integer
Abandoned marks.
number
Share of concluded prosecutions (registered + expired + cancelled) that were ever granted.
number
Share of marks abandoned.
integer
Distinct jurisdictions.
string | null
Earliest filing date observed.
string | null
Latest filing date observed.
number | null
Average prosecution duration in days.
string
Timestamp when the stats snapshot was computed.
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",
"country_code": "US",
"trademark_count": 342,
"active_count": 328,
"address": {
"lines": ["100 Patent Way"],
"city": "Alexandria",
"state": "VA",
"postal_code": "22314",
"country_code": "US"
},
"aliases": [
{ "name": "Jane M Smith", "type": "office_reported", "source_office": "US" }
],
"identifiers": [
{ "type": "uspto_attorney_docket", "value": "JS-12345", "source_office": "US" }
],
"stats": {
"trademark_count": 342,
"registered_count": 287,
"pending_count": 41,
"expired_count": 8,
"cancelled_count": 4,
"abandoned_count": 2,
"grant_rate": 0.84,
"abandonment_rate": 0.006,
"jurisdiction_count": 7,
"earliest_filing": "2014-03-22",
"latest_filing": "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.firm_id);
Errors
| Status | Type | Description |
|---|---|---|
| 400 | validation_error | Invalid id format |
| 401 | unauthorized | Missing or invalid API key |
| 403 | forbidden | API key lacks the trademarks:read scope |
| 404 | not_found | Attorney ID does not exist |
| 410 | entity_merged | Attorney was merged into another. The new ID is returned in the error detail. |
| 429 | rate_limited | Rate limit exceeded |
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 the linked firm