preApproval
The preApproval noun — identity, lifecycle, events, and every capability as an anchored section: 9 capabilities, 0 live, 9 sandbox, 0 declared.
preApproval is one of the estate's 317 automotive nouns — a job a car needs done. It carries 9 capabilities: 0 live, 9 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | preApproval |
| Pillar | Services (facets: 4 data · 5 services) |
| Capabilities | 9 — 0 live · 9 sandbox · 0 declared |
| Entities | PreApproval |
| Doors | aggregator.vin |
| SDK | Vin.preApproval.* from apis.vin |
| Address | /catalog/preApproval#{action} — the anchor IS the wire name minus preApproval. |
Lifecycle
PreApproval — PreApprovalFSM: 4 states, 3 transitions — Issued · Active · Expired · Promoted. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 5 past-tense, versioned event types, each linked to the capability that emits it:
PreApproval.activated@1— emitted byactivatePreApproval.converted@1— emitted byconvertPreApproval.expired@1— emitted byexpirePreApproval.issued@1— emitted byissuePreApproval.softPullEmbed@1— emitted bysoftPullEmbed
Discover & read
eligibility
preApproval.eligibility · GET /pre-approvals/eligibility · gate key · sandbox · answers PreApprovalEligibility@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.eligibility({"vin":"1C4JJXP62NW102960"})curl 'https://apis.vin/pre-approvals/eligibility?vin=1C4JJXP62NW102960'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": "PreApprovalEligibility@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"eligibility": {
"eligible": true,
"decision": "approved",
"rateBand": "best",
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"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": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
terms
preApproval.terms · GET /pre-approvals/terms · gate none · sandbox · answers PreApprovalTerms@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.terms({"vin":"1C4JJXP62NW102960"})curl 'https://apis.vin/pre-approvals/terms?vin=1C4JJXP62NW102960'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": "PreApprovalTerms@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"terms": {
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"basis": "credit-tier-table"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"terms": {
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"basis": "credit-tier-table"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
issue
preApproval.issue · POST /pre-approvals/issue · gate offer · sandbox · answers PreApprovalIssue@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 — PreApproval.issued@1.
import { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.issue({"vin":"1C4JJXP62NW102960"})curl -X POST https://apis.vin/pre-approvals/issue \
-H 'content-type: application/json' \
-d '{"vin":"1C4JJXP62NW102960"}'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": "PreApprovalIssue@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"issuance": {
"id": "PA-8e075772",
"status": "issued",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"stipulations": []
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"issuance": {
"id": "PA-8e075772",
"status": "issued",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"stipulations": []
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
activate
preApproval.activate · POST /pre-approvals/activate · gate key · sandbox · answers PreApprovalActivate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 — PreApproval.activated@1.
import { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.activate({"vin":"1C4JJXP62NW102960"})curl -X POST https://apis.vin/pre-approvals/activate \
-H 'content-type: application/json' \
-d '{"vin":"1C4JJXP62NW102960"}'expire
preApproval.expire · POST /pre-approvals/expire · gate offer · sandbox · answers PreApprovalExpire@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 — PreApproval.expired@1.
import { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.expire({"vin":"1C4JJXP62NW102960"})curl -X POST https://apis.vin/pre-approvals/expire \
-H 'content-type: application/json' \
-d '{"vin":"1C4JJXP62NW102960"}'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": "PreApprovalExpire@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"expiry": {
"status": "no-pre-approval-on-file"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"expiry": {
"status": "no-pre-approval-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
convert
preApproval.convert · POST /pre-approvals/convert · gate offer · sandbox · answers PreApprovalConvert@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 — PreApproval.converted@1.
import { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.convert({"vin":"1C4JJXP62NW102960"})curl -X POST https://apis.vin/pre-approvals/convert \
-H 'content-type: application/json' \
-d '{"vin":"1C4JJXP62NW102960"}'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": "PreApprovalConvert@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"conversion": {
"status": "no-pre-approval-on-file"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"conversion": {
"status": "no-pre-approval-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}maxLoan
preApproval.maxLoan · GET /pre-approvals/max-loan · gate key · sandbox · answers PreApprovalMaxLoan@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.maxLoan({"vin":"1C4JJXP62NW102960"})curl 'https://apis.vin/pre-approvals/max-loan?vin=1C4JJXP62NW102960'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": "PreApprovalMaxLoan@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"maxLoan": {
"amountCents": 2300000,
"currency": "USD",
"basis": "collateral-value"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"maxLoan": {
"amountCents": 2300000,
"currency": "USD",
"basis": "collateral-value"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rateRange
preApproval.rateRange · GET /pre-approvals/rate-range · gate key · sandbox · answers PreApprovalRateRange@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.rateRange({"vin":"1C4JJXP62NW102960"})curl 'https://apis.vin/pre-approvals/rate-range?vin=1C4JJXP62NW102960'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": "PreApprovalRateRange@1",
"value": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"rateRange": {
"programMinApr": 5.9,
"programMaxApr": 12.9,
"programTiers": [
"A+",
"A",
"B",
"C"
],
"applicantBand": "super-prime",
"applicantEstRate": "4.49"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C4JJXP62NW102960",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-8e075772",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"rateRange": {
"programMinApr": 5.9,
"programMaxApr": 12.9,
"programTiers": [
"A+",
"A",
"B",
"C"
],
"applicantBand": "super-prime",
"applicantEstRate": "4.49"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}softPullEmbed
preApproval.softPullEmbed · POST /pre-approvals/soft-pull-embed · gate key · sandbox · answers PreApprovalSoftPullEmbed@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4JJXP62NW102960 (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 — PreApproval.softPullEmbed@1.
import { preApproval } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.softPullEmbed()curl -X POST https://apis.vin/pre-approvals/soft-pull-embed \
-H 'content-type: application/json' \
-d '{}'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": "PreApprovalSoftPullEmbed@1",
"value": {
"vin": "JM3KFBXY1S0597748",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-2d562ea9",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"softPull": {
"id": "SP-b17ecaec",
"kind": "soft-pull",
"bureau": "Experian",
"band": "super-prime",
"status": "completed"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "JM3KFBXY1S0597748",
"noun": "preApproval",
"asOf": "2026-08-10",
"id": "PA-2d562ea9",
"applicantId": "ID-11f17424",
"band": "super-prime",
"estRate": "4.49",
"estTerm": 72,
"softPull": {
"id": "SP-b17ecaec",
"kind": "soft-pull",
"bureau": "Experian",
"band": "super-prime",
"status": "completed"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "lending-desk-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.
PreApproval
Schema
| Property | Type |
|---|---|
id | id |
applicantId | ref→Party |
band | string |
estRate | decimal |
estTerm | int |
expiresAt | datetime |
status | PreApprovalFSM |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
creditApplication | preApproval | 1:0..1 | promoted from |
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.