docs.vin

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

NounpreApproval
PillarServices (facets: 4 data · 5 services)
Capabilities9 — 0 live · 9 sandbox · 0 declared
EntitiesPreApproval
Doorsaggregator.vin
SDKVin.preApproval.* from apis.vin
Address/catalog/preApproval#{action} — the anchor IS the wire name minus preApproval.

Lifecycle

PreApprovalPreApprovalFSM: 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:

Discover & read

eligibility

preApproval.eligibility · GET /pre-approvals/eligibility · gate key · sandbox · answers PreApprovalEligibility@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — preApproval.eligibility
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"})
GET /pre-approvals/eligibility
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — preApproval.terms
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"})
GET /pre-approvals/terms
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.

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

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.

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

EmitsPreApproval.issued@1.

the SDK — preApproval.issue
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"})
POST /pre-approvals/issue
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.

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

FieldTypeRequiredNotes
vinstringno

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

EmitsPreApproval.activated@1.

the SDK — preApproval.activate
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"})
POST /pre-approvals/activate
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

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.

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

EmitsPreApproval.expired@1.

the SDK — preApproval.expire
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"})
POST /pre-approvals/expire
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.

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

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.

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

EmitsPreApproval.converted@1.

the SDK — preApproval.convert
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"})
POST /pre-approvals/convert
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — preApproval.maxLoan
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"})
GET /pre-approvals/max-loan
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — preApproval.rateRange
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"})
GET /pre-approvals/rate-range
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.

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

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

EmitsPreApproval.softPullEmbed@1.

the SDK — preApproval.softPullEmbed
import { preApproval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await preApproval.softPullEmbed()
POST /pre-approvals/soft-pull-embed
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.

receipt · executed 2026-08-17T13:48:07.360Z · HTTP 200
{
  "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

PropertyType
idid
applicantIdref→Party
bandstring
estRatedecimal
estTermint
expiresAtdatetime
statusPreApprovalFSM

Relationships

FromToCardinalityAs
creditApplicationpreApproval1:0..1promoted from

Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.