lien
The lien noun — identity, lifecycle, events, and every capability as an anchored section: 15 capabilities, 0 live, 15 sandbox, 0 declared.
lien 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 aggregator.vin.
Identity
| Noun | lien |
| Pillar | Services (facets: 4 data · 9 services · 2 commerce) |
| Capabilities | 15 — 0 live · 15 sandbox · 0 declared |
| Entities | Lien |
| Doors | aggregator.vin |
| SDK | Vin.lien.* from apis.vin |
| Address | /catalog/lien#{action} — the anchor IS the wire name minus lien. |
Events
The vocabulary this noun can append to the record — 26 past-tense, versioned event types, each linked to the capability that emits it:
Lien.assignRequested@1— emitted byassignLien.assigned@1— emitted byassignLien.eltAdded@1— emitted byeltLien.eltReleaseFailed@1— emitted byeltReleaseLien.eltReleaseRequested@1— emitted byeltReleaseLien.eltReleased@1— emitted byeltReleaseLien.eltRequested@1— emitted byeltLien.elted@1— emitted byeltLien.feeCharged@1— emitted byfeeLien.feeRequested@1— emitted byfeeLien.fraudulentClaimContested@1— emitted byfraudulentClaimContestLien.paid@1— emitted bypayLien.payFailed@1— emitted bypayLien.payRequested@1— emitted bypayLien.perfectFailed@1— emitted byperfectLien.perfectRequested@1— emitted byperfectLien.perfected@1— emitted byperfectLien.priorityDisputed@1— emitted bypriorityDisputeLien.recordFailed@1— emitted byrecordLien.recordRequested@1— emitted byrecordLien.recorded@1— emitted byrecordLien.releaseFailed@1— emitted byreleaseLien.releaseRequested@1— emitted byreleaseLien.released@1— emitted byreleaseLien.satisfactionDisputed@1— emitted bysatisfactionDisputeLien.subscribed@1— emitted bysubscribe
Discover & read
lookup
lien.lookup · GET /liens/lookup · gate none · sandbox · answers LienLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.lookup({"vin":"2C4RC1BG2HR703812"})curl 'https://apis.vin/liens/lookup?vin=2C4RC1BG2HR703812'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": "LienLookup@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"lien": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"servicing": "Current"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"lien": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"servicing": "Current"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
lien.status · GET /liens/status · gate none · sandbox · answers LienStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.status({"vin":"2C4RC1BG2HR703812"})curl 'https://apis.vin/liens/status?vin=2C4RC1BG2HR703812'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": "LienStatus@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"lien": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"servicing": "Current"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"lien": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"servicing": "Current"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
lien.verify · GET /liens/verify · gate none · sandbox · answers LienVerify@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.verify({"vin":"2C4RC1BG2HR703812"})curl 'https://apis.vin/liens/verify?vin=2C4RC1BG2HR703812'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": "LienVerify@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"lien": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"servicing": "Current"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"lien": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"servicing": "Current"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
fee
lien.fee · POST /liens/fee · gate offer · sandbox · answers LienFee@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) · /2C4RC1BG2HR703812 (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 — Lien.feeCharged@1 · Lien.feeRequested@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.fee({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/fee \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienFee@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"fee": {
"id": "LF-f228c7fe",
"amountCents": 1500,
"currency": "USD",
"status": "quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"fee": {
"id": "LF-f228c7fe",
"amountCents": 1500,
"currency": "USD",
"status": "quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
subscribe
lien.subscribe · POST /liens/subscribe · gate key · sandbox · answers LienSubscribe@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (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 — Lien.subscribed@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.subscribe()curl -X POST https://apis.vin/liens/subscribe \
-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": "LienSubscribe@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"subscription": {
"id": "LS-91c2bd29",
"plan": "elt-monitor",
"amountCents": 2900,
"currency": "USD",
"status": "active"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"subscription": {
"id": "LS-91c2bd29",
"plan": "elt-monitor",
"amountCents": 2900,
"currency": "USD",
"status": "active"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}assign
lien.assign · POST /liens/assign · gate offer · sandbox · answers LienAssign@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) · /2C4RC1BG2HR703812 (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 — Lien.assignRequested@1 · Lien.assigned@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.assign({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/assign \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienAssign@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"assignment": {
"status": "assigned",
"id": "LIEN-5464eab4",
"from": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"to": {
"fsId": "F000WL",
"name": "Wells Fargo Auto"
}
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"assignment": {
"status": "assigned",
"id": "LIEN-5464eab4",
"from": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"to": {
"fsId": "F000WL",
"name": "Wells Fargo Auto"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
lien.pay · POST /liens/pay · gate offer · sandbox · answers LienPay@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) · /2C4RC1BG2HR703812 (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 — Lien.paid@1 · Lien.payFailed@1 · Lien.payRequested@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.pay({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/pay \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienPay@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-afde5710",
"amountCents": 1500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-afde5710",
"amountCents": 1500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
priorityDispute
lien.priorityDispute · POST /liens/priority-dispute · gate key · sandbox · answers LienPriorityDispute@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (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 — Lien.priorityDisputed@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.priorityDispute()curl -X POST https://apis.vin/liens/priority-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": "LienPriorityDispute@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"dispute": {
"status": "no-lien-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"dispute": {
"status": "no-lien-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}satisfactionDispute
lien.satisfactionDispute · POST /liens/satisfaction-dispute · gate key · sandbox · answers LienSatisfactionDispute@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (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 — Lien.satisfactionDisputed@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.satisfactionDispute()curl -X POST https://apis.vin/liens/satisfaction-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": "LienSatisfactionDispute@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"dispute": {
"status": "no-lien-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"dispute": {
"status": "no-lien-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
release
lien.release · POST /liens/release · gate offer · sandbox · answers LienRelease@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) · /2C4RC1BG2HR703812 (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 — Lien.releaseFailed@1 · Lien.releaseRequested@1 · Lien.released@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.release({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/release \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienRelease@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"release": {
"status": "note-outstanding",
"id": "LIEN-5464eab4",
"servicing": "Current"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"release": {
"status": "note-outstanding",
"id": "LIEN-5464eab4",
"servicing": "Current"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}eltRelease
lien.eltRelease · POST /liens/elt-release · gate offer · sandbox · answers LienEltRelease@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) · /2C4RC1BG2HR703812 (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 — Lien.eltReleaseFailed@1 · Lien.eltReleaseRequested@1 · Lien.eltReleased@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.eltRelease({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/elt-release \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienEltRelease@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"release": {
"status": "note-outstanding",
"id": "LIEN-5464eab4"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"release": {
"status": "note-outstanding",
"id": "LIEN-5464eab4"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
elt
lien.elt · POST /liens/elt · gate offer · sandbox · answers LienElt@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) · /2C4RC1BG2HR703812 (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 — Lien.eltAdded@1 · Lien.eltRequested@1 · Lien.elted@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.elt({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/elt \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienElt@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"elt": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"medium": "electronic"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"elt": {
"id": "LIEN-5464eab4",
"standing": "perfected",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
},
"medium": "electronic"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}fraudulentClaimContest
lien.fraudulentClaimContest · POST /liens/fraudulent-claim-contest · gate key · sandbox · answers LienFraudulentClaimContest@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RC1BG2HR703812 (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 — Lien.fraudulentClaimContested@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.fraudulentClaimContest()curl -X POST https://apis.vin/liens/fraudulent-claim-contest \
-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": "LienFraudulentClaimContest@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"contest": {
"status": "no-lien-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lien",
"asOf": "2026-08-10",
"contest": {
"status": "no-lien-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}perfect
lien.perfect · POST /liens/perfect · gate offer · sandbox · answers LienPerfect@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) · /2C4RC1BG2HR703812 (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 — Lien.perfectFailed@1 · Lien.perfectRequested@1 · Lien.perfected@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.perfect({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/perfect \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienPerfect@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"perfection": {
"status": "already-perfected",
"id": "LIEN-5464eab4"
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"perfection": {
"status": "already-perfected",
"id": "LIEN-5464eab4"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}record
lien.record · POST /liens/record · gate offer · sandbox · answers LienRecord@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) · /2C4RC1BG2HR703812 (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 — Lien.recordFailed@1 · Lien.recordRequested@1 · Lien.recorded@1.
import { lien } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lien.record({"vin":"2C4RC1BG2HR703812"})curl -X POST https://apis.vin/liens/record \
-H 'content-type: application/json' \
-d '{"vin":"2C4RC1BG2HR703812"}'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": "LienRecord@1",
"value": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"recording": {
"status": "already-recorded",
"id": "LIEN-5464eab4",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
}
}
},
"evidence": {
"vin": "2C4RC1BG2HR703812",
"noun": "lien",
"asOf": "2026-08-10",
"recording": {
"status": "already-recorded",
"id": "LIEN-5464eab4",
"lienholder": {
"fsId": "F00SET",
"name": "Southeast Toyota Finance"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-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.
Lien
Schema
| Property | Type |
|---|---|
lienId | id |
lienholderId | ref→Lender |
position | int |
perfectedAt | datetime |
releasedAt | datetime |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
title | lien | 1:0..* | encumbered |
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.
Lien · Class model
Lien · State machine
Lien · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.