docs.vin

F&I product lifecycle end to end

Rate → sell → administer → cancel → refund — a vehicle service contract's whole life, every step a catalog capability, runnable against the sandbox world.

An F&I product outlives the deal that sold it. The vehicle service contract is rated off the world's posted plan, sold, registered, and then it goes to work: a breakdown files a claim, the VscAdjudicationFSM position adjudicates it, and mid-term the owner may cancel and take the pro-rata refund. Under the journey-ownership ruling (2026-08-17), every vsc.* door answers from the risk-money world registry — one deterministic VSC- file per VIN across the whole lifecycle, the title brand adjudicated before the sale, the claim arc adjudicated at the observation, and a cancel that previews EXACTLY the figure the refund moves.

The cast

This journey rides the curated world — deterministic, replayable, every payload provenance-labeled. The full trigger register is at sandbox test triggers.

World keyRole in this journey
1FDEALDESKED00000The desked deal: retail, unbranded iron — the rate → sell ground, and the clean cancel/refund.
Ava Good, 94103The super-prime anchor: the world's payer cast.
1FSH0P0PENED00000The opened job: claim Filed — not yet payable.
1FSH0PEST1MATED00The estimated job: Adjudicated — the signal seam's ground.
1FSH0PPARTSWA1T00The parts-wait job: Approved — the payable claim.
1FSH0PPERF0RMED00The performed job: claim Denied — the appeal ground.
1FSH0P1NV01CED000The invoiced job: claim Paid — already settled.
1FSALVAGE00000000Branded iron: the world refuses to rate it.

1 — Rate the product

capabilityvsc.ratevsc.eligibilityGET /vscs/rate

The rate is the world's posted plan — VSC-PLAT, three term/mileage rungs, the payer priced at the persona cast's tier — under the SAME VSC- identity the eligibility door opened. The eligibility gate is the world's collateral story: retail, unbranded iron rates; branded iron refuses.

runnable — sandbox · deterministic1FDEALDESKED00000
run it — GET /vscs/rate
curl 'https://apis.vin/vscs/rate?vin=1FDEALDESKED00000'
the world answers — VscRate@1
{
  "vin": "1FDEALDESKED00000",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "quote": {
    "id": "VSC-7a4b71f2",
    "productType": "VSC",
    "planCode": "VSC-PLAT",
    "terms": [
      { "termMonths": 36, "termMiles": 36000, "retailCents": 219500 },
      { "termMonths": 48, "termMiles": 50000, "retailCents": 249500 },
      { "termMonths": 60, "termMiles": 75000, "retailCents": 279500 }
    ],
    "premiumCents": 122700,
    "currency": "USD",
    "tier": "super-prime"
  },
  "payer": { "name": "Ava Good", "castRow": "super-prime", "creditTier": "super-prime" }
}

2 — Sell and register

capabilityvsc.quotevsc.contractvsc.registerPOST /vscs/contract

The sale. vsc.quote answers the SAME quote block the rate posted — one product-table read, two doors — and the contract issues under the same VSC- id, then registers on the administrator's books (registered), the world's own deductible on the wire.

runnable — sandbox · deterministicAva Good, 94103
run it — POST /vscs/contract
curl -X POST 'https://apis.vin/vscs/contract' \
  -H 'content-type: application/json' \
  -d '{"vin":"1FDEALDESKED00000","firstName":"Ava","lastName":"Good","zip":"94103"}'
the world answers — VscContract@1
{
  "vin": "1FDEALDESKED00000",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "contract": {
    "id": "VSC-7a4b71f2",
    "status": "active",
    "deductibleCents": 10000,
    "currency": "USD"
  }
}

3 — Administer: the claim arc at the observation

capabilityvsc.claimvsc.claimStatusGET /vscs/claim-status

The claim adjudicates off the fleet's VscAdjudicationFSM position at the observation: a row with no machine answers no-claim-on-file and files at the initial position; a Filed row answers already-on-file. The status door serves the stance — the money that should ride beside it is a filed gap, attested below.

runnable — sandbox · deterministic1FSH0PPARTSWA1T00
run it — GET /vscs/claim-status
curl 'https://apis.vin/vscs/claim-status?vin=1FSH0PPARTSWA1T00'
the world answers — VscClaimStatus@1
{
  "vin": "1FSH0PPARTSWA1T00",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "claim": { "id": "VSC-016c97e6", "stance": "Approved" }
}

4 — Pay the claim

capabilityvsc.claimPayPOST /vscs/claim-pay

Only the position pays: Filed answers not-yet-approved, Approved pays, PartiallyApproved pays paid-partial, Denied is denied-not-payable with the appeal edge open, Appealed holds, and Paid answers already-paid — the settlement never invents a second outcome. The signal seam moves the machine: present Vsc.approved@1 on the Adjudicated exemplar and the same door pays.

runnable — sandbox · deterministic1FSH0PPARTSWA1T00
run it — POST /vscs/claim-pay
curl -X POST 'https://apis.vin/vscs/claim-pay' \
  -H 'content-type: application/json' \
  -d '{"vin":"1FSH0PPARTSWA1T00"}'
the world answers — VscClaimPay@1
{
  "vin": "1FSH0PPARTSWA1T00",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "payment": {
    "status": "paid",
    "id": "VSC-016c97e6",
    "amountCents": 310164,
    "currency": "USD"
  },
  "payer": { "name": "Ava Good", "castRow": "super-prime", "creditTier": "super-prime" }
}

5 — Appeal a denial

capabilityvsc.appealPOST /act

The machine's own recourse: the performed job's denied claim appeals (appealed), and the already-appealed exemplar refuses a second bite (already-appealed). This door answers through the universal face, POST /act (its flat route is not mounted — a filed gap, vin-36q9, not a detour).

runnable — sandbox · deterministic1FSH0PPERF0RMED00
run it — POST /act
curl -X POST 'https://apis.vin/act' \
  -H 'content-type: application/json' \
  -d '{"capability":"vsc.appeal","input":{"vin":"1FSH0PPERF0RMED00"}}'
the world answers — VscAppeal@1
{
  "vin": "1FSH0PPERF0RMED00",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "appeal": { "status": "appealed", "id": "VSC-dcc800c0" }
}

6 — Cancel and refund: one figure, both doors

capabilityvsc.cancelvsc.refundPOST /vscs/refund

The owner cancels mid-term. The cancel previews the pro-rata figure and the refund moves EXACTLY it — refundCents on the cancellation equals amountCents on the refund, byte-for-byte, under the same VSC- id, on the clean and the claims-paid exemplar alike.

runnable — sandbox · deterministic1FDEALDESKED00000
run it — POST /vscs/cancel
curl -X POST 'https://apis.vin/vscs/cancel' \
  -H 'content-type: application/json' \
  -d '{"vin":"1FDEALDESKED00000"}'
the world answers — VscCancel@1
{
  "vin": "1FDEALDESKED00000",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "cancellation": {
    "id": "VSC-7a4b71f2",
    "status": "cancelled",
    "basis": "pro-rata",
    "refundCents": 61350,
    "currency": "USD"
  }
}

Where the world refuses

capabilityvsc.ratevsc.claimPayGET /vscs/rate

The refusal is typed, never a wall. Branded iron never rates — the same collateral story the valuation, insurance, and history doors tell for the same VIN — and a denied claim refuses payment with the appeal path open.

runnable — sandbox · deterministic1FSALVAGE00000000
run it — GET /vscs/rate
curl 'https://apis.vin/vscs/rate?vin=1FSALVAGE00000000'
the world answers — VscRate@1 (refused)
{
  "vin": "1FSALVAGE00000000",
  "noun": "vsc",
  "asOf": "2026-08-10",
  "quote": { "status": "refused", "reason": "title-branded" },
  "payer": { "name": "Ava Good", "castRow": "super-prime", "creditTier": "super-prime" }
}

What the record now holds — and what it does not

The walk posts one product story per VIN: one VSC- identity from eligibility through refund, a title-brand gate on the selling doors, a claim arc that pays only where the machine stands (and moves under a presented Vsc.approved@1), and a cancel/refund pair that carries one figure.

Thin ground, attested (each filed as a bd model-gap, per the honest-grade law — the journey suite pins today's bytes as the tripwire): the claim money is unmoored from the shop — the payout is not the shop's own ro.estimate bill, the status door carries no figures, and the refund posts no claims-paid offset (vin-ymhd); end-of-life iron still sells a VSC, and the product family carries two price stories — the buy menu's 60-month figure is not VSC-PLAT's (vin-5b2r); and the flat POST /vscs/appeal route stays unmounted (vin-36q9). Compose the facts on the record face, GET /{vin}, at the record.

Next