docs.vin

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

Nounlender
PillarData (facets: 9 data · 3 services · 5 commerce)
Capabilities17 — 0 live · 17 sandbox · 0 declared
EntitiesLender
Doorslender.vin
SDKVin.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:

Discover & read

lookup

lender.lookup · GET /lenders/lookup · gate none · sandbox · answers LenderLookup@1

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.lookup
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"})
GET /lenders/lookup
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.

receipt · executed 2026-08-17T12:42:13.399Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.read
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"})
GET /lenders/read
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.

receipt · executed 2026-08-17T12:42:13.399Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.eligibility
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"})
GET /lenders/eligibility
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.

receipt · executed 2026-08-17T12:42:13.398Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.verify
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"})
GET /lenders/verify
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.

receipt · executed 2026-08-17T12:42:13.437Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.payoffQuote
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"})
GET /lenders/payoff-quote
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.

receipt · executed 2026-08-17T12:42:13.399Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.programRates
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"})
GET /lenders/program-rates
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.

receipt · executed 2026-08-17T12:42:13.399Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.failed@1 · Lender.reserveSet@1.

the SDK — lender.reserve
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"})
POST /lenders/reserve
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.

receipt · executed 2026-08-17T12:42:13.401Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.registered@1.

the SDK — lender.register
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"})
POST /lenders/register
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.

receipt · executed 2026-08-17T12:42:13.400Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.credentialed@1.

the SDK — lender.credential
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"})
POST /lenders/credential
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.

receipt · executed 2026-08-17T12:42:13.397Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
applicationstringyes
fundingPackageobjectnoassembled funding-package docs + stips cleared
authoritystringno

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.

Doorlender.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.

EmitsContractsInTransit.cleared@1 · ContractsInTransit.opened@1 · FundingPackage.funded@1 · FundingPackage.kicked@1 · FundingPackage.submitted@1 · Lender.failed@1 · Lender.funded@1.

the SDK — lender.fund
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"})
POST /lenders/fund
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.

receipt · executed 2026-08-16T14:50:09.901Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.chargedBack@1 · Lender.failed@1.

the SDK — lender.chargeback
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"})
POST /lenders/chargeback
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.

receipt · executed 2026-08-17T12:42:13.302Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.failed@1 · Lender.remitted@1.

the SDK — lender.remit
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"})
POST /lenders/remit
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.

receipt · executed 2026-08-17T12:42:13.400Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.contractBought@1 · Lender.failed@1.

the SDK — lender.buyContract
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"})
POST /lenders/buy-contract
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.

receipt · executed 2026-08-17T12:42:13.302Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.decision
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"})
GET /lenders/decision
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.

receipt · executed 2026-08-17T12:42:13.398Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.portfolio
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"})
GET /lenders/portfolio
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.

receipt · executed 2026-08-17T12:42:13.399Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Doorlender.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.

the SDK — lender.stips
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"})
GET /lenders/stips
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.

receipt · executed 2026-08-17T12:42:13.401Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doorlender.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.

EmitsLender.appSubmitted@1.

the SDK — lender.submitApp
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"})
POST /lenders/submit-app
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.

receipt · executed 2026-08-17T12:42:13.402Z · HTTP 200
{
  "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

PropertyType
programsLenderProgram[]

Relationships

FromToCardinalityAs
creditApplicationlender*:1routed to
loanlender*:1held-by
payofflender*:1quoted-by
partylenderISAis-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.