---
title: Test identities
description: The synthetic applicants registered in the CRS sandbox, what test mode really does with them, and how to pick a mock outcome for a test run.
canonical_url: "https://cascades.crscreditapi.com/docs/sandbox/test-identities"
doc_version: "1.0.0"
last_updated: "2026-10-09T14:09:36Z"
source: docs/sandbox/test-identities.md.erb
---

# Test identities

Cascades keeps a set of **registered test subjects** in the CRS sandbox test-case registry — synthetic applicants authored with a specific history (a borderline credit file, a misdemeanor, three eviction filings). What they do depends on the mode of the run:

- In **test mode** a trigger (`POST /workflows/{id}/trigger`) whose applicant is a registered subject replays that subject's authored bureau responses, at no charge, when the subject is registered for every product node in the cascade. The execution's `input_context.sandbox_replay` is then `true`. Any other applicant, a subject that covers only some of the cascade's products, and every batch row get the schema mock for each product node: `happy_path` (clean file, no records) by default, or the decline mock when you add `"scenario": "fail_path"` to `payload`.
- On a **live-mode sandbox run** (approved account, key minted at [/api-keys](/api-keys), CRS sandbox host) the registry matches the applicant's name and SSN and replays the authored bureau response for that subject instead of billing a vendor, so the decision path is the one a live applicant with that history would take.


> **Sandbox only**
>
> These identities exist only in the sandbox registry. The SSNs are in the `666-xx-xxxx` range reserved for testing and belong to nobody. Keys minted from these docs cannot run live at all (`403 live_mode_forbidden`). With a normal key, a live pull that misses the registry — a typo in the name, a product the subject was not registered for — falls through to a real, billable vendor call and returns nothing useful.


## How do I get the subjects for my cascade?

Ask the API. `GET /workflows/{id}/test_cases` walks the cascade's product nodes, maps each product to its registry family, and returns every Cascades case registered for it (`case_name` starts with `Cascades_`) with a `payload` you can send straight to `trigger`:


**cURL**

```shell
curl "https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases" \
  -H "Authorization: Bearer {{API_KEY}}"
```

**Node.js**

```javascript
const response = await fetch("https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases", {
  method: "GET",
  headers: {
    "Authorization": "Bearer {{API_KEY}}"
  }
});

const { data, meta } = await response.json();
console.log(response.status, data, meta.request_id);
```

**Python**

```python
import requests

response = requests.get(
    "https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases",
    headers={
        "Authorization": "Bearer {{API_KEY}}",
    },
)
response.raise_for_status()
payload = response.json()
print(payload["data"], payload["meta"]["request_id"])
```

**Ruby**

```ruby
require "net/http"
require "json"

uri = URI("https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer {{API_KEY}}"

response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end
payload = JSON.parse(response.body)
puts payload["data"], payload.dig("meta", "request_id")
```

**Go**

```go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest("GET", "https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer {{API_KEY}}")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	out, _ := io.ReadAll(resp.Body)
	fmt.Println(resp.StatusCode, string(out))
}
```

**Agent**

```shell
claude mcp add cascades \
  -e CASCADES_API_KEY={{API_KEY}} \
  -e CASCADES_PROD_BASE_URL=https://cascades.crscreditapi.com \
  -- npx -y @crscreditapi/cascades-mcp-server

# Then ask your assistant:
#   "List sandbox test cases for a workflow 27 and summarise the result."
# It will call the `cascades_list_test_cases` tool with your key.
```


```json
{
  "data": {
    "object": "test_case_list",
    "workflow_id": 27,
    "test_cases": [
      {
        "id": 73,
        "case_name": "Cascades_XProduct_Approve_EFX",
        "product_code": "EQF1003",
        "payload": {
          "applicant": { "first_name": "AVERY", "last_name": "CLARKSON", "middle_name": "", "name": "AVERY CLARKSON", "email": "avery.clarkson@example.com", "phone": "", "ssn": "…", "dob": "1982-01-01" },
          "property":  { "address": "1803 Norma", "unit": "", "city": "Cottonwood", "state": "CA", "zip": "91502", "full_address": "1803 Norma, Cottonwood, CA 91502" }
        }
      }
    ]
  },
  "meta": { "request_id": "…" }
}
```

A credit case's own registry entry has only the name and SSN. The `payload` fills the date of birth and address from the same subject's other cases (here Avery's criminal case), as the table below does, because CRS refuses a credit order without them.

An unreachable registry returns an empty list, never an error, so discovery degrades to "no test cases" rather than failing your integration.

## Choosing the outcome in test mode

For an applicant that is not a registered subject, test mode returns mocks, and `scenario` picks which ones. To walk a decline or adverse-action branch, add `scenario` to the trigger `payload`:

```json
{ "payload": { "scenario": "fail_path", "applicant": { "first_name": "Raymond", "last_name": "Okafor" } }, "execution_mode": "test" }
```

`happy_path` (the default) returns a clean file from every product node; `fail_path` returns each node's decline mock (for example the eviction node reports two filings and `recommendation: FAIL`). A node whose config sets `mock_scenario` overrides the payload value. `scenario` is ignored in live mode, and on a test run that replays a registered subject: that run returns the subject's authored outcome.

## Registered subjects

These are the Cascades cases in the registry right now, read live from it; `GET /workflows/{id}/test_cases` returns the registered subjects for your cascade's products. Each one replays its authored bureau response on a test-mode trigger (when it covers every product node in the cascade) and on a live sandbox run. Identity and watchlist products have no registry coverage today, so a cascade with one of them always gets mocks in test mode.

Product codes map to registry families by prefix: `TUC*` → TransUnion credit, `EQF*` → Equifax credit, `EXP1*` → Experian credit, `CIC4002` → criminal, `CIC4003` → eviction. A subject only replays for the family it was registered under — a live pull of a credit subject through a criminal node misses the registry and reaches the vendor.

**Scores on the Equifax test files.** Each registry Equifax credit file (`EQF*`) carries a FICO Score 9 (Equifax model `05206`), a FICO Score 5 (`02958`) and a VantageScore 4.0. `creditScore.fico9` reads only the FICO 9. Avery Clarkson's FICO 9 is 700, so the `createWorkflow` example (`creditScore.fico9 >= 650`) approves her; Blake Moreno and Carmen Delacruz are at 619 and take the fail branch.


> **Synthetic identities, sandbox only**
>
> Synthetic test subjects registered in the CRS sandbox, not real people. The `666-xx-xxxx` SSNs belong to nobody. A test-mode trigger for a subject registered for every product node in the cascade replays its authored bureau responses at no charge (`input_context.sandbox_replay` is `true`); other test runs return schema mocks (use `payload.scenario`). Live sandbox runs replay them too, but docs keys cannot run live.

| Name | Registry case | Family | SSN | DOB | Property address |
|---|---|---|---|---|---|
| Sandrx Bowkey | `Cascades_Credit_660_Inq0` | Credit (TransUnion) | `666221524` | — | 1268  BLOSSOM PT RD, WELCOME, MD, 20693 |
| Selma Bowkey | `Cascades_Credit_660_InqMany` | Credit (TransUnion) | `666221524` | — | 1268  BLOSSOM PT RD, WELCOME, MD, 20693 |
| Teron Bowkey | `Cascades_Credit_700_Inq0` | Credit (TransUnion) | `666221524` | — | 1268  BLOSSOM PT RD, WELCOME, MD, 20693 |
| Tilda Bowkey | `Cascades_Credit_700_InqMany` | Credit (TransUnion) | `666221524` | — | 1268  BLOSSOM PT RD, WELCOME, MD, 20693 |
| Umber Bowkey | `Cascades_Credit_781_Inq0` | Credit (TransUnion) | `666221524` | — | 1268  BLOSSOM PT RD, WELCOME, MD, 20693 |
| Usher Bowkey | `Cascades_Credit_781_InqMany` | Credit (TransUnion) | `666221524` | — | 1268  BLOSSOM PT RD, WELCOME, MD, 20693 |
| Avery Clarkson | `Cascades_XProduct_Approve_Credit` | Credit (TransUnion) | `666900001` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Blake Moreno | `Cascades_XProduct_CriminalFail_Credit` | Credit (TransUnion) | `666900002` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Carmen Delacruz | `Cascades_XProduct_EvictionFail_Credit` | Credit (TransUnion) | `666900003` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Avery Clarkson | `Cascades_XProduct_Approve_EFX` | Credit (Equifax) | `666900001` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Blake Moreno | `Cascades_XProduct_CriminalFail_EFX` | Credit (Equifax) | `666900002` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Carmen Delacruz | `Cascades_XProduct_EvictionFail_EFX` | Credit (Equifax) | `666900003` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Avery Clarkson | `Cascades_XProduct_Approve_EXP` | Credit (Experian) | `666900001` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Blake Moreno | `Cascades_XProduct_CriminalFail_EXP` | Credit (Experian) | `666900002` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Carmen Delacruz | `Cascades_XProduct_EvictionFail_EXP` | Credit (Experian) | `666900003` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| June Abara | `Cascades_Criminal_California` | Criminal | `666-51-2206` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Theo Lindgren | `Cascades_Criminal_Clean` | Criminal | `666-51-2204` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Omar Haddad | `Cascades_Criminal_Misdemeanor` | Criminal | `666-51-2205` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Avery Clarkson | `Cascades_XProduct_Approve_Criminal` | Criminal | `666-90-0001` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Blake Moreno | `Cascades_XProduct_CriminalFail_Criminal` | Criminal | `666-90-0002` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Carmen Delacruz | `Cascades_XProduct_EvictionFail_Criminal` | Criminal | `666-90-0003` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Delia Marquez | `Cascades_Eviction_California` | Eviction | `666-51-2203` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Priya Narayan | `Cascades_Eviction_Clean` | Eviction | `666-51-2202` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Raymond Okafor | `Cascades_Eviction_Multi` | Eviction | `666-51-2201` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Avery Clarkson | `Cascades_XProduct_Approve_Eviction` | Eviction | `666-90-0001` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Blake Moreno | `Cascades_XProduct_CriminalFail_Eviction` | Eviction | `666-90-0002` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |
| Carmen Delacruz | `Cascades_XProduct_EvictionFail_Eviction` | Eviction | `666-90-0003` | 1982-01-01 | 1803 Norma, Cottonwood, CA, 91502 |

Discover the subjects registered for *your* cascade with `GET https://cascades.crscreditapi.com/api/v1/workflows/{id}/test_cases`; each `payload` is ready to POST to `/workflows/{id}/trigger`.



## Payload shape that matches the registry

The registry matches on the applicant's **name and SSN** (names are upper-cased and the SSN digit-stripped before comparison), and the credit provider reads the date of birth from `applicant.dob` and the address from a separate `property` object — not from `applicant.address`. Send the `payload` from `test_cases` unchanged and you cannot miss.

## Related

- [Sandbox vs live](/docs/concepts/sandbox-vs-live)
- [Your first screening](/docs/guides/first-screening)
- [`GET /workflows/{id}/test_cases`](/docs/api/workflows/list-workflow-test-cases)

## Sitemap

See the full [sitemap](https://cascades.crscreditapi.com/sitemap.md) for all pages.
