Sandbox
Test identities
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.
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'sinput_context.sandbox_replayis thentrue. 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"topayload. - On a live-mode sandbox run (approved account, key minted at /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.
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 "https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases" \
-H "Authorization: Bearer {{API_KEY}}"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);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"])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")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))
}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.{
"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:
{ "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.
| 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 programmatically — the response carries a payload shaped for triggerWorkflow:
curl "https://cascades.crscreditapi.com/api/v1/workflows/27/test_cases" \
-H "Authorization: Bearer {{API_KEY}}"
# -> data.test_cases[].payload is ready to POST to /workflows/27/triggerSee GET /workflows/{id}/test_cases for the full response shape.
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.