title
The title noun — identity, lifecycle, events, and every capability as an anchored section: 25 capabilities, 0 live, 25 sandbox, 0 declared.
title is one of the estate's 317 automotive nouns — a job a car needs done. It carries 25 capabilities: 0 live, 25 sandbox, 0 declared · doors title.vin · aggregator.vin.
Identity
| Noun | title |
| Pillar | Services (facets: 8 data · 14 services · 3 commerce) |
| Capabilities | 25 — 0 live · 25 sandbox · 0 declared |
| Entities | Title |
| Doors | aggregator.vin · title.vin |
| SDK | Vin.title.* from apis.vin |
| Address | /catalog/title#{action} — the anchor IS the wire name minus title. |
Lifecycle
Title — TitleFSM: 7 states, 7 transitions — Ordered · Applied · Pending · Issued · Branded · Transferred · Released. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 50 past-tense, versioned event types, each linked to the capability that emits it:
EndOfLife.titleReleased@1— emitted byreleaseServiceOrder.settled@1— emitted byorderTitle.assignRequested@1— emitted byassignTitle.assigned@1— emitted byassignTitle.bondedProcessed@1— emitted bybondedTitle.bondedRequested@1— emitted bybondedTitle.brandDisclosed@1— emitted bybrandDiscloseTitle.branded@1— emitted bybrandTitle.completed@1— emitted byorderTitle.corrected@1— emitted bycorrectionTitle.correctionFailed@1— emitted bycorrectionTitle.correctionRequested@1— emitted bycorrectionTitle.courtOrderedTitled@1— emitted bycourtOrderedTitleTitle.decoded@1— emitted bydecodeTitle.dispatched@1— emitted byorderTitle.duplicateFailed@1— emitted byduplicateTitle.duplicateRequested@1— emitted byduplicateTitle.duplicated@1— emitted byduplicateTitle.expediteRequested@1— emitted byexpediteTitle.expedited@1— emitted byexpediteTitle.failed@1— emitted byorder·payTitle.feeCharged@1— emitted byfeeTitle.feeRequested@1— emitted byfeeTitle.foreignTitleImported@1— emitted byforeignTitleImportTitle.lienPerfected@1— emitted byperfectTitle.lienReleased@1— emitted byreleaseTitle.newStateRequested@1— emitted bynewStateTitle.ordered@1— emitted byorderTitle.paid@1— emitted bypayTitle.payFailed@1— emitted bypayTitle.payRequested@1— emitted bypayTitle.perfectFailed@1— emitted byperfectTitle.perfectRequested@1— emitted byperfectTitle.perfected@1— emitted byperfectTitle.quoteRequested@1— emitted byquoteTitle.quoted@1— emitted byquoteTitle.releaseFailed@1— emitted byreleaseTitle.releaseRequested@1— emitted byreleaseTitle.released@1— emitted byreleaseTitle.requested@1— emitted byorderTitle.stateConverted@1— emitted bynewStateTitle.subscribed@1— emitted bysubscribeTitle.transferFailed@1— emitted bytransferTitle.transferRequested@1— emitted bytransferTitle.transferred@1— emitted bytransferTitleWork.ordered@1— emitted byorderTitleWork.quoted@1— emitted byquoteTitleWork.submitted@1— emitted byorderVehicle.registered@1— emitted byorderVehicle.titled@1— emitted byorder
Discover & read
lookup
title.lookup · GET /titles/lookup · gate none · sandbox · answers TitleLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.lookup({"vin":"4S4GUHM69T3775945"})curl 'https://apis.vin/titles/lookup?vin=4S4GUHM69T3775945'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": "TitleLookup@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"titleStatus": "clear",
"filingType": "paper",
"onFile": true
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"titleStatus": "clear",
"filingType": "paper",
"onFile": true
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}decode
title.decode · GET /titles/decode · gate key · sandbox · answers TitleDecode@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.decoded@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.decode({"vin":"4S4GUHM69T3775945"})curl 'https://apis.vin/titles/decode?vin=4S4GUHM69T3775945'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": "TitleDecode@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"titleStatus": "clear",
"branded": false,
"lienPresent": false,
"clean": true
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"titleStatus": "clear",
"branded": false,
"lienPresent": false,
"clean": true
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
title.status · GET /titles/status · gate none · sandbox · answers TitleStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.status({"vin":"4S4GUHM69T3775945"})curl 'https://apis.vin/titles/status?vin=4S4GUHM69T3775945'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": "TitleStatus@1",
"value": {
"vin": "4S4GUHM69T3775945",
"titleStatus": "clear",
"complete": true,
"checklist": [
{
"key": "odometer-disclosure",
"label": "Odometer disclosure",
"required": true,
"satisfied": true
},
{
"key": "proof-of-ownership",
"label": "Proof of ownership / prior title",
"required": true,
"satisfied": true
},
{
"key": "lien-release",
"label": "Lien release (ELT)",
"required": false,
"satisfied": false
},
{
"key": "brand-disclosure",
"label": "Salvage/brand disclosure",
"required": false,
"satisfied": false
}
]
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"titleStatus": "clear",
"complete": true,
"checklist": [
{
"key": "odometer-disclosure",
"label": "Odometer disclosure",
"required": true,
"satisfied": true
},
{
"key": "proof-of-ownership",
"label": "Proof of ownership / prior title",
"required": true,
"satisfied": true
},
{
"key": "lien-release",
"label": "Lien release (ELT)",
"required": false,
"satisfied": false
},
{
"key": "brand-disclosure",
"label": "Salvage/brand disclosure",
"required": false,
"satisfied": false
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
title.verify · GET /titles/verify · gate none · sandbox · answers TitleVerify@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.verify({"vin":"4S4GUHM69T3775945"})curl 'https://apis.vin/titles/verify?vin=4S4GUHM69T3775945'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": "TitleVerify@1",
"value": {
"vin": "4S4GUHM69T3775945",
"titleStatus": "clear",
"verified": true,
"clean": true,
"complete": true,
"checklist": [
{
"key": "odometer-disclosure",
"label": "Odometer disclosure",
"required": true,
"satisfied": true
},
{
"key": "proof-of-ownership",
"label": "Proof of ownership / prior title",
"required": true,
"satisfied": true
},
{
"key": "lien-release",
"label": "Lien release (ELT)",
"required": false,
"satisfied": false
},
{
"key": "brand-disclosure",
"label": "Salvage/brand disclosure",
"required": false,
"satisfied": false
}
]
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"titleStatus": "clear",
"verified": true,
"clean": true,
"complete": true,
"checklist": [
{
"key": "odometer-disclosure",
"label": "Odometer disclosure",
"required": true,
"satisfied": true
},
{
"key": "proof-of-ownership",
"label": "Proof of ownership / prior title",
"required": true,
"satisfied": true
},
{
"key": "lien-release",
"label": "Lien release (ELT)",
"required": false,
"satisfied": false
},
{
"key": "brand-disclosure",
"label": "Salvage/brand disclosure",
"required": false,
"satisfied": false
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}brandLookup
title.brandLookup · GET /titles/brand-lookup · gate none · sandbox · answers TitleBrandLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.brandLookup({"vin":"4S4GUHM69T3775945"})curl 'https://apis.vin/titles/brand-lookup?vin=4S4GUHM69T3775945'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": "TitleBrandLookup@1",
"value": {
"vin": "4S4GUHM69T3775945",
"brands": [],
"count": 0,
"titleStatus": "clear"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"brands": [],
"count": 0,
"titleStatus": "clear"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}jumpTitleDetect
title.jumpTitleDetect · GET /titles/jump-title-detect · gate none · sandbox · answers TitleJumpTitleDetect@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.jumpTitleDetect()curl 'https://apis.vin/titles/jump-title-detect'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": "TitleJumpTitleDetect@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"detection": {
"status": "no-title-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"detection": {
"status": "no-title-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
quote
title.quote · POST /titles/quote · gate none · sandbox · answers TitleQuote@1
Promoted — earned its own page: /catalog/title.quote (computed on every regen: price posted + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
work | string | yes | one of transfer, lien-release, correction, duplicate, bonded, out-of-state-convert |
state | string | yes | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.quoteRequested@1 · Title.quoted@1 · TitleWork.quoted@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.quote({"vin":"4S4GUHM69T3775945","work":"transfer","state":"state"})curl -X POST https://apis.vin/titles/quote \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945","work":"transfer","state":"state"}'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": "TitleQuote@1",
"value": {
"quoteId": "TFE-1",
"state": "state",
"filingType": "paper",
"lineItems": [
{
"code": "title-fee",
"label": "Title fee",
"amountCents": 1500
},
{
"code": "registration-fee",
"label": "Registration fee",
"amountCents": 6500
},
{
"code": "plate-fee",
"label": "Plate/transfer fee",
"amountCents": 2500
},
{
"code": "doc-fee",
"label": "Filing/doc fee",
"amountCents": 8500
}
],
"totalCents": 19000,
"currency": "USD"
},
"evidence": {
"quoteId": "TFE-1",
"state": "state",
"filingType": "paper",
"lineItems": [
{
"code": "title-fee",
"label": "Title fee",
"amountCents": 1500
},
{
"code": "registration-fee",
"label": "Registration fee",
"amountCents": 6500
},
{
"code": "plate-fee",
"label": "Plate/transfer fee",
"amountCents": 2500
},
{
"code": "doc-fee",
"label": "Filing/doc fee",
"amountCents": 8500
}
],
"totalCents": 19000,
"currency": "USD"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": true
}
}fee
title.fee · POST /titles/fee · gate offer · sandbox · answers TitleFee@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.feeCharged@1 · Title.feeRequested@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.fee({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/fee \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleFee@1",
"value": {
"estimateId": "TFE-1",
"state": "AZ",
"filingType": "paper",
"lines": [
{
"code": "title-fee",
"label": "Title fee",
"amountCents": 1500
},
{
"code": "registration-fee",
"label": "Registration fee",
"amountCents": 6500
},
{
"code": "plate-fee",
"label": "Plate/transfer fee",
"amountCents": 2500
},
{
"code": "doc-fee",
"label": "Filing/doc fee",
"amountCents": 8500
}
],
"totalCents": 19000,
"currency": "USD"
},
"evidence": {
"estimateId": "TFE-1",
"state": "AZ",
"filingType": "paper",
"lines": [
{
"code": "title-fee",
"label": "Title fee",
"amountCents": 1500
},
{
"code": "registration-fee",
"label": "Registration fee",
"amountCents": 6500
},
{
"code": "plate-fee",
"label": "Plate/transfer fee",
"amountCents": 2500
},
{
"code": "doc-fee",
"label": "Filing/doc fee",
"amountCents": 8500
}
],
"totalCents": 19000,
"currency": "USD"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
order
title.order · POST /titles/order · gate offer · sandbox · answers TitleWorkOrder@1
Promoted — earned its own page: /catalog/title.order (computed on every regen: price posted + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
work | string | yes | one of transfer, lien-release, correction, duplicate, bonded, out-of-state-convert |
state | string | yes | — |
quoteId | string | no | — |
parties | object | no | — |
documents | array<string> | no | — |
subject | string | no | — |
authority | 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: posted at /pricing.
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — ServiceOrder.settled@1 · Title.completed@1 · Title.dispatched@1 · Title.failed@1 · Title.ordered@1 · Title.requested@1 · TitleWork.ordered@1 · TitleWork.submitted@1 · Vehicle.registered@1 · Vehicle.titled@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.order({"vin":"4S4GUHM69T3775945","work":"transfer","state":"state"})curl -X POST https://apis.vin/titles/order \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945","work":"transfer","state":"state"}'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": "TitleWorkOrder@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "state",
"workOrder": {
"orderId": "serviceorder_EMVh3MmY1dFQ",
"titleNumber": "state-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"status": "Complete"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "state",
"workOrder": {
"orderId": "serviceorder_EMVh3MmY1dFQ",
"titleNumber": "state-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"status": "Complete"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": true
}
}subscribe
title.subscribe · POST /titles/subscribe · gate key · sandbox · answers TitleSubscribe@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.subscribed@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.subscribe()curl -X POST https://apis.vin/titles/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": "TitleSubscribe@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"subscription": {
"id": "SUB-c571adbc",
"titleId": "TTL-6eade2d4",
"watching": "no-title-on-file",
"status": "active"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"subscription": {
"id": "SUB-c571adbc",
"titleId": "TTL-6eade2d4",
"watching": "no-title-on-file",
"status": "active"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}assign
title.assign · POST /titles/assign · gate offer · sandbox · answers TitleAssign@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.assignRequested@1 · Title.assigned@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.assign({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/assign \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleAssign@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"assignment": {
"status": "title-not-yet-issued",
"position": "Ordered"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"assignment": {
"status": "title-not-yet-issued",
"position": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
title.pay · POST /titles/pay · gate offer · sandbox · answers TitlePay@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.failed@1 · Title.paid@1 · Title.payFailed@1 · Title.payRequested@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.pay({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/pay \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitlePay@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-67cf919c",
"amountCents": 19000,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-67cf919c",
"amountCents": 19000,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
transfer
title.transfer · POST /titles/transfer · gate offer · sandbox · answers TitleTransfer@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.transferFailed@1 · Title.transferRequested@1 · Title.transferred@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.transfer({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/transfer \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleTransfer@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"titled": true,
"status": "Complete",
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"titled": true,
"status": "Complete",
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}release
title.release · POST /titles/release · gate offer · sandbox · answers TitleRelease@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — EndOfLife.titleReleased@1 · Title.lienReleased@1 · Title.releaseFailed@1 · Title.releaseRequested@1 · Title.released@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.release({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/release \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleRelease@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"lienReleased": true,
"status": "Complete",
"titleNumber": "AZ-TTL-1",
"lienholder": "lienholder-of-record",
"titleStatus": "clear"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"lienReleased": true,
"status": "Complete",
"titleNumber": "AZ-TTL-1",
"lienholder": "lienholder-of-record",
"titleStatus": "clear"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [
"EndOfLife.titleReleased@1",
"Title.lienReleased@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}brandDisclose
title.brandDisclose · POST /titles/brand-disclose · gate offer · sandbox · answers TitleBrandDisclose@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.brandDisclosed@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.brandDisclose({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/brand-disclose \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleBrandDisclose@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"disclosure": {
"required": false,
"brands": [],
"titleStatus": "clear",
"position": "Ordered"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"disclosure": {
"required": false,
"brands": [],
"titleStatus": "clear",
"position": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
bonded
title.bonded · POST /titles/bonded · gate offer · sandbox · answers TitleBonded@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.bondedProcessed@1 · Title.bondedRequested@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.bonded({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/bonded \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleBonded@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"bond": {
"status": "title-already-on-file",
"titleId": "TTL-2712918a",
"position": "Ordered"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"bond": {
"status": "title-already-on-file",
"titleId": "TTL-2712918a",
"position": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}brand
title.brand · POST /titles/brand · gate offer · sandbox · answers TitleBrand@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.branded@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.brand({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/brand \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleBrand@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"filing": {
"status": "title-not-yet-issued",
"position": "Ordered"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"filing": {
"status": "title-not-yet-issued",
"position": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}chain
title.chain · GET /titles/chain · gate none · sandbox · answers TitleChain@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.chain({"vin":"4S4GUHM69T3775945"})curl 'https://apis.vin/titles/chain?vin=4S4GUHM69T3775945'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": "TitleChain@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"chain": [
{
"link": 1,
"holder": "prior-owner",
"titleNumber": null
},
{
"link": 2,
"holder": "current-owner",
"titleNumber": "AZ-TTL-1"
}
],
"links": 2,
"filingType": "paper",
"titleStatus": "clear"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"chain": [
{
"link": 1,
"holder": "prior-owner",
"titleNumber": null
},
{
"link": 2,
"holder": "current-owner",
"titleNumber": "AZ-TTL-1"
}
],
"links": 2,
"filingType": "paper",
"titleStatus": "clear"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}correction
title.correction · POST /titles/correction · gate offer · sandbox · answers TitleCorrection@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.corrected@1 · Title.correctionFailed@1 · Title.correctionRequested@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.correction({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/correction \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleCorrection@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"corrected": true,
"field": "odometer",
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"corrected": true,
"field": "odometer",
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}courtOrderedTitle
title.courtOrderedTitle · POST /titles/court-ordered-title · gate key · sandbox · answers TitleCourtOrderedTitle@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.courtOrderedTitled@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.courtOrderedTitle()curl -X POST https://apis.vin/titles/court-ordered-title \
-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": "TitleCourtOrderedTitle@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"order": {
"status": "court-order-filed",
"id": "CRT-6dfd2b8f",
"titleId": "TTL-6eade2d4",
"opensAt": "Ordered"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"order": {
"status": "court-order-filed",
"id": "CRT-6dfd2b8f",
"titleId": "TTL-6eade2d4",
"opensAt": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}duplicate
title.duplicate · POST /titles/duplicate · gate offer · sandbox · answers TitleDuplicate@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.duplicateFailed@1 · Title.duplicateRequested@1 · Title.duplicated@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.duplicate({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/duplicate \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleDuplicate@1",
"value": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"duplicate": true,
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"forms": [
{
"code": "MV-1",
"title": "Application for title & registration",
"docRef": "form:AZ:MV-1:4S4GUHM69T3775945"
},
{
"code": "POA",
"title": "Power of attorney",
"docRef": "form:AZ:POA:4S4GUHM69T3775945"
}
],
"status": "Complete"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"state": "AZ",
"duplicate": true,
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"forms": [
{
"code": "MV-1",
"title": "Application for title & registration",
"docRef": "form:AZ:MV-1:4S4GUHM69T3775945"
},
{
"code": "POA",
"title": "Power of attorney",
"docRef": "form:AZ:POA:4S4GUHM69T3775945"
}
],
"status": "Complete"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}expedite
title.expedite · POST /titles/expedite · gate offer · sandbox · answers TitleExpedite@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.expediteRequested@1 · Title.expedited@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.expedite({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/expedite \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleExpedite@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"expedite": {
"status": "expedited",
"titleId": "TTL-2712918a",
"position": "Ordered",
"readyBy": "2026-08-13"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"expedite": {
"status": "expedited",
"titleId": "TTL-2712918a",
"position": "Ordered",
"readyBy": "2026-08-13"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}foreignTitleImport
title.foreignTitleImport · POST /titles/foreign-title-import · gate key · sandbox · answers TitleForeignTitleImport@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.foreignTitleImported@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.foreignTitleImport()curl -X POST https://apis.vin/titles/foreign-title-import \
-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": "TitleForeignTitleImport@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"import": {
"status": "import-filed",
"id": "IMP-2ed35191",
"titleId": "TTL-6eade2d4",
"opensAt": "Ordered"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "title",
"asOf": "2026-08-10",
"import": {
"status": "import-filed",
"id": "IMP-2ed35191",
"titleId": "TTL-6eade2d4",
"opensAt": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}newState
title.newState · POST /titles/new-state · gate offer · sandbox · answers TitleNewState@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.newStateRequested@1 · Title.stateConverted@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.newState({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/new-state \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitleNewState@1",
"value": {
"vin": "4S4GUHM69T3775945",
"fromState": "CA",
"toState": "AZ",
"retitled": true,
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"fromState": "CA",
"toState": "AZ",
"retitled": true,
"titleNumber": "AZ-TTL-1",
"filingType": "paper",
"titleStatus": "clear"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-registration-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}perfect
title.perfect · POST /titles/perfect · gate offer · sandbox · answers TitlePerfect@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 — title.vin serves this noun on its two routes: / (the landing) · /4S4GUHM69T3775945 (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 — Title.lienPerfected@1 · Title.perfectFailed@1 · Title.perfectRequested@1 · Title.perfected@1.
import { title } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await title.perfect({"vin":"4S4GUHM69T3775945"})curl -X POST https://apis.vin/titles/perfect \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM69T3775945"}'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": "TitlePerfect@1",
"value": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"perfection": {
"status": "already-perfected",
"id": "LIEN-57c32616",
"titlePosition": "Ordered"
}
},
"evidence": {
"vin": "4S4GUHM69T3775945",
"noun": "title",
"asOf": "2026-08-10",
"perfection": {
"status": "already-perfected",
"id": "LIEN-57c32616",
"titlePosition": "Ordered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-cabinet-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.
Title
Schema
| Property | Type | Notes |
|---|---|---|
titleId | id | — |
vin | string | — |
state | UsState | — |
titleNumber | string | — |
docType | enum | paper|eTitle|MCO |
brands | TitleBrand[] | — |
ownerId | ref→Party | — |
status | TitleFSM | — |
issuedAt | datetime | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
vehicle | title | 1:0..1 | titled |
title | lien | 1:0..* | encumbered |
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 5 diagrams, rendered from the estate model.
Title · Class model
Title · State machine
Title · State machine
Title · State machine
Title · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
testDrive
The testDrive noun — identity, lifecycle, events, and every capability as an anchored section: 8 capabilities, 0 live, 8 sandbox, 0 declared.
titleBrand
The titleBrand noun — identity, lifecycle, events, and every capability as an anchored section: 10 capabilities, 0 live, 10 sandbox, 0 declared.