lender
The lender noun — identity, lifecycle, events, and every capability as an anchored section: 17 capabilities, 0 live, 17 sandbox, 0 declared.
lender is one of the estate's 317 automotive nouns — a job a car needs done. It carries 17 capabilities: 0 live, 17 sandbox, 0 declared · doors lender.vin.
Identity
| Noun | lender |
| Pillar | Data (facets: 9 data · 3 services · 5 commerce) |
| Capabilities | 17 — 0 live · 17 sandbox · 0 declared |
| Entities | Lender |
| Doors | lender.vin |
| SDK | Vin.lender.* from apis.vin |
| Address | /catalog/lender#{action} — the anchor IS the wire name minus lender. |
Events
The vocabulary this noun can append to the record — 14 past-tense, versioned event types, each linked to the capability that emits it:
ContractsInTransit.cleared@1— emitted byfundContractsInTransit.opened@1— emitted byfundFundingPackage.funded@1— emitted byfundFundingPackage.kicked@1— emitted byfundFundingPackage.submitted@1— emitted byfundLender.appSubmitted@1— emitted bysubmitAppLender.chargedBack@1— emitted bychargebackLender.contractBought@1— emitted bybuyContractLender.credentialed@1— emitted bycredentialLender.failed@1— emitted bybuyContract·chargeback·fund·remit·reserveLender.funded@1— emitted byfundLender.registered@1— emitted byregisterLender.remitted@1— emitted byremitLender.reserveSet@1— emitted byreserve
Discover & read
lookup
lender.lookup · GET /lenders/lookup · gate none · sandbox · answers LenderLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.lookup({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/lookup?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderLookup@1",
"value": {
"lenders": [
{
"fsId": "F00SET",
"fsName": "Southeast Toyota Finance",
"serviceOptions": [
"ACC",
"VIN"
],
"consumerEnabled": true,
"apr": 5.9
},
{
"fsId": "F000WL",
"fsName": "Wells Fargo Auto",
"serviceOptions": [
"ACC",
"SSNTXID"
],
"consumerEnabled": true,
"apr": 6.4
},
{
"fsId": "F3TC22",
"fsName": "Huntington National Bank",
"serviceOptions": [
"VIN"
],
"consumerEnabled": true,
"apr": 4.9
},
{
"fsId": "F0MCU1",
"fsName": "Members Credit Union",
"serviceOptions": [
"SSNTXID"
],
"consumerEnabled": true,
"apr": 7.2
}
],
"count": 4
},
"evidence": {
"lenders": [
{
"fsId": "F00SET",
"fsName": "Southeast Toyota Finance",
"serviceOptions": [
"ACC",
"VIN"
],
"consumerEnabled": true,
"apr": 5.9
},
{
"fsId": "F000WL",
"fsName": "Wells Fargo Auto",
"serviceOptions": [
"ACC",
"SSNTXID"
],
"consumerEnabled": true,
"apr": 6.4
},
{
"fsId": "F3TC22",
"fsName": "Huntington National Bank",
"serviceOptions": [
"VIN"
],
"consumerEnabled": true,
"apr": 4.9
},
{
"fsId": "F0MCU1",
"fsName": "Members Credit Union",
"serviceOptions": [
"SSNTXID"
],
"consumerEnabled": true,
"apr": 7.2
}
],
"count": 4
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "payoff-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}read
lender.read · GET /lenders/read · gate none · sandbox · answers LenderRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.read({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/read?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderRead@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank",
"serviceOptions": [
"VIN"
],
"consumerEnabled": true,
"buyRateApr": "4.90"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank",
"serviceOptions": [
"VIN"
],
"consumerEnabled": true,
"buyRateApr": "4.90"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}eligibility
lender.eligibility · GET /lenders/eligibility · gate key · sandbox · answers LenderEligibility@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.eligibility({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/eligibility?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderEligibility@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"eligibility": {
"eligible": true,
"decision": "approved",
"rateBand": "best",
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"eligibility": {
"eligible": true,
"decision": "approved",
"rateBand": "best",
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
lender.verify · GET /lenders/verify · gate key · sandbox · answers LenderVerify@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.verify({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/verify?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderVerify@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"verification": {
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
},
"verified": true
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"verification": {
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
},
"verified": true
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
payoffQuote
lender.payoffQuote · GET /lenders/payoff-quote · gate key · sandbox · answers LenderPayoffQuote@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.payoffQuote({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/payoff-quote?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderPayoffQuote@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"payoff": {
"vin": "7SAXCBE60NF340517",
"lienholder": "Huntington National Bank",
"grossPayOffAmount": {
"currency": "USD",
"minorUnits": 2370668
},
"netPayOffAmount": {
"currency": "USD",
"minorUnits": 2342389
},
"perDiem": {
"currency": "USD",
"minorUnits": 318
},
"allowance": {
"currency": "USD",
"minorUnits": 28279
},
"goodThrough": "2026-08-20T00:00:00.000Z",
"nextPaymentAmount": {
"currency": "USD",
"minorUnits": 44094
},
"nextPaymentDate": "2026-08-25T00:00:00.000Z",
"freshQuote": true,
"reference": "poq_2da4a3b4"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"payoff": {
"vin": "7SAXCBE60NF340517",
"lienholder": "Huntington National Bank",
"grossPayOffAmount": {
"currency": "USD",
"minorUnits": 2370668
},
"netPayOffAmount": {
"currency": "USD",
"minorUnits": 2342389
},
"perDiem": {
"currency": "USD",
"minorUnits": 318
},
"allowance": {
"currency": "USD",
"minorUnits": 28279
},
"goodThrough": "2026-08-20T00:00:00.000Z",
"nextPaymentAmount": {
"currency": "USD",
"minorUnits": 44094
},
"nextPaymentDate": "2026-08-25T00:00:00.000Z",
"freshQuote": true,
"reference": "poq_2da4a3b4"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}programRates
lender.programRates · GET /lenders/program-rates · gate key · sandbox · answers LenderProgramRates@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.programRates({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/program-rates?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderProgramRates@1",
"value": {
"asOf": "2026-08-10",
"termMonths": 72,
"tiers": [
{
"tier": "A+",
"apr": 5.9
},
{
"tier": "A",
"apr": 6.9
},
{
"tier": "B",
"apr": 9.4
},
{
"tier": "C",
"apr": 12.9
}
]
},
"evidence": {
"asOf": "2026-08-10",
"termMonths": 72,
"tiers": [
{
"tier": "A+",
"apr": 5.9
},
{
"tier": "A",
"apr": 6.9
},
{
"tier": "B",
"apr": 9.4
},
{
"tier": "C",
"apr": 12.9
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lender-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
reserve
lender.reserve · POST /lenders/reserve · gate offer · sandbox · answers LenderReserve@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.failed@1 · Lender.reserveSet@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.reserve({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/reserve \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderReserve@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"reserve": {
"amountCents": 34500,
"currency": "USD",
"basis": "rate-spread",
"apr": "4.49"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"reserve": {
"amountCents": 34500,
"currency": "USD",
"basis": "rate-spread",
"apr": "4.49"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}register
lender.register · POST /lenders/register · gate offer · sandbox · answers LenderRegister@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.registered@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.register({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/register \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderRegister@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"registration": {
"status": "registered",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
}
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"registration": {
"status": "registered",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}credential
lender.credential · POST /lenders/credential · gate offer · sandbox · answers LenderCredential@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.credentialed@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.credential({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/credential \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderCredential@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"credential": {
"id": "CRED-9cf4e214",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
},
"scope": "payoff-fund-remit",
"status": "active"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"credential": {
"id": "CRED-9cf4e214",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
},
"scope": "payoff-fund-remit",
"status": "active"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
fund
lender.fund · POST /lenders/fund · gate offer · sandbox · answers LenderFunding@1
| Field | Type | Required | Notes |
|---|---|---|---|
application | string | yes | — |
fundingPackage | object | no | assembled funding-package docs + stips cleared |
authority | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — ContractsInTransit.cleared@1 · ContractsInTransit.opened@1 · FundingPackage.funded@1 · FundingPackage.kicked@1 · FundingPackage.submitted@1 · Lender.failed@1 · Lender.funded@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.fund({"application":"application"})curl -X POST https://apis.vin/lenders/fund \
-H 'content-type: application/json' \
-d '{"application":"application"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderFunding@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lender",
"asOf": "2026-08-10",
"funding": {
"status": "no-contract-on-file"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lender",
"asOf": "2026-08-10",
"funding": {
"status": "no-contract-on-file"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
},
"connect": {
"type": "OFFER",
"kind": "connect",
"reason": "CONNECTION_ABSENT",
"portClass": "lender-aggregator",
"state": "absent",
"url": "https://integrates.vin/connect/lender-aggregator",
"message": "lender.fund is live via connection — certified, connect to activate: complete the lender-aggregator link ceremony at https://integrates.vin/connect/lender-aggregator. The credential vault (auth.vin) holds the token, and the same call answers simulated:false — activation is the token, never a deploy."
}
}chargeback
lender.chargeback · POST /lenders/chargeback · gate offer · sandbox · answers LenderChargeback@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.chargedBack@1 · Lender.failed@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.chargeback({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/chargeback \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderChargeback@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"chargeback": {
"status": "no-grounds"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"chargeback": {
"status": "no-grounds"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}remit
lender.remit · POST /lenders/remit · gate offer · sandbox · answers LenderRemit@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.failed@1 · Lender.remitted@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.remit({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/remit \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderRemit@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"remittance": {
"id": "RMT-b664e92f",
"lienholder": "Huntington National Bank",
"payoffReference": "poq_2da4a3b4",
"amount": {
"currency": "USD",
"minorUnits": 2342389
},
"method": "ach",
"status": "remitted"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"remittance": {
"id": "RMT-b664e92f",
"lienholder": "Huntington National Bank",
"payoffReference": "poq_2da4a3b4",
"amount": {
"currency": "USD",
"minorUnits": 2342389
},
"method": "ach",
"status": "remitted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
buyContract
lender.buyContract · POST /lenders/buy-contract · gate offer · sandbox · answers LenderBuyContract@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.contractBought@1 · Lender.failed@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.buyContract({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/buy-contract \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderBuyContract@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"purchase": {
"status": "not-yet-submitted",
"contractId": "EC-760383f9",
"position": "Generated"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"purchase": {
"status": "not-yet-submitted",
"contractId": "EC-760383f9",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}decision
lender.decision · GET /lenders/decision · gate key · sandbox · answers LenderDecision@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.decision({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/decision?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderDecision@1",
"value": {
"deal": "deal-7SAXCBE60NF340517",
"decision": "approved",
"tier": "A",
"buyRate": 6.9,
"approvedAmount": {
"amount": "32000.00",
"currency": "USD"
},
"stipulations": [
"proof-of-income",
"proof-of-insurance"
]
},
"evidence": {
"deal": "deal-7SAXCBE60NF340517",
"decision": "approved",
"tier": "A",
"buyRate": 6.9,
"approvedAmount": {
"amount": "32000.00",
"currency": "USD"
},
"stipulations": [
"proof-of-income",
"proof-of-insurance"
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lender-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}portfolio
lender.portfolio · GET /lenders/portfolio · gate key · sandbox · answers LenderPortfolio@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.portfolio({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/portfolio?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderPortfolio@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"portfolio": {
"notes": 8,
"byStatus": {
"Boarded": 1,
"Current": 1,
"Billed": 1,
"Delinquent": 1,
"Deferred": 1,
"InRecovery": 1,
"Transferred": 1,
"PaidOff": 1
}
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"portfolio": {
"notes": 8,
"byStatus": {
"Boarded": 1,
"Current": 1,
"Billed": 1,
"Delinquent": 1,
"Deferred": 1,
"InRecovery": 1,
"Transferred": 1,
"PaidOff": 1
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stips
lender.stips · GET /lenders/stips · gate key · sandbox · answers LenderStips@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.stips({"vin":"7SAXCBE60NF340517"})curl 'https://apis.vin/lenders/stips?vin=7SAXCBE60NF340517'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderStips@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"stipulations": {
"items": [],
"status": "none-required"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"stipulations": {
"items": [],
"status": "none-required"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}submitApp
lender.submitApp · POST /lenders/submit-app · gate offer · sandbox · answers LenderSubmitApp@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — lender.vin serves this noun on its two routes: / (the landing) · /7SAXCBE60NF340517 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lender.appSubmitted@1.
import { lender } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lender.submitApp({"vin":"7SAXCBE60NF340517"})curl -X POST https://apis.vin/lenders/submit-app \
-H 'content-type: application/json' \
-d '{"vin":"7SAXCBE60NF340517"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "LenderSubmitApp@1",
"value": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"application": {
"status": "submitted",
"id": "APP-76132247",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
},
"decision": "approved",
"stipulations": []
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "7SAXCBE60NF340517",
"noun": "lender",
"asOf": "2026-08-10",
"application": {
"status": "submitted",
"id": "APP-76132247",
"lender": {
"fsId": "F3TC22",
"name": "Huntington National Bank"
},
"decision": "approved",
"stipulations": []
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Data model
The record shape behind this noun — one entity, each property an evidence field. See the whole estate model on the data model page.
Lender
Schema
| Property | Type |
|---|---|
programs | LenderProgram[] |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
creditApplication | lender | *:1 | routed to |
loan | lender | *:1 | held-by |
payoff | lender | *:1 | quoted-by |
party | lender | ISA | is-a |
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 3 diagrams, rendered from the estate model.
Lender · Class model
Lender · State machine
Lender · State machine
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
leaseReturnInspection
The leaseReturnInspection noun — identity, lifecycle, events, and every capability as an anchored section: 12 capabilities, 0 live, 12 sandbox, 0 declared.
lenderProgram
The lenderProgram noun — identity, lifecycle, events, and every capability as an anchored section: 9 capabilities, 0 live, 9 sandbox, 0 declared.