> ## Documentation Index
> Fetch the complete documentation index at: https://docs.signa.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Attorney

> Retrieve an attorney profile by ID

## 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

<ParamField path="id" type="string" required>
  Attorney ID prefixed with `att_` (e.g. `att_3kPq9X`).
</ParamField>

## Response

<ResponseField name="id" type="string">Attorney ID prefixed with `att_`.</ResponseField>
<ResponseField name="object" type="string">Always `attorney`.</ResponseField>
<ResponseField name="name" type="string">Display name of the attorney.</ResponseField>
<ResponseField name="canonical_name" type="string">Normalized name used for search and deduplication.</ResponseField>
<ResponseField name="firm_id" type="string | null">Firm ID prefixed with `firm_`, when the attorney is linked to a firm.</ResponseField>
<ResponseField name="firm_name" type="string | null">Convenience denormalization of the firm's display name.</ResponseField>
<ResponseField name="country_code" type="string | null">ISO 3166-1 alpha-2 country code.</ResponseField>

<ResponseField name="address" type="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.
</ResponseField>

<ResponseField name="trademark_count" type="integer">Total trademarks represented at mark grain.</ResponseField>
<ResponseField name="active_count" type="integer">Count of active trademarks (registered + pending). Always present; 0 when stats not yet computed.</ResponseField>

<ResponseField name="aliases" type="object[]">
  <Expandable title="Alias object">
    <ResponseField name="name" type="string">Alternate name observed in source data.</ResponseField>
    <ResponseField name="type" type="string">Alias source (e.g. office-reported, normalized).</ResponseField>
    <ResponseField name="source_office" type="string | null">Office that produced this alias.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="identifiers" type="object[]">Alternate office-issued identifiers (bar numbers, attorney docket IDs).</ResponseField>

<ResponseField name="stats" type="object | null">
  <Expandable title="Stats object">
    <ResponseField name="trademark_count" type="integer">Total trademarks represented. Counts marks: a Madrid IR family counts once, matching the default grouped `GET /v1/trademarks` listings.</ResponseField>
    <ResponseField name="registered_count" type="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.</ResponseField>
    <ResponseField name="pending_count" type="integer">Marks in pending status.</ResponseField>
    <ResponseField name="expired_count" type="integer">Expired marks.</ResponseField>
    <ResponseField name="cancelled_count" type="integer">Cancelled marks.</ResponseField>
    <ResponseField name="abandoned_count" type="integer">Abandoned marks.</ResponseField>
    <ResponseField name="grant_rate" type="number">Share of concluded prosecutions (registered + expired + cancelled) that were ever granted.</ResponseField>
    <ResponseField name="abandonment_rate" type="number">Share of marks abandoned.</ResponseField>
    <ResponseField name="jurisdiction_count" type="integer">Distinct jurisdictions.</ResponseField>
    <ResponseField name="earliest_filing" type="string | null">Earliest filing date observed.</ResponseField>
    <ResponseField name="latest_filing" type="string | null">Latest filing date observed.</ResponseField>
    <ResponseField name="avg_prosecution_days" type="number | null">Average prosecution duration in days.</ResponseField>
    <ResponseField name="computed_at" type="string">Timestamp when the stats snapshot was computed.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="created_at" type="string">ISO 8601 creation timestamp.</ResponseField>
<ResponseField name="updated_at" type="string">ISO 8601 last update timestamp.</ResponseField>
<ResponseField name="request_id" type="string">Unique request identifier for support and debugging.</ResponseField>

<Note>
  To enumerate an attorney's clients, use the dedicated [`GET /v1/attorneys/:id/clients`](/api-reference/parties/attorney-clients) endpoint.
</Note>

<ResponseExample>
  ```json Response theme={null}
  {
    "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": "uspto" }
    ],
    "identifiers": [
      { "type": "uspto_attorney_docket", "value": "JS-12345", "source_office": "uspto" }
    ],
    "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"
  }
  ```
</ResponseExample>

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.signa.so/v1/attorneys/att_3kPq9X" \
    -H "Authorization: Bearer sig_YOUR_KEY"
  ```

  ```typescript TypeScript theme={null}
  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);
  ```
</CodeGroup>

## 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

* [List Attorneys](/api-reference/parties/list-attorneys): filtered listing of attorneys
* [Attorney Trademarks](/api-reference/parties/attorney-trademarks): portfolio of marks an attorney represents
* [Attorney Clients](/api-reference/parties/attorney-clients): owners represented by an attorney
* [Get Firm](/api-reference/parties/get-firm): detail for the linked firm
