docs.vin

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

Nounlead
PillarServices (facets: 6 data · 11 services · 3 commerce)
Capabilities20 — 0 live · 20 sandbox · 0 declared
EntitiesLead
Doorsaggregator.vin · dealers.vin
SDKVin.lead.* from apis.vin
Address/catalog/lead#{action} — the anchor IS the wire name minus lead.

Lifecycle

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

Discover & read

lookup

lead.lookup · GET /leads/lookup · gate none · sandbox · answers LeadLookup@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — lead.lookup
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"})
GET /leads/lookup
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — lead.read
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"})
GET /leads/read
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — lead.history
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"})
GET /leads/history
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — lead.dncCheck
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"})
GET /leads/dnc-check
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.assigned@1.

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

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.failed@1 · Lead.paid@1.

the SDK — lead.pay
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"})
POST /leads/pay
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.

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

FieldTypeRequiredNotes
vinstringyes
contactobjectno
sourcestringno
intentstringnoone 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.

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

EmitsLead.captured@1 · Lead.dispositioned@1 · Lead.qualified@1.

the SDK — lead.capture
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"})
POST /leads/capture
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.bought@1 · Lead.failed@1.

the SDK — lead.buy
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"})
POST /leads/buy
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.failed@1 · Lead.refunded@1.

the SDK — lead.refund
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"})
POST /leads/refund
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.adfExported@1.

the SDK — lead.adfExport
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"})
POST /leads/adf-export
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.

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

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

EmitsLead.beBackLogged@1.

the SDK — lead.beBack
import { lead } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.beBack()
POST /leads/be-back
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.deduped@1.

the SDK — lead.dedupe
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"})
POST /leads/dedupe
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.dispositioned@1.

the SDK — lead.disposition
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"})
POST /leads/disposition
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.enriched@1.

the SDK — lead.enrich
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"})
POST /leads/enrich
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.nurtured@1.

the SDK — lead.nurture
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"})
POST /leads/nurture
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.qualified@1.

the SDK — lead.qualify
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"})
POST /leads/qualify
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsLead.routed@1.

the SDK — lead.route
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"})
POST /leads/route
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — lead.score
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"})
GET /leads/score
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.

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

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

EmitsLead.showroomLogged@1.

the SDK — lead.showroomLog
import { lead } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await lead.showroomLog()
POST /leads/showroom-log
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — lead.source
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"})
GET /leads/source
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.

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

PropertyTypeNotes
ididlead_
customerIdref→Customer
vinstring
sourcestring
dealerIdref→Dealer
statusLeadFSM

Relationships

FromToCardinalityAs
leadconsumer*:1from
leaddealer*:1routed-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.