# Individual Holmes

Query official bureaus and Stark Infra's internal datasets to investigate an individual (CPF). Each request targets a specific bureau by `type` and returns the structured payload of that bureau alongside a paging cursor.

Use Individual Holmes to run KYC, anti-fraud, judicial, sanctions and federal-revenue checks on a person before onboarding, granting credit or releasing a high-risk operation.

Every call is synchronous, scoped to your workspace and logged on Stark Infra's side — there is no resource lifecycle to track.

NOTE: Read [Core Concepts](https://docs.starkinfra.com/get-started/core-concepts.md) before continuing this guide.

**RESOURCE SUMMARY**

**Individual Holmes**Single GET endpoint that dispatches to one bureau per call and returns its raw, structured payload.

## Available Languages

Code samples on this page are in Python. The same content is available with samples in:

- [Python](https://docs.starkinfra.com/get-started/individual-holmes-python.md)
- [Node.js](https://docs.starkinfra.com/get-started/individual-holmes-node.md)
- [PHP](https://docs.starkinfra.com/get-started/individual-holmes-php.md)
- [Java](https://docs.starkinfra.com/get-started/individual-holmes-java.md)
- [Ruby](https://docs.starkinfra.com/get-started/individual-holmes-ruby.md)
- [Elixir](https://docs.starkinfra.com/get-started/individual-holmes-elixir.md)
- [.NET](https://docs.starkinfra.com/get-started/individual-holmes-dotnet.md)
- [Go](https://docs.starkinfra.com/get-started/individual-holmes-go.md)
- [Clojure](https://docs.starkinfra.com/get-started/individual-holmes-clojure.md)
- [cURL](https://docs.starkinfra.com/get-started/individual-holmes-curl.md)

## Setup

For each environment (Sandbox and Production):

1. Create an account at Stark Bank.

2. Get in touch with your account manager to enable Individual Holmes on your workspace — each bureau is contracted independently, so let us know which `type` values you intend to use.

3. Have the CPF you want to investigate ready in unmasked or masked form — Stark Infra normalizes both. For `type=internationalPep`, use the person's full name instead of a CPF.

4. Generate your ECDSA credentials by following [How to Create ECDSA Keys](https://docs.starkinfra.com/how-to-create-ecdsa-keys.md) and authenticate every request with the `Access-Id`, `Access-Time` and `Access-Signature` headers.

## Individual Holmes Overview

Individual Holmes investigates a person (CPF) against an external bureau or an internal dataset. Every request targets a specific bureau by `type`; the response wraps the bureau's raw payload under a key named exactly after the `type` you queried.

All bureaus are queried through the same endpoint signature, with the same validation pipeline and the same paging contract. Only the two JusBrasil bureaus — `civil` and `criminal` — return a real `cursor`; every other bureau returns `null` (or `[]` for `internationalPep`).

### Query an Individual Bureau

`GET /individual-holmes/:searchKey/:type`

Path params identify what to look up. The `searchKey` is a CPF (11 digits, masked or unmasked) for every bureau except `internationalPep`, where it is the person's full name. The `type` selects the bureau and the shape of the response.

Query params control paging. Only `civil` and `criminal` honour `cursor` — repeat the request with the returned cursor to fetch the next page.

**Parameters**

| Name | Required | Description |
| --- | --- | --- |
| `searchKey` | REQUIRED | CPF of the individual being investigated, masked or unmasked. Example: `012.345.678-90`. For the `internationalPep` bureau, send the person's full name instead. |
| `type` | REQUIRED | Bureau to query. Options: `civil`, `criminal`, `frauds`, `data`, `dict`, `kyc`, `nationalPep`, `internationalPep`, `jointResolution6`, `csnu`, `federalRevenueRegistry`, `deceased`, `negativeMedia`. |
| `limit` | OPTIONAL | Maximum number of items per page for paginated bureaus. Integer in the `1..100` range. Defaults to `100`. |
| `cursor` | OPTIONAL | Opaque page token returned by the previous call. Only meaningful for `civil` and `criminal`; ignored by every other bureau. |

### Response Envelope

Every successful response carries the bureau's payload under a key named after the `type` queried, plus a `cursor` field. The concrete envelope for each bureau is shown in the sections below.

**Cursor semantics:** populated only for `civil`/`criminal`. `null` for every other bureau. `[]` for `internationalPep` (it returns an array sentinel instead of a string cursor).

### Civil Lawsuits

Civil lawsuits sourced from JusBrasil. Paginated — repeat with the returned `cursor` until `null`. Returns a list of processes; `typification` is always `[]` for civil.

### Criminal Lawsuits

Same JusBrasil source as civil. Returns a list of processes with the same shape, but the `typification` field is populated with the criminal codes invoked.

### Fraud Score

Quod anti-fraud score for the CPF. Not paginated.

### Registration Data

BigDataCorp registration data (dataset `pessoas/registration_data`). Not paginated. Empty result returns `[]`.

### Pix User

Looks the CPF up on Stark Infra's internal Dict (Pix directory) microservice. Returns the raw `user` object on success.

### KYC & National PEP

Both `kyc` and `nationalPep` share the same BigDataCorp `pessoas/kyc` dataset and return the same payload. Not paginated. Empty result returns `{}`. The `history[]` is filtered to entries with `matchRate >= 80`.

### International PEP

Queries Stark's BigQuery PEP table. Unlike every other bureau, the `searchKey` is a **full name**, not a CPF — Stark Infra normalises it (uppercase, accents removed) before matching.

The result is an array of raw BigQuery rows. The page size is fixed at 1000 — the `limit` query param is ignored. The envelope's `cursor` field is `[]` (sentinel value).

### Joint Resolution 6

Quod's RUFRA block, used to comply with Brazilian Joint Resolution 6 (BCB/CMN). Not paginated.

### UN Security Council

Filters BigDataCorp's `pessoas/kyc` sanction history down to entries with `Source == unsc` — UN Security Council sanctions only. Not paginated. Empty result returns `{}`.

### Federal Revenue Registry

BigDataCorp `pessoas/basic_data` dataset, used to confirm the CPF's status with the Receita Federal. Not paginated.

### Deceased Check

BigDataCorp `pessoas/basic_data` dataset. Not paginated. Empty result returns `{}`.

### Negative Media

BigDataCorp `pessoas/media_profile_and_exposure` dataset. Not paginated. Empty result returns `{}`.
