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

# Read one history record

> Read one identification, user, visitor, device, or IP.

Reads one record. `{domain_id}` comes from [Domain](https://docs.shieldlabs.ai/api/history-domain.md). `{resource}` is `identifications`, `user`, `visitor`, `device`, or `ip`.

```bash theme={null}
curl 'https://account.shieldlabs.ai/api/v1/domains/7c9e6679-7425-40de-944b-e07fc1f90ae7/history/identifications/550e8400-e29b-41d4-a716-446655440000' \
  -H "Authorization: Bearer $SHIELDLABS_API_KEY"
```

```json theme={null}
{
  "data": {
    "type": "identification",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "risk": {
      "state": "ok",
      "band": "suspicious",
      "score": 30
    },
    "signals": {
      "state": "ok",
      "items": ["vpn"]
    }
  }
}
```

## Authentication

**Authorization** `string` *required*

`Bearer PRIVATE_API_KEY`. Use the domain's Private API Key.

A missing identification returns `404`. For a new Identification ID, use a bounded retry or an SDK retrieval helper. Bind the result to the expected domain, account and protected action before using it.

## Path parameters

**domain\_id** `string` *required*

Public domain id from [Domain](https://docs.shieldlabs.ai/api/history-domain.md).

**resource** `string` *required*

`identifications`, `user`, `visitor`, `device`, or `ip`.

**resource\_id** `string` *required*

The record id. URL-encode it once. An IP is IPv4.

A hostname, `all`, an empty id, `.` or `..`, a slash, a backslash, or a control character is rejected.

## Query parameters

**device\_id\_source** `string`

Only on a device record: `legacy` or `fp21_record`.

**relation** `string`

Linked records on this card, with `relation_limit` and `relation_page_token`.

List filters such as `from`, `to`, `risk_bands`, and `is_vpn` also apply. See [Search](https://docs.shieldlabs.ai/api/history-search.md#query-parameters).

## Response

One record returns `{ "data": { ... } }`. Successful responses also send `History-Snapshot`, `History-Snapshot-Expires-At`, `History-Window-From`, and `History-Window-To`.

**data** `object` *required*

The card. See [History card](https://docs.shieldlabs.ai/api/models.md#history-card).

History and webhooks have different field names:

| History card | Scored webhook `data` |
| - | - |
| `id` when `type` is `identification` | `identification_id` |
| `risk.score` when `risk.state` is `ok` | `risk_score` |
| `risk.band` | Trusted, Suspicious or Dangerous label for that score |
| `signals.items` | Signal names in `signals`. The webhook also includes each contribution. |

The read does not consume identification quota. The History API allows 15 requests per second per domain.

## Errors

| Status | Code | Meaning |
| - | - | - |
| `400` | `invalid_query` / `invalid_domain_scope` / `invalid_id` | Bad parameter, hostname, or id |
| `401` | auth message | Missing or invalid Private API Key |
| `403` | `domain_scope_not_supported` | `all` is not a domain id |
| `404` | `not_found` / `unknown_domain` | No such record or domain |
| `429` | rate limit | Domain request limit reached |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.