repossession
The repossession noun — identity, lifecycle, events, and every capability as an anchored section: 15 capabilities, 0 live, 15 sandbox, 0 declared.
repossession is one of the estate's 317 automotive nouns — a job a car needs done. It carries 15 capabilities: 0 live, 15 sandbox, 0 declared · doors repo.vin · aggregator.vin.
Identity
| Noun | repossession |
| Pillar | Services (facets: 2 data · 9 services · 4 commerce) |
| Capabilities | 15 — 0 live · 15 sandbox · 0 declared |
| Entities | Repossession |
| Doors | aggregator.vin · repo.vin |
| SDK | Vin.repossession.* from apis.vin |
| Address | /catalog/repossession#{action} — the anchor IS the wire name minus repossession. |
Lifecycle
Repossession — RepoServicingFSM: 8 states, 7 transitions — Delinquent · Cured · Assigned · Recovered · RedemptionWindow · Redeemed · DeficiencyBilled · SurplusReturned. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 19 past-tense, versioned event types, each linked to the capability that emits it:
RecoveryAgent.dispatched@1— emitted byassignRedemption.completed@1— emitted byredeemRedemption.quoted@1— emitted byredeemRepo.assigned@1— emitted byassignRepossession.breachOfPeaceChecked@1— emitted bybreachOfPeaceCheckRepossession.deficiencyBilled@1— emitted bydeficiencyRepossession.failed@1— emitted byredemption·surplusRepossession.noiIssued@1— emitted bynoticeComplianceRepossession.personalPropertyReturned@1— emitted bypersonalPropertyReturnRepossession.recovered@1— emitted byrecoverRepossession.redemptionQuoted@1— emitted byredemptionRepossession.reinstatementQuoted@1— emitted byreinstatementQuoteRepossession.repoTitleReassigned@1— emitted bytitleReassignRepossession.requested@1— emitted byrecover·triggerRepossession.rightToCureNoticed@1— emitted byrightToCureNoticeRepossession.surplusRefunded@1— emitted bysurplusRepossession.triggered@1— emitted bytriggerRepossession.voluntarySurrendered@1— emitted byvoluntarySurrenderRepossession.wrongfulRepoDisputed@1— emitted bywrongfulRepoDispute
Discover & read
breachOfPeaceCheck
repossession.breachOfPeaceCheck · GET /repossessions/breach-of-peace-check · gate none · sandbox · answers RepossessionBreachOfPeaceCheck@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.breachOfPeaceChecked@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.breachOfPeaceCheck()curl 'https://apis.vin/repossessions/breach-of-peace-check'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": "RepossessionBreachOfPeaceCheck@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
},
"breachOfPeace": {
"status": "no-axis-posted",
"basis": "no-world-compliance-axis"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
},
"breachOfPeace": {
"status": "no-axis-posted",
"basis": "no-world-compliance-axis"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
reinstatementQuote
repossession.reinstatementQuote · GET /repossessions/reinstatement-quote · gate none · sandbox · answers RepossessionReinstatementQuote@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.reinstatementQuoted@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.reinstatementQuote()curl 'https://apis.vin/repossessions/reinstatement-quote'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": "RepossessionReinstatementQuote@1",
"value": {
"vin": "1HGCM82633A004352",
"quoteRef": "RIQ-001O",
"pastDue": {
"amount": "1840.50",
"currency": "USD"
},
"repossessionFees": {
"amount": "375.00",
"currency": "USD"
},
"reinstatementTotal": {
"amount": "2215.50",
"currency": "USD"
},
"goodThrough": "2026-08-24",
"rightToReinstate": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1HGCM82633A004352",
"quoteRef": "RIQ-001O",
"pastDue": {
"amount": "1840.50",
"currency": "USD"
},
"repossessionFees": {
"amount": "375.00",
"currency": "USD"
},
"reinstatementTotal": {
"amount": "2215.50",
"currency": "USD"
},
"goodThrough": "2026-08-24",
"rightToReinstate": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
assign
repossession.assign · POST /repossessions/assign · gate offer · sandbox · answers RepoAssignment@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | length 11–17 |
account | string | yes | loan/account ref acc_… |
lienholder | string | no | party ref pty_… |
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 — repo.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — RecoveryAgent.dispatched@1 · Repo.assigned@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.assign({"vin":"2C4RC1BG0PR535313","account":"account"})curl -X POST https://apis.vin/repossessions/assign \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313","account":"account"}'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": "RepoAssignment@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}titleReassign
repossession.titleReassign · POST /repossessions/title-reassign · gate offer · sandbox · answers RepossessionTitleReassign@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) · /2C4RC1BG0PR535313 (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 — Repossession.repoTitleReassigned@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.titleReassign({"vin":"2C4RC1BG0PR535313"})curl -X POST https://apis.vin/repossessions/title-reassign \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313"}'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": "RepossessionTitleReassign@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
wrongfulRepoDispute
repossession.wrongfulRepoDispute · POST /repossessions/wrongful-repo-dispute · gate key · sandbox · answers RepossessionWrongfulRepoDispute@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.wrongfulRepoDisputed@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.wrongfulRepoDispute()curl -X POST https://apis.vin/repossessions/wrongful-repo-dispute \
-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": "RepossessionWrongfulRepoDispute@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
personalPropertyReturn
repossession.personalPropertyReturn · POST /repossessions/personal-property-return · gate key · sandbox · answers RepossessionPersonalPropertyReturn@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.personalPropertyReturned@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.personalPropertyReturn()curl -X POST https://apis.vin/repossessions/personal-property-return \
-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": "RepossessionPersonalPropertyReturn@1",
"value": {
"vin": "1HGCM82633A004352",
"inventoryRef": "RPP-001O",
"fsmState": "Recovered",
"itemsInventoried": 2,
"storageFeeWaived": true,
"returnDeadline": "2026-08-20",
"returnMethod": "scheduled-pickup",
"claimReturned": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1HGCM82633A004352",
"inventoryRef": "RPP-001O",
"fsmState": "Recovered",
"itemsInventoried": 2,
"storageFeeWaived": true,
"returnDeadline": "2026-08-20",
"returnMethod": "scheduled-pickup",
"claimReturned": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
deficiency
repossession.deficiency · GET /repossessions/deficiency · gate key · sandbox · answers RepossessionDeficiency@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.deficiencyBilled@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.deficiency({"vin":"2C4RC1BG0PR535313"})curl 'https://apis.vin/repossessions/deficiency?vin=2C4RC1BG0PR535313'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": "RepossessionDeficiency@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"deficiencyRef": "RDF-0027",
"fsmState": "DeficiencyBilled",
"payoffBalance": {
"amount": "20494.00",
"currency": "USD"
},
"remarketingProceeds": {
"amount": "14494.00",
"currency": "USD"
},
"recoveryFeesAndCosts": {
"amount": "994.00",
"currency": "USD"
},
"deficiencyBalance": {
"amount": "6994.00",
"currency": "USD"
},
"commerciallyReasonableSale": true,
"postSaleNoticeSent": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"deficiencyRef": "RDF-0027",
"fsmState": "DeficiencyBilled",
"payoffBalance": {
"amount": "20494.00",
"currency": "USD"
},
"remarketingProceeds": {
"amount": "14494.00",
"currency": "USD"
},
"recoveryFeesAndCosts": {
"amount": "994.00",
"currency": "USD"
},
"deficiencyBalance": {
"amount": "6994.00",
"currency": "USD"
},
"commerciallyReasonableSale": true,
"postSaleNoticeSent": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-sandbox"
},
"events": [
"Repossession.deficiencyBilled@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}noticeCompliance
repossession.noticeCompliance · POST /repossessions/notice-compliance · gate offer · sandbox · answers RepossessionNoticeCompliance@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) · /2C4RC1BG0PR535313 (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 — Repossession.noiIssued@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.noticeCompliance({"vin":"2C4RC1BG0PR535313"})curl -X POST https://apis.vin/repossessions/notice-compliance \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313"}'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": "RepossessionNoticeCompliance@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}recover
repossession.recover · POST /repossessions/recover · gate offer · sandbox · answers RepossessionRecover@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) · /2C4RC1BG0PR535313 (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 — Repossession.recovered@1 · Repossession.requested@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.recover({"vin":"2C4RC1BG0PR535313"})curl -X POST https://apis.vin/repossessions/recover \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313"}'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": "RepossessionRecover@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}redeem
repossession.redeem · POST /repossessions/redeem · gate offer · sandbox · answers RepoRedemption@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | length 11–17 |
assignment | string | yes | repo assignment ref rpa_… |
borrower | object | no | party ref pty_… |
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 — repo.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Redemption.completed@1 · Redemption.quoted@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.redeem({"vin":"2C4RC1BG0PR535313","assignment":"assignment"})curl -X POST https://apis.vin/repossessions/redeem \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313","assignment":"assignment"}'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": "RepoRedemption@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}redemption
repossession.redemption · POST /repossessions/redemption · gate offer · sandbox · answers RepossessionRedemption@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) · /2C4RC1BG0PR535313 (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 — Repossession.failed@1 · Repossession.redemptionQuoted@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.redemption({"vin":"2C4RC1BG0PR535313"})curl -X POST https://apis.vin/repossessions/redemption \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313"}'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": "RepossessionRedemption@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"redemptionRef": "RRD-0027",
"fsmState": "RedemptionWindow",
"payoffBalance": {
"amount": "20494.00",
"currency": "USD"
},
"recoveryCosts": {
"amount": "994.00",
"currency": "USD"
},
"redemptionAmount": {
"amount": "21488.00",
"currency": "USD"
},
"redemptionDeadline": "2026-08-25",
"redemptionEligible": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"redemptionRef": "RRD-0027",
"fsmState": "RedemptionWindow",
"payoffBalance": {
"amount": "20494.00",
"currency": "USD"
},
"recoveryCosts": {
"amount": "994.00",
"currency": "USD"
},
"redemptionAmount": {
"amount": "21488.00",
"currency": "USD"
},
"redemptionDeadline": "2026-08-25",
"redemptionEligible": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rightToCureNotice
repossession.rightToCureNotice · POST /repossessions/right-to-cure-notice · gate key · sandbox · answers RepossessionRightToCureNotice@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.rightToCureNoticed@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.rightToCureNotice()curl -X POST https://apis.vin/repossessions/right-to-cure-notice \
-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": "RepossessionRightToCureNotice@1",
"value": {
"vin": "1HGCM82633A004352",
"noticeRef": "RTC-001O",
"cureAmount": {
"amount": "1840.50",
"currency": "USD"
},
"cureDeadline": "2026-08-30",
"curePeriodDays": 20,
"deliveryMethod": "certified-mail",
"compliant": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1HGCM82633A004352",
"noticeRef": "RTC-001O",
"cureAmount": {
"amount": "1840.50",
"currency": "USD"
},
"cureDeadline": "2026-08-30",
"curePeriodDays": 20,
"deliveryMethod": "certified-mail",
"compliant": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}surplus
repossession.surplus · POST /repossessions/surplus · gate offer · sandbox · answers RepossessionSurplus@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) · /2C4RC1BG0PR535313 (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 — Repossession.failed@1 · Repossession.surplusRefunded@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.surplus({"vin":"2C4RC1BG0PR535313"})curl -X POST https://apis.vin/repossessions/surplus \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313"}'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": "RepossessionSurplus@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
},
"surplus": {
"status": "no-repo-on-file"
}
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"noun": "repossession",
"asOf": "2026-08-10",
"repo": {
"status": "no-repo-on-file"
},
"surplus": {
"status": "no-repo-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "repo-yard-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}trigger
repossession.trigger · POST /repossessions/trigger · gate offer · sandbox · answers RepossessionTrigger@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) · /2C4RC1BG0PR535313 (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 — Repossession.requested@1 · Repossession.triggered@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.trigger({"vin":"2C4RC1BG0PR535313"})curl -X POST https://apis.vin/repossessions/trigger \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG0PR535313"}'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": "RepossessionTrigger@1",
"value": {
"vin": "2C4RC1BG0PR535313",
"caseRef": "REPO-0027",
"breachOfPeaceCheckPassed": true,
"rightToCureExpired": true,
"daysDelinquent": 62,
"assignmentEligible": true,
"status": "assignment-authorized",
"asOf": "2026-08-10"
},
"evidence": {
"vin": "2C4RC1BG0PR535313",
"caseRef": "REPO-0027",
"breachOfPeaceCheckPassed": true,
"rightToCureExpired": true,
"daysDelinquent": 62,
"assignmentEligible": true,
"status": "assignment-authorized",
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}voluntarySurrender
repossession.voluntarySurrender · POST /repossessions/voluntary-surrender · gate key · sandbox · answers RepossessionVoluntarySurrender@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG0PR535313 (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 — Repossession.voluntarySurrendered@1.
import { repossession } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.voluntarySurrender()curl -X POST https://apis.vin/repossessions/voluntary-surrender \
-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": "RepossessionVoluntarySurrender@1",
"value": {
"vin": "1HGCM82633A004352",
"surrenderRef": "RVS-001O",
"fsmState": "Recovered",
"surrenderType": "voluntary",
"breachOfPeaceRisk": "none",
"surrenderLocation": "lender-designated-lot",
"deficiencyMayApply": true,
"personalPropertyInventoryOpened": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1HGCM82633A004352",
"surrenderRef": "RVS-001O",
"fsmState": "Recovered",
"surrenderType": "voluntary",
"breachOfPeaceRisk": "none",
"surrenderLocation": "lender-designated-lot",
"deficiencyMayApply": true,
"personalPropertyInventoryOpened": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "legal-authority-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.
Repossession
Schema
| Property | Type | Notes |
|---|---|---|
id | id | repo_ |
loanId | ref→Loan | — |
vin | string | — |
agentId | ref→Party | — |
status | RepoServicingFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
repossession | loan | *:1 | recovers |
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.
Repossession · Class model
Repossession · State machine
Repossession · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
repairOrder
The repairOrder noun — identity, lifecycle, events, and every capability as an anchored section: 3 capabilities, 0 live, 3 sandbox, 0 declared.
reputation
The reputation noun — identity, lifecycle, events, and every capability as an anchored section: 1 capability, 0 live, 1 sandbox, 0 declared.