lead
The lead noun — identity, lifecycle, events, and every capability as an anchored section: 20 capabilities, 0 live, 20 sandbox, 0 declared.
lead is one of the estate's 317 automotive nouns — a job a car needs done. It carries 20 capabilities: 0 live, 20 sandbox, 0 declared · doors dealers.vin · aggregator.vin.
Identity
| Noun | lead |
| Pillar | Services (facets: 6 data · 11 services · 3 commerce) |
| Capabilities | 20 — 0 live · 20 sandbox · 0 declared |
| Entities | Lead |
| Doors | aggregator.vin · dealers.vin |
| SDK | Vin.lead.* from apis.vin |
| Address | /catalog/lead#{action} — the anchor IS the wire name minus lead. |
Lifecycle
Lead — LeadFSM: 8 states, 8 transitions — Captured · Deduped · Enriched · Qualified · Routed · Assigned · Nurtured · Dispositioned. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 15 past-tense, versioned event types, each linked to the capability that emits it:
Lead.adfExported@1— emitted byadfExportLead.assigned@1— emitted byassignLead.beBackLogged@1— emitted bybeBackLead.bought@1— emitted bybuyLead.captured@1— emitted bycaptureLead.deduped@1— emitted bydedupeLead.dispositioned@1— emitted bycapture·dispositionLead.enriched@1— emitted byenrichLead.failed@1— emitted bybuy·pay·refundLead.nurtured@1— emitted bynurtureLead.paid@1— emitted bypayLead.qualified@1— emitted bycapture·qualifyLead.refunded@1— emitted byrefundLead.routed@1— emitted byrouteLead.showroomLogged@1— emitted byshowroomLog
Discover & read
lookup
lead.lookup · GET /leads/lookup · gate none · sandbox · answers LeadLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.lookup({"vin":"1GNSKHKC0JR397822"})curl 'https://apis.vin/leads/lookup?vin=1GNSKHKC0JR397822'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": "LeadLookup@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"lead": {
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"lead": {
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}read
lead.read · GET /leads/read · gate none · sandbox · answers LeadRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.read({"vin":"1GNSKHKC0JR397822"})curl 'https://apis.vin/leads/read?vin=1GNSKHKC0JR397822'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": "LeadRead@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"lead": {
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"lead": {
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}history
lead.history · GET /leads/history · gate none · sandbox · answers LeadHistory@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.history({"vin":"1GNSKHKC0JR397822"})curl 'https://apis.vin/leads/history?vin=1GNSKHKC0JR397822'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": "LeadHistory@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"events": [
{
"date": "2026-06-26",
"kind": "lead-captured"
}
]
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"events": [
{
"date": "2026-06-26",
"kind": "lead-captured"
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}dncCheck
lead.dncCheck · GET /leads/dnc-check · gate key · sandbox · answers LeadDncCheck@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.dncCheck({"vin":"1GNSKHKC0JR397822"})curl 'https://apis.vin/leads/dnc-check?vin=1GNSKHKC0JR397822'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": "LeadDncCheck@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"dnc": {
"listed": false,
"identityId": "ID-11f17424"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"dnc": {
"listed": false,
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
assign
lead.assign · POST /leads/assign · gate offer · sandbox · answers LeadAssign@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.assigned@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.assign({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/assign \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadAssign@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"assignment": {
"status": "not-yet-routed",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"assignment": {
"status": "not-yet-routed",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
lead.pay · POST /leads/pay · gate offer · sandbox · answers LeadPay@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.failed@1 · Lead.paid@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.pay({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/pay \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadPay@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-944a7ffa",
"amountCents": 2500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-944a7ffa",
"amountCents": 2500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}capture
lead.capture · POST /leads/capture · gate offer · sandbox · answers Lead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
contact | object | no | — |
source | string | no | — |
intent | string | no | one of lead, hold, testdrive, open-deal |
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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.captured@1 · Lead.dispositioned@1 · Lead.qualified@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.capture({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/capture \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "Lead@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"capture": {
"status": "captured",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"capture": {
"status": "captured",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}buy
lead.buy · POST /leads/buy · gate offer · sandbox · answers LeadBuy@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.bought@1 · Lead.failed@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.buy({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/buy \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadBuy@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"order": {
"id": "ORD-9b8f59b4",
"leadId": "LD-3cdb1e1e",
"amountCents": 2500,
"currency": "USD",
"status": "purchased"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"order": {
"id": "ORD-9b8f59b4",
"leadId": "LD-3cdb1e1e",
"amountCents": 2500,
"currency": "USD",
"status": "purchased"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
lead.refund · POST /leads/refund · gate offer · sandbox · answers LeadRefund@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.failed@1 · Lead.refunded@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.refund({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/refund \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadRefund@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"refund": {
"id": "RF-fd3efe4e",
"leadId": "LD-3cdb1e1e",
"amountCents": 2500,
"currency": "USD",
"status": "refunded"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"refund": {
"id": "RF-fd3efe4e",
"leadId": "LD-3cdb1e1e",
"amountCents": 2500,
"currency": "USD",
"status": "refunded"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
adfExport
lead.adfExport · POST /leads/adf-export · gate offer · sandbox · answers LeadAdfExport@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.adfExported@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.adfExport({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/adf-export \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadAdfExport@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"export": {
"format": "adf-xml",
"leadId": "LD-3cdb1e1e",
"status": "exported"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"export": {
"format": "adf-xml",
"leadId": "LD-3cdb1e1e",
"status": "exported"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}beBack
lead.beBack · POST /leads/be-back · gate key · sandbox · answers LeadBeBack@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.beBackLogged@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.beBack()curl -X POST https://apis.vin/leads/be-back \
-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": "LeadBeBack@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lead",
"asOf": "2026-08-10",
"visit": {
"status": "no-lead-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lead",
"asOf": "2026-08-10",
"visit": {
"status": "no-lead-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}dedupe
lead.dedupe · POST /leads/dedupe · gate offer · sandbox · answers LeadDedupe@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.deduped@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.dedupe({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/dedupe \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadDedupe@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"dedupe": {
"status": "deduped",
"id": "LD-3cdb1e1e",
"duplicatesMerged": 1
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"dedupe": {
"status": "deduped",
"id": "LD-3cdb1e1e",
"duplicatesMerged": 1
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}disposition
lead.disposition · POST /leads/disposition · gate offer · sandbox · answers LeadDisposition@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.dispositioned@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.disposition({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/disposition \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadDisposition@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"disposition": {
"status": "not-yet-assigned",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"disposition": {
"status": "not-yet-assigned",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}enrich
lead.enrich · POST /leads/enrich · gate offer · sandbox · answers LeadEnrich@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.enriched@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.enrich({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/enrich \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadEnrich@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"enrichment": {
"status": "enriched",
"id": "LD-3cdb1e1e",
"appended": [
"phone",
"email",
"vehicle-interest"
]
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"enrichment": {
"status": "enriched",
"id": "LD-3cdb1e1e",
"appended": [
"phone",
"email",
"vehicle-interest"
]
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}nurture
lead.nurture · POST /leads/nurture · gate offer · sandbox · answers LeadNurture@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.nurtured@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.nurture({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/nurture \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadNurture@1",
"value": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"nurture": {
"status": "not-yet-assigned",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"evidence": {
"vin": "1GNSKHKC0JR397822",
"noun": "lead",
"asOf": "2026-08-10",
"nurture": {
"status": "not-yet-assigned",
"id": "LD-3cdb1e1e",
"position": "Captured"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}qualify
lead.qualify · POST /leads/qualify · gate offer · sandbox · answers LeadQualify@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.qualified@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.qualify({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/qualify \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadQualify@1",
"value": {
"leadId": "LEAD-1RKXEQE",
"vin": "1GNSKHKC0JR397822",
"qualified": true,
"band": "hot",
"score": 95,
"reasons": [
"verified-contact",
"active-shopping"
],
"asOf": "2026-08-10"
},
"evidence": {
"leadId": "LEAD-1RKXEQE",
"vin": "1GNSKHKC0JR397822",
"qualified": true,
"band": "hot",
"score": 95,
"reasons": [
"verified-contact",
"active-shopping"
],
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "market-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}route
lead.route · POST /leads/route · gate offer · sandbox · answers LeadRoute@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 — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.routed@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.route({"vin":"1GNSKHKC0JR397822"})curl -X POST https://apis.vin/leads/route \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKHKC0JR397822"}'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": "LeadRoute@1",
"value": {
"leadId": "LEAD-1JIMRSJ",
"routedTo": "AGENT-1QD727Y",
"queue": "internet",
"slaMinutes": 38,
"state": "routed",
"asOf": "2026-08-10"
},
"evidence": {
"leadId": "LEAD-1JIMRSJ",
"routedTo": "AGENT-1QD727Y",
"queue": "internet",
"slaMinutes": 38,
"state": "routed",
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "market-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}score
lead.score · GET /leads/score · gate key · sandbox · answers LeadScore@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.score({"vin":"1GNSKHKC0JR397822"})curl 'https://apis.vin/leads/score?vin=1GNSKHKC0JR397822'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": "LeadScore@1",
"value": {
"leadId": "LEAD-1RKXEQE",
"vin": "1GNSKHKC0JR397822",
"score": 95,
"band": "hot",
"factors": [
{
"name": "engagement",
"weight": 18
},
{
"name": "recency",
"weight": 1
},
{
"name": "intent",
"weight": 22
}
],
"asOf": "2026-08-10"
},
"evidence": {
"leadId": "LEAD-1RKXEQE",
"vin": "1GNSKHKC0JR397822",
"score": 95,
"band": "hot",
"factors": [
{
"name": "engagement",
"weight": 18
},
{
"name": "recency",
"weight": 1
},
{
"name": "intent",
"weight": 22
}
],
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "market-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}showroomLog
lead.showroomLog · POST /leads/showroom-log · gate key · sandbox · answers LeadShowroomLog@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 — Lead.showroomLogged@1.
import { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.showroomLog()curl -X POST https://apis.vin/leads/showroom-log \
-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": "LeadShowroomLog@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "lead",
"asOf": "2026-08-10",
"log": {
"visits": []
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "lead",
"asOf": "2026-08-10",
"log": {
"visits": []
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}source
lead.source · GET /leads/source · gate key · sandbox · answers LeadSource@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — dealers.vin serves this noun on its two routes: / (the landing) · /1GNSKHKC0JR397822 (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 { lead } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.source({"vin":"1GNSKHKC0JR397822"})curl 'https://apis.vin/leads/source?vin=1GNSKHKC0JR397822'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": "LeadSource@1",
"value": {
"leadId": "LEAD-1LARD0P",
"channel": "paid-search",
"cost": {
"amount": "36.00",
"currency": "USD"
},
"firstTouch": "2026-08-10",
"asOf": "2026-08-10"
},
"evidence": {
"leadId": "LEAD-1LARD0P",
"channel": "paid-search",
"cost": {
"amount": "36.00",
"currency": "USD"
},
"firstTouch": "2026-08-10",
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "market-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.
Lead
Schema
| Property | Type | Notes |
|---|---|---|
id | id | lead_ |
customerId | ref→Customer | — |
vin | string | — |
source | string | — |
dealerId | ref→Dealer | — |
status | LeadFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
lead | consumer | *:1 | from |
lead | dealer | *:1 | routed-to |
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.
Lead · Class model
Lead · State machine
Lead · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.