docs.vin

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

Nounrepossession
PillarServices (facets: 2 data · 9 services · 4 commerce)
Capabilities15 — 0 live · 15 sandbox · 0 declared
EntitiesRepossession
Doorsaggregator.vin · repo.vin
SDKVin.repossession.* from apis.vin
Address/catalog/repossession#{action} — the anchor IS the wire name minus repossession.

Lifecycle

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

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.

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

EmitsRepossession.breachOfPeaceChecked@1.

the SDK — repossession.breachOfPeaceCheck
import { repossession } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.breachOfPeaceCheck()
GET /repossessions/breach-of-peace-check
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.

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

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

EmitsRepossession.reinstatementQuoted@1.

the SDK — repossession.reinstatementQuote
import { repossession } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.reinstatementQuote()
GET /repossessions/reinstatement-quote
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.

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

FieldTypeRequiredNotes
vinstringyeslength 11–17
accountstringyesloan/account ref acc_…
lienholderstringnoparty 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.

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

EmitsRecoveryAgent.dispatched@1 · Repo.assigned@1.

the SDK — repossession.assign
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"})
POST /repossessions/assign
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.

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

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) · /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.

EmitsRepossession.repoTitleReassigned@1.

the SDK — repossession.titleReassign
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"})
POST /repossessions/title-reassign
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.

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

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

EmitsRepossession.wrongfulRepoDisputed@1.

the SDK — repossession.wrongfulRepoDispute
import { repossession } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.wrongfulRepoDispute()
POST /repossessions/wrongful-repo-dispute
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.

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

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

EmitsRepossession.personalPropertyReturned@1.

the SDK — repossession.personalPropertyReturn
import { repossession } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.personalPropertyReturn()
POST /repossessions/personal-property-return
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.

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

FieldTypeRequiredNotes
vinstringno

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

EmitsRepossession.deficiencyBilled@1.

the SDK — repossession.deficiency
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"})
GET /repossessions/deficiency
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.

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

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) · /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.

EmitsRepossession.noiIssued@1.

the SDK — repossession.noticeCompliance
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"})
POST /repossessions/notice-compliance
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.

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

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) · /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.

EmitsRepossession.recovered@1 · Repossession.requested@1.

the SDK — repossession.recover
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"})
POST /repossessions/recover
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.

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

FieldTypeRequiredNotes
vinstringyeslength 11–17
assignmentstringyesrepo assignment ref rpa_…
borrowerobjectnoparty 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.

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

EmitsRedemption.completed@1 · Redemption.quoted@1.

the SDK — repossession.redeem
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"})
POST /repossessions/redeem
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.

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

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) · /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.

EmitsRepossession.failed@1 · Repossession.redemptionQuoted@1.

the SDK — repossession.redemption
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"})
POST /repossessions/redemption
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.

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

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

EmitsRepossession.rightToCureNoticed@1.

the SDK — repossession.rightToCureNotice
import { repossession } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.rightToCureNotice()
POST /repossessions/right-to-cure-notice
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.

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

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) · /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.

EmitsRepossession.failed@1 · Repossession.surplusRefunded@1.

the SDK — repossession.surplus
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"})
POST /repossessions/surplus
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.

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

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) · /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.

EmitsRepossession.requested@1 · Repossession.triggered@1.

the SDK — repossession.trigger
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"})
POST /repossessions/trigger
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.

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

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

EmitsRepossession.voluntarySurrendered@1.

the SDK — repossession.voluntarySurrender
import { repossession } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await repossession.voluntarySurrender()
POST /repossessions/voluntary-surrender
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.

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

PropertyTypeNotes
ididrepo_
loanIdref→Loan
vinstring
agentIdref→Party
statusRepoServicingFSM

Relationships

FromToCardinalityAs
repossessionloan*:1recovers

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.