docs.vin

Sandbox test triggers

Magic test identities, VINs, amounts, and tokens that drive each sandbox capability across its full outcome range — deterministic, replayable, vendor-free.

Every sandbox capability answers with wire-compatible, simulated payloads — deterministic and replayable, each stamped provenance: { environment: "sandbox", simulated: true, provider: "<class>-sandbox" } in the body itself. Connecting a real account is a configuration swap, not a rewrite.

A capability is only genuinely green if it behaves accurately across the whole outcome range, not just the happy path. This page is the developer reference for exercising that range: feed a magic trigger — a test identity, a test VIN, a magic amount, or a lifecycle op — and get back a documented outcome.

How the triggers work

The only entropy is a hash over your request — no randomness, no wall clock — so the same input returns the same answer forever. An exact magic trigger always wins over the hash-derived default, so a demo or a contract test can force any outcome. Anything that matches no trigger falls to a documented, plausible default. No real, paid, or metered data is ever touched.

The triggers span six domains and 120 documented scenarios. Provider labels name the counterparty class, never a brand.

DomainCounterparty classesScenarios
Commerce / paymentspayment-rail · escrow-rail · deal-desk · trade-rail19
Credit / F&Icredit-bureau · credit-rail · fni-rail21
Insurance / connectionsinsurance-rail · connections-rail · kyc-rail16
Services / legal / governanceservice-authorization-rail · legal-authority-rail · adverse-status-rail · fraud-case-rail · mandate-rail26
Title / registration / transporttitle-registration-rail · transport-rail · field-services-rail22
Vehicle history / valuationhistory-source · valuation-book16

Commerce / payments

Payment rail — payment-rail-sandbox

Two channels select the outcome, and a test token wins over the amount. Failing a token, the amount's minor-unit suffix (the last two digits of the amount in cents) selects the outcome; .00 and any other suffix clear.

Test tokenAmount suffixOutcomestatus
tok_ok / tok_success…​.00successsucceeded
tok_declined…​.01declineddeclined (declineCode: generic_decline)
tok_insufficient_funds…​.02insufficient-fundsdeclined (declineCode: insufficient_funds)
tok_requires_3ds…​.03requires-3dsrequires_action (nextAction.type: 3ds_redirect)
tok_disputed…​.04disputeddisputed (dispute.reason: fraudulent, dueBy: +21d)

Escrow rail — escrow-rail-sandbox

The op selects the lifecycle step; refusals gate deterministically.

CallTriggerOutcome
op: fund / holdfunded (available ≥ amount)held (detail.deadline = +30d)
op: fund / holdfundingAvailableMinor < amountMinor or reference: "magic-underfund"insufficient-funds
op: releasevalid proofreleased (detail.proofRef minted)
op: releaseproofSignature: "magic-reject"proof-rejected
op: refundanyrefunded

Deal desk — deal-desk-sandbox

The op selects the transition; the deal reference seeds documented refusals via a magic prefix band (case-insensitive).

CallTriggerResult state / disposition
op: openanyOPENEDspine
op: deskapproved (default)DESKEDspine
op: deskreference: "NOCREDIT…"(unchanged) — refused credit-not-approved
op: advanceany spine statenext spine state — spine
op: advance → FUNDEDreference: "STIP…"(unchanged) — refused stips-outstanding
op: holdanyON_HOLDhold
op: unwindapproved (default)UNWOUNDunwind
op: unwindreference: "NOAPPROVE…"(unchanged) — refused unwind-not-approved
op: closeanyCLOSEDclose
any opreference: "ERROR…"(unchanged) — refused provider-error

Trade-in rail — trade-rail-sandbox

The VIN seeds a deterministic ACV in $2,000–$35,000; the outcome follows from the title band and the asking price.

TriggerOutcome
clean VIN, no ask (default)offer at ACV
requestedAmountMinor > ACV × 1.1counter at ACV (echoes the request)
VIN SALVAGE…decline (salvage-title)
VIN BRANDED…decline (branded-title)
conditionToken: "magic-salvage"decline (salvage-title)

Credit / F&I

Credit tiers — credit-bureau-sandbox

The trigger is the applicant's last name (case-insensitive, any first name, any zip). FCRA consent evidence is required first — a missing/blank consent.evidence refuses before anything touches a bureau.

Last nameTierScorePosted APR / termTypical decision
Deepsubdeep-subprime50521.99% / 60decline
Subprimesubprime58515.99% / 60counter
Nearprimenear-prime64510.99% / 66approve-with-conditions
Primeprime7256.99% / 72approve
Superprimesuper-prime8154.49% / 72approve
Frozenfrozen file
Nohitno-hit
Errorprovider-unavailable (BLOCKED)

Default (non-magic name): score = 550 + hash(firstName|lastName|zip) in [550, 899], tier classified from the score. Deterministic and replayable.

Decisions — credit-rail-sandbox

The trigger is the decision word. attested: true mirrors the signed-and-verified webhook path.

Trigger worddispositionPayload highlights
approveapprovedrate offers with monthly payments
approve-with-conditionsconditionedrate + conditions (proof of income / residence)
counterconditionedcounterOffer (smaller amount, higher rate, required down)
declinedeclinedattested: true
pendingpendingreferred to a human underwriter (expectedWithin: PT24H)
errorBLOCKED (code: rail-error)

F&I products — fni-rail-sandbox

The trigger is the lifecycle step. The vin must be a valid 17-char VIN; the GAP-bearing steps require vehicleMSRP or they return the pinned missing-msrp refusal.

StepStateHighlights
ratePACKAGEDrate card (VSC / GAP / PPM) + packageTotal
presentPRESENTEDGood / Better / Best with monthlyDelta; persisted: false
acceptCONTRACTEDselectedPackage, contractNumbers, priceTotal
declineDECLINEDdeclined: true — a first-class, truthful outcome

Refusals: a malformed VIN → BLOCKED (invalid VIN — 17 characters, no I/O/Q); a GAP step without vehicleMSRP → BLOCKED (financing gap insurance but missing vehicleMSRP).

Payoff quote bands — credit-rail-sandbox

The trigger is a magic account-number prefix, plus a payoff-capable fsId. The reference market value is echoed so equity is explicit — an underwater loan reports negative equity, never hidden.

accountNumber prefixBandHighlights
POS-…positive-equitypayoff $12,400 · value $21,000 · equity +$8,600
NEG-…negative-equitypayoff $27,900 · value $21,000 · equity −$6,900
ERR-…payoff-errorBLOCKED (code: rail-error)
unknown fsIdBLOCKED (code: unsupported-lender)
missing accountNumberBLOCKED (code: not-found)

Payoff-capable fsId triggers: F00SET, F000WL, F3TC22. Default (capable lender, non-magic account): deterministic payoff classified against the $21,000 reference value.


Insurance / connections / KYC

Bindable quote — insurance-rail-sandbox

The trigger is a reserved test VIN (valid 17-char VIN, no I/O/Q).

Test VINScenario
B1NDABLE000000001bindable — base premium, full coverage grid
H1GHR1SK000000001high-risk-surcharge — premium ×1.6
DECL1NE0000000001declinebindable: false, reason: ineligible-risk
LAPSED00000000001lapsed — premium ×1.35, priorCoverageLapse: true
SR22NEED000000001sr22-required — premium ×1.25, sr22.required: true
any other valid VINdefault — hash band: decline / high-risk / bindable

Proof of insurance — insurance-rail-sandbox

The trigger is a reserved policy number (primary) or reserved VIN (fallback).

Policy numberVIN fallbackScenario
POL-VERIFIEDP01VER1F1ED000001verified (account-verified)
POL-UNVERIFIEDP01UNVER1F1ED0001unverified (no-policy-on-file)
POL-EXPIREDP01EXP1RED0000001expired (coverage-lapsed)
anything elsedefault — unverified

The trigger is the ceremony username, matched on substring (so acme_user_good resolves too).

Username containsScenario
good (default)goodlinked / active, next sync ok
mfamfa-required — supply a non-empty mfaCode to resolve to linked
reconnect / degrade / expiredreconnect-required — next sync returns a NEEDS_HUMAN re-link handoff
locked / error / badcredential-error — ceremony failed, next sync blocked

KYC identity screen — kyc-rail-sandbox

The trigger is a reserved last name (primary) or reserved test SSN (secondary). The OFAC output is a synthetic OFAC-SDN-SANDBOX match, never a real listed party.

Last nameTest SSNDecision
PASS111-11-1111pass — riskScore 0–19
REVIEW222-22-2222review — address-mismatch / possible-pep, riskScore 45–69
FAIL000-00-0000fail — identity-not-verified, riskScore 80–94
SANCTIONED / OFAC333-33-3333ofac-hit — synthetic SDN match, riskScore 100
anything elsedefault — hash band: review / pass

Triggers match an uppercase substring token in the key, so you can embed a token in your own value (e.g. a …WARRANTY… VIN).

Repair authorization — service-authorization-rail-sandbox

Trigger (VIN, or amount)Outcome
VIN …WARRANTY… (or warrantyContractId set)warranty-covered (customerOwed: 0)
estimateCents >= 1_000_000 ($10,000)declined (over-authorization-cap)
VIN …DECLINE…declined (not-authorized)
VIN …APPROVE…approved
any other VIN (default)estimate (pending)

authorityTypeprobate | guardianship | power-of-attorney. The magic key is documentId.

documentId containsOutcome
EXPIREDinvalid (expired)
REVOKEDinvalid (revoked)
FORGED / INVALIDinvalid (not-authenticated)
PENDINGpending
VALID or any other id (default)validgrantsScope by type

Adverse status — adverse-status-rail-sandbox

The magic VIN maps to an adverse title/lien state; saleBlocked gates retail flow.

VIN containsStatussaleBlocked
REPOrepossessiontrue
STOLENstolentrue
SALVAGEsalvagefalse
TOTALtotal-lossfalse
LEMONlemon-buybackfalse
any other VIN (default)clearfalse

Fraud case — fraud-case-rail-sandbox

subjectTypevin | identity | deal. holdApplied tells the caller to hold funds/title.

subjectId containsStatusholdApplied
FRAUDOPENopentrue
FRAUDCONFIRMconfirmedtrue
FRAUDCLEARclearedfalse
any other subject (default)nonefalse

Mandate (governance) — mandate-rail-sandbox

The magic key is the pair principalId|agentId; the cap is a magic amount ($5,000). grantedScopes derive from the action.

Trigger (pair, + amount)Outcome
…REVOKED…revoked (no scopes)
…CAPPED… and amount > $5,000denied-over-cap
…CAPPED… and amount ≤ $5,000capped (remaining = cap − amount)
…GRANTED… or any other pair (default)granted (full authority)

Title / registration / transport / inspection

Title, registration, and inspection key on a test VIN (1FTSW21P75E + a 6-char scenario serial). Transport keys on a test order token (SBX-TR-…).

Title — title-registration-rail-sandbox

Test VINtitleStatusOrder lands
1FTSW21P75ECLEAR0clearComplete (e-title)
1FTSW21P75ELIEN00lien-presentActive
1FTSW21P75EBONDEDbondedActive
1FTSW21P75EDUP000duplicateActive
1FTSW21P75EELT000eltActive
1FTSW21P75EWASHEDtitle-washing-flagHold
1FTSW21P75ESALVGEsalvage-brandActive
1FTSW21P75EREJECTrejectedError

Default (non-magic VIN): weighted band clear 70% / lien-present 18% / salvage-brand 8% / rejected 4%.

Registration — title-registration-rail-sandbox

Test VINregistrationStatus
1FTSW21P75EREGACTactive (expiresOn = asOf + 335d)
1FTSW21P75EREGEXPexpired (expiresOn = asOf − 35d)
1FTSW21P75EREGSUSsuspended (insurance-lapse)

Transport — transport-rail-sandbox

Test order tokenScenariostatus
SBX-TR-QUOTEquoteQuoted
SBX-TR-BOOKEDbookedActive
SBX-TR-PICKUPpicked-upEnRoute
SBX-TR-TRANSITin-transitEnRoute
SBX-TR-DELIVEREDdeliveredComplete
SBX-TR-DAMAGEDdamaged-in-transitHold
SBX-TR-DELAYEDdelayedEnRoute
SBX-TR-NOCARRIERno-carrierError

Default (non-magic token): weighted band booked 88% / no-carrier 12%.

Inspection — field-services-rail-sandbox

Test VINgradescore
1FTSW21P75EGRDPASpass96
1FTSW21P75EGRDCNDconditional74
1FTSW21P75EGRDFALfail38

Default (non-magic VIN): weighted band pass 65% / conditional 25% / fail 10%.


Vehicle history / valuation

A test VIN is a 17-character uppercase token followed by zero-padding, matched either exactly or as a substring (so 5YJSALVAGE1234567 still resolves to the salvage scenario).

History source — history-source-sandbox

Test VINOutcome
CLEAN000000000000clean title, 1 owner
WRECK000000000000clean title, 2 accidents
BRAND000000000000branded title, previously Canadian
SALVAGE0000000000salvage / total-loss / frame-damage
REBUILT0000000000rebuilt
FLOOD000000000000flood damage + rebuilt
LEMON000000000000lemon buyback
THEFT000000000000theft recovery
ROLLBACK00000000odometer rollback (rollbackSuspected: true)
RECALL0000000000clean + one open recall
TOTALED000000000total loss
NORECORD00000000BLOCKEDno-record
any other VINdefault — clean, 1 owner

Valuation book — valuation-book-sandbox

Returns all five channels (retail, private, trade, auction, wholesale), each a { low, average, high } band.

Test VINRetail avgConfidence
HIGHLINE0000000000$58,000high
AVGBOOK0000000000$24,000medium
BEATER0000000000$4,500low
NOBOOK0000000000BLOCKEDno-book-value
any other VIN$18,000medium

Provenance invariant

Every resolver return — magic or default — satisfies the same three facts, so a green sandbox cap is green across its whole outcome range:

answer.provenance.simulated === true
answer.provenance.environment === 'sandbox'
answer.provenance.provider.endsWith('-sandbox')   // the class, never a brand

A live counterparty adapter later implements the same shapes behind the same seam and only flips simulated to false — every field is preserved. See the chassis for how a capability is authenticated, priced, proven, and called.