curl --request GET \
--url https://prod.truv.com/v1/sandbox/scenarios/ \
--header 'X-Access-Client-Id: <api-key>' \
--header 'X-Access-Secret: <api-key>'import requests
url = "https://prod.truv.com/v1/sandbox/scenarios/"
headers = {
"X-Access-Client-Id": "<api-key>",
"X-Access-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Access-Client-Id': '<api-key>', 'X-Access-Secret': '<api-key>'}
};
fetch('https://prod.truv.com/v1/sandbox/scenarios/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://prod.truv.com/v1/sandbox/scenarios/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Client-Id: <api-key>",
"X-Access-Secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://prod.truv.com/v1/sandbox/scenarios/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Client-Id", "<api-key>")
req.Header.Add("X-Access-Secret", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://prod.truv.com/v1/sandbox/scenarios/")
.header("X-Access-Client-Id", "<api-key>")
.header("X-Access-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.truv.com/v1/sandbox/scenarios/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Client-Id"] = '<api-key>'
request["X-Access-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"results": [
{
"id": "7b9f0c2a4d6e4f1b8c3a5d7e9f0b1c2d",
"data_source": "payroll",
"label": "Acme - salaried, biweekly",
"description": "Full-time salaried user with two paystubs",
"products": [
"income"
],
"enabled": true,
"username": "acme.salaried",
"password": "s4ndb0x",
"provider_id": null,
"company_domain": null,
"is_refresh": null,
"filenames": [],
"ssn_last4": null,
"date_of_birth": null,
"phone": null,
"behavior_status": "done",
"behavior_error_message": "",
"behavior_duration_seconds": 0,
"behavior_mfa": {
"challenges": [
{
"type": "TEXT",
"label": "Enter the code we sent to your phone",
"answer": "12345"
},
{
"type": "OPTIONS",
"label": "Where should we send your code?",
"options": [
{
"value": "sms",
"label": "Text message"
},
{
"value": "email",
"label": "Email"
}
],
"answers": [
"sms",
"email"
]
}
]
},
"payload": {
"flags": {
"is_fraudulent": false,
"is_suspicious": true
},
"employments": [
{
"profile": {
"full_name": "Jane Roe",
"first_name": "Jane",
"last_name": "Roe",
"ssn": "991-91-9991",
"date_of_birth": "1988-04-12",
"email": "jane.roe@acme.com",
"phone": "4155554193",
"home_address": {
"street": "1 Main St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
}
},
"company": {
"name": "Acme Inc.",
"ein": "123456789",
"domain": "acme.com",
"phone": "4155554193",
"address": {
"street": "1 Main St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
}
},
"job_title": "Staff Engineer",
"job_type": "F",
"start_date": "2022-03-01",
"end_date": null,
"original_hire_date": "2019-07-08",
"is_active": true,
"manager_name": "Jenny McDouglas",
"income": "124800.00",
"income_unit": "YEARLY",
"income_currency": "USD",
"pay_rate": "60.00",
"pay_frequency": "BW",
"bank_accounts": [
{
"bank_name": "Acme CU",
"account_name": "Everyday",
"account_number": "1234567890",
"routing_number": "111000025",
"account_type": "C",
"deposit_type": "A",
"deposit_value": "500.00"
}
],
"paystubs": [
{
"pay_date": "2026-08-14",
"period_start": "2026-08-01",
"period_end": "2026-08-14",
"currency": "USD",
"gross_pay": "4800.00",
"net_pay": "3312.00",
"gross_pay_ytd": "76800.00",
"net_pay_ytd": "52992.00",
"hours": "80.00",
"basis_of_pay": "S",
"earnings": [
{
"name": "Regular",
"amount": "4800.00",
"rate": "60.00",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"amount": "76800.00",
"rate": "60.00",
"units": "1280.00"
}
],
"deductions": {
"Federal Tax": "1056.00",
"Social Security": "297.60",
"Medicare": "69.60",
"State Tax": "64.80"
},
"deductions_ytd": {
"Federal Tax": "16896.00",
"Social Security": "4761.60",
"Medicare": "1113.60",
"State Tax": "1036.80"
},
"document_id": "a41d7e9c05b24f6b8e3c1d5a7f92b604"
}
],
"w2s": [
{
"year": "2025",
"document_id": "3f1c8a90b7d2416e9a5c0e4f2b8d6a17",
"fields": {
"wages": "124800.00"
}
}
],
"shifts": [
{
"start_date": "2026-08-18",
"end_date": "2026-08-18",
"timezone": "America/Chicago",
"time_entries": [
{
"entry_date": "2026-08-18",
"start": "08:00",
"end": "16:30"
}
]
}
]
}
]
},
"created_at": "2026-09-17T10:04:11.482913Z",
"updated_at": "2026-09-17T10:04:11.482931Z"
}
],
"next": "https://prod.truv.com/v1/sandbox/scenarios/?cursor=cD0yMDI2LTA5LTE3"
}{
"error": {
"code": "authentication_failed",
"message": "No such token"
}
}{
"error": {
"code": "env_not_sandbox",
"message": "Sandbox configuration requires a sandbox key; this key is 'prod'."
}
}{
"error": {
"code": "throttled",
"message": "Request was throttled."
}
}List sandbox scenarios
Cursor-paginated list of your sandbox scenarios. Scenarios are scoped to your account, so every teammate’s sandbox key reads the same set.
curl --request GET \
--url https://prod.truv.com/v1/sandbox/scenarios/ \
--header 'X-Access-Client-Id: <api-key>' \
--header 'X-Access-Secret: <api-key>'import requests
url = "https://prod.truv.com/v1/sandbox/scenarios/"
headers = {
"X-Access-Client-Id": "<api-key>",
"X-Access-Secret": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Access-Client-Id': '<api-key>', 'X-Access-Secret': '<api-key>'}
};
fetch('https://prod.truv.com/v1/sandbox/scenarios/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://prod.truv.com/v1/sandbox/scenarios/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Client-Id: <api-key>",
"X-Access-Secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://prod.truv.com/v1/sandbox/scenarios/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Client-Id", "<api-key>")
req.Header.Add("X-Access-Secret", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://prod.truv.com/v1/sandbox/scenarios/")
.header("X-Access-Client-Id", "<api-key>")
.header("X-Access-Secret", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod.truv.com/v1/sandbox/scenarios/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Client-Id"] = '<api-key>'
request["X-Access-Secret"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"results": [
{
"id": "7b9f0c2a4d6e4f1b8c3a5d7e9f0b1c2d",
"data_source": "payroll",
"label": "Acme - salaried, biweekly",
"description": "Full-time salaried user with two paystubs",
"products": [
"income"
],
"enabled": true,
"username": "acme.salaried",
"password": "s4ndb0x",
"provider_id": null,
"company_domain": null,
"is_refresh": null,
"filenames": [],
"ssn_last4": null,
"date_of_birth": null,
"phone": null,
"behavior_status": "done",
"behavior_error_message": "",
"behavior_duration_seconds": 0,
"behavior_mfa": {
"challenges": [
{
"type": "TEXT",
"label": "Enter the code we sent to your phone",
"answer": "12345"
},
{
"type": "OPTIONS",
"label": "Where should we send your code?",
"options": [
{
"value": "sms",
"label": "Text message"
},
{
"value": "email",
"label": "Email"
}
],
"answers": [
"sms",
"email"
]
}
]
},
"payload": {
"flags": {
"is_fraudulent": false,
"is_suspicious": true
},
"employments": [
{
"profile": {
"full_name": "Jane Roe",
"first_name": "Jane",
"last_name": "Roe",
"ssn": "991-91-9991",
"date_of_birth": "1988-04-12",
"email": "jane.roe@acme.com",
"phone": "4155554193",
"home_address": {
"street": "1 Main St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
}
},
"company": {
"name": "Acme Inc.",
"ein": "123456789",
"domain": "acme.com",
"phone": "4155554193",
"address": {
"street": "1 Main St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country": "US"
}
},
"job_title": "Staff Engineer",
"job_type": "F",
"start_date": "2022-03-01",
"end_date": null,
"original_hire_date": "2019-07-08",
"is_active": true,
"manager_name": "Jenny McDouglas",
"income": "124800.00",
"income_unit": "YEARLY",
"income_currency": "USD",
"pay_rate": "60.00",
"pay_frequency": "BW",
"bank_accounts": [
{
"bank_name": "Acme CU",
"account_name": "Everyday",
"account_number": "1234567890",
"routing_number": "111000025",
"account_type": "C",
"deposit_type": "A",
"deposit_value": "500.00"
}
],
"paystubs": [
{
"pay_date": "2026-08-14",
"period_start": "2026-08-01",
"period_end": "2026-08-14",
"currency": "USD",
"gross_pay": "4800.00",
"net_pay": "3312.00",
"gross_pay_ytd": "76800.00",
"net_pay_ytd": "52992.00",
"hours": "80.00",
"basis_of_pay": "S",
"earnings": [
{
"name": "Regular",
"amount": "4800.00",
"rate": "60.00",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"amount": "76800.00",
"rate": "60.00",
"units": "1280.00"
}
],
"deductions": {
"Federal Tax": "1056.00",
"Social Security": "297.60",
"Medicare": "69.60",
"State Tax": "64.80"
},
"deductions_ytd": {
"Federal Tax": "16896.00",
"Social Security": "4761.60",
"Medicare": "1113.60",
"State Tax": "1036.80"
},
"document_id": "a41d7e9c05b24f6b8e3c1d5a7f92b604"
}
],
"w2s": [
{
"year": "2025",
"document_id": "3f1c8a90b7d2416e9a5c0e4f2b8d6a17",
"fields": {
"wages": "124800.00"
}
}
],
"shifts": [
{
"start_date": "2026-08-18",
"end_date": "2026-08-18",
"timezone": "America/Chicago",
"time_entries": [
{
"entry_date": "2026-08-18",
"start": "08:00",
"end": "16:30"
}
]
}
]
}
]
},
"created_at": "2026-09-17T10:04:11.482913Z",
"updated_at": "2026-09-17T10:04:11.482931Z"
}
],
"next": "https://prod.truv.com/v1/sandbox/scenarios/?cursor=cD0yMDI2LTA5LTE3"
}{
"error": {
"code": "authentication_failed",
"message": "No such token"
}
}{
"error": {
"code": "env_not_sandbox",
"message": "Sandbox configuration requires a sandbox key; this key is 'prod'."
}
}{
"error": {
"code": "throttled",
"message": "Request was throttled."
}
}Authorizations
Client ID
Client Access Key
Query Parameters
Only scenarios bound to this data source.
payroll, docs, financial_accounts, education, credit, insurance "payroll"
Only scenarios that would serve this product. Scenarios with no products are not pinned and so serve any product; they are always included.
income, employment, deposit_switch, pll, insurance, transactions, assets, admin, credit, education "income"
Only scenarios with this enabled state.
true
Opaque pagination cursor, taken from the next URL of a previous page.
Number of results to return per page.
x <= 100Response
A cursor-paginated page of sandbox scenarios.
Scenarios ordered oldest first. Matching fields depend on the input being resolved and so cannot be reflected in a list; use the resolve endpoint to see the actual winner for an input.
Show child attributes
Show child attributes
Opaque URL of the next page, or null on the last page.
"https://prod.truv.com/v1/sandbox/scenarios/?cursor=cD0yMDI2LTA5LTE3"
Was this page helpful?