docs.vin

dealer

The dealer noun — identity, lifecycle, events, and every capability as an anchored section: 20 capabilities, 4 live, 16 sandbox, 0 declared.

dealer is one of the estate's 317 automotive nouns — a job a car needs done. It carries 20 capabilities: 4 live, 16 sandbox, 0 declared · doors dealers.vin · aggregator.vin.

Identity

Noundealer
PillarData (facets: 9 data · 8 services · 3 commerce)
Capabilities20 — 4 live · 16 sandbox · 0 declared
EntitiesDealer
Doorsaggregator.vin · dealers.vin
SDKVin.dealer.* from apis.vin
Address/catalog/dealer#{action} — the anchor IS the wire name minus dealer.

Events

The vocabulary this noun can append to the record — 12 past-tense, versioned event types, each linked to the capability that emits it:

Discover & read

lookup

dealer.lookup · GET /dealers/lookup · gate none · live · answers DealerLookup@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (the VIN lens).

Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.

the SDK — dealer.lookup
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.lookup({"vin":"KL4CJASB9JB659645"})
GET /dealers/lookup
curl 'https://apis.vin/dealers/lookup?vin=KL4CJASB9JB659645'

read

dealer.read · GET /dealers/read · gate none · live · answers DealerRead@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (the VIN lens).

Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.

the SDK — dealer.read
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.read({"vin":"KL4CJASB9JB659645"})
GET /dealers/read
curl 'https://apis.vin/dealers/read?vin=KL4CJASB9JB659645'

franchiseVerify

dealer.franchiseVerify · GET /dealers/franchise-verify · gate key · sandbox · answers DealerFranchiseVerify@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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 — dealer.franchiseVerify
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.franchiseVerify({"vin":"KL4CJASB9JB659645"})
GET /dealers/franchise-verify
curl 'https://apis.vin/dealers/franchise-verify?vin=KL4CJASB9JB659645'

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:10.091Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerFranchiseVerify@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "franchise": {
      "franchised": false,
      "class": "independent"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "franchise": {
      "franchised": false,
      "class": "independent"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

licenseVerify

dealer.licenseVerify · GET /dealers/license-verify · gate key · sandbox · answers DealerLicenseVerify@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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 — dealer.licenseVerify
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.licenseVerify({"vin":"KL4CJASB9JB659645"})
GET /dealers/license-verify
curl 'https://apis.vin/dealers/license-verify?vin=KL4CJASB9JB659645'

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:10.097Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerLicenseVerify@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "license": {
      "id": "DL-7bcdd2ef",
      "valid": true,
      "expiresAt": "2027-02-26"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "license": {
      "id": "DL-7bcdd2ef",
      "valid": true,
      "expiresAt": "2027-02-26"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Apply & book

register

dealer.register · POST /dealers/register · gate offer · sandbox · answers DealerRegister@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.registered@1.

the SDK — dealer.register
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.register({"vin":"KL4CJASB9JB659645"})
POST /dealers/register
curl -X POST https://apis.vin/dealers/register \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.115Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerRegister@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "registration": {
      "status": "already-registered",
      "dealer": {
        "id": "DLR-b9066ade",
        "name": "The Estate Store",
        "yard": "estate-yard"
      }
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "registration": {
      "status": "already-registered",
      "dealer": {
        "id": "DLR-b9066ade",
        "name": "The Estate Store",
        "yard": "estate-yard"
      }
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

subscribe

dealer.subscribe · POST /dealers/subscribe · gate offer · sandbox · answers DealerSubscribe@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.failed@1 · Dealer.subscribed@1.

the SDK — dealer.subscribe
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.subscribe({"vin":"KL4CJASB9JB659645"})
POST /dealers/subscribe
curl -X POST https://apis.vin/dealers/subscribe \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.121Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerSubscribe@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "subscription": {
      "id": "SB-3e3ab604",
      "plan": "market-data",
      "amountCents": 9900,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "subscription": {
      "id": "SB-3e3ab604",
      "plan": "market-data",
      "amountCents": 9900,
      "currency": "USD",
      "status": "active"
    },
    "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
  }
}

onboard

dealer.onboard · POST /dealers/onboard · gate offer · sandbox · answers DealerOnboard@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.onboarded@1.

the SDK — dealer.onboard
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.onboard({"vin":"KL4CJASB9JB659645"})
POST /dealers/onboard
curl -X POST https://apis.vin/dealers/onboard \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.097Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerOnboard@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "onboarding": {
      "status": "already-onboarded",
      "dealer": {
        "id": "DLR-b9066ade",
        "name": "The Estate Store",
        "yard": "estate-yard"
      }
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "onboarding": {
      "status": "already-onboarded",
      "dealer": {
        "id": "DLR-b9066ade",
        "name": "The Estate Store",
        "yard": "estate-yard"
      }
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

credential

dealer.credential · POST /dealers/credential · gate offer · sandbox · answers DealerCredential@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.credentialed@1.

the SDK — dealer.credential
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.credential({"vin":"KL4CJASB9JB659645"})
POST /dealers/credential
curl -X POST https://apis.vin/dealers/credential \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.084Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerCredential@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "credential": {
      "id": "DC-153f3d35",
      "status": "active",
      "scopes": [
        "list",
        "sell",
        "service"
      ]
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "credential": {
      "id": "DC-153f3d35",
      "status": "active",
      "scopes": [
        "list",
        "sell",
        "service"
      ]
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

regulatorComplaintFile

dealer.regulatorComplaintFile · POST /dealers/regulator-complaint-file · gate key · sandbox · answers DealerRegulatorComplaintFile@1

No input — this capability takes no request body.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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.

EmitsDealer.regulatorComplaintFiled@1.

the SDK — dealer.regulatorComplaintFile
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.regulatorComplaintFile()
POST /dealers/regulator-complaint-file
curl -X POST https://apis.vin/dealers/regulator-complaint-file \
  -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.747Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerRegulatorComplaintFile@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "complaint": {
      "id": "RC-3a449105",
      "status": "filed",
      "respondBy": "2026-08-24"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "complaint": {
      "id": "RC-3a449105",
      "status": "filed",
      "respondBy": "2026-08-24"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

pay

dealer.pay · POST /dealers/pay · gate offer · sandbox · answers DealerPay@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.failed@1 · Dealer.paid@1.

the SDK — dealer.pay
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.pay({"vin":"KL4CJASB9JB659645"})
POST /dealers/pay
curl -X POST https://apis.vin/dealers/pay \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.113Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerPay@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "payment": {
      "id": "PAY-8a2dfaba",
      "amountCents": 62500,
      "currency": "USD",
      "status": "settled"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "payment": {
      "id": "PAY-8a2dfaba",
      "amountCents": 62500,
      "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
  }
}

bill

dealer.bill · POST /dealers/bill · gate offer · sandbox · answers DealerBill@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.billed@1 · Dealer.failed@1.

the SDK — dealer.bill
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.bill({"vin":"KL4CJASB9JB659645"})
POST /dealers/bill
curl -X POST https://apis.vin/dealers/bill \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.084Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerBill@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "bill": {
      "id": "DB-97af05e1",
      "amountCents": 62500,
      "currency": "USD",
      "status": "issued"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "bill": {
      "id": "DB-97af05e1",
      "amountCents": 62500,
      "currency": "USD",
      "status": "issued"
    },
    "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
  }
}

Fulfill & operate

enrollProgram

dealer.enrollProgram · POST /dealers/enroll-program · gate offer · sandbox · answers DealerEnrollProgram@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.programEnrolled@1.

the SDK — dealer.enrollProgram
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.enrollProgram({"vin":"KL4CJASB9JB659645"})
POST /dealers/enroll-program
curl -X POST https://apis.vin/dealers/enroll-program \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.091Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerEnrollProgram@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "enrollment": {
      "id": "EN-2d347bf0",
      "program": "certified-pre-owned",
      "amountCents": 149500,
      "currency": "USD",
      "status": "enrolled"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "enrollment": {
      "id": "EN-2d347bf0",
      "program": "certified-pre-owned",
      "amountCents": 149500,
      "currency": "USD",
      "status": "enrolled"
    },
    "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
  }
}

Lifecycle & state

suspend

dealer.suspend · POST /dealers/suspend · gate offer · sandbox · answers DealerSuspend@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.suspended@1.

the SDK — dealer.suspend
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.suspend({"vin":"KL4CJASB9JB659645"})
POST /dealers/suspend
curl -X POST https://apis.vin/dealers/suspend \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.124Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerSuspend@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "suspension": {
      "status": "suspension-recorded",
      "reinstateBy": "2026-09-09"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "suspension": {
      "status": "suspension-recorded",
      "reinstateBy": "2026-09-09"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

creditLine

dealer.creditLine · GET /dealers/credit-line · gate key · sandbox · answers DealerCreditLine@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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 — dealer.creditLine
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.creditLine({"vin":"KL4CJASB9JB659645"})
GET /dealers/credit-line
curl 'https://apis.vin/dealers/credit-line?vin=KL4CJASB9JB659645'

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:10.085Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerCreditLine@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "creditLine": {
      "kind": "floorplan",
      "limitCents": 10000000,
      "usedCents": 2375000,
      "availableCents": 7625000,
      "currency": "USD"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "creditLine": {
      "kind": "floorplan",
      "limitCents": 10000000,
      "usedCents": 2375000,
      "availableCents": 7625000,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

geo

dealer.geo · GET /dealers/geo · gate none · live · answers DealerGeo@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (the VIN lens).

Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.

the SDK — dealer.geo
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.geo({"vin":"KL4CJASB9JB659645"})
GET /dealers/geo
curl 'https://apis.vin/dealers/geo?vin=KL4CJASB9JB659645'

kyc

dealer.kyc · POST /dealers/kyc · gate offer · sandbox · answers DealerKyc@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) · /KL4CJASB9JB659645 (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.

EmitsDealer.kycRun@1.

the SDK — dealer.kyc
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.kyc({"vin":"KL4CJASB9JB659645"})
POST /dealers/kyc
curl -X POST https://apis.vin/dealers/kyc \
  -H 'content-type: application/json' \
  -d '{"vin":"KL4CJASB9JB659645"}'

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:10.091Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerKyc@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "kyc": {
      "status": "verified",
      "kind": "business",
      "business": {
        "id": "DLR-b9066ade",
        "name": "The Estate Store"
      }
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "kyc": {
      "status": "verified",
      "kind": "business",
      "business": {
        "id": "DLR-b9066ade",
        "name": "The Estate Store"
      }
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

performance

dealer.performance · GET /dealers/performance · gate key · sandbox · answers DealerPerformance@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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 — dealer.performance
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.performance({"vin":"KL4CJASB9JB659645"})
GET /dealers/performance
curl 'https://apis.vin/dealers/performance?vin=KL4CJASB9JB659645'

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:10.114Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerPerformance@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "performance": {
      "unitsInStock": 10,
      "listingsActive": 1,
      "dealsClosed": 1,
      "leadsOnFile": 8
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "performance": {
      "unitsInStock": 10,
      "listingsActive": 1,
      "dealsClosed": 1,
      "leadsOnFile": 8
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

rating

dealer.rating · GET /dealers/rating · gate key · sandbox · answers DealerRating@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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 — dealer.rating
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.rating({"vin":"KL4CJASB9JB659645"})
GET /dealers/rating
curl 'https://apis.vin/dealers/rating?vin=KL4CJASB9JB659645'

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:10.114Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerRating@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "rating": {
      "ratingTenths": 46,
      "outOfTenths": 50,
      "reviews": 100
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "rating": {
      "ratingTenths": 46,
      "outOfTenths": 50,
      "reviews": 100
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

regulatorComplaintRespond

dealer.regulatorComplaintRespond · POST /dealers/regulator-complaint-respond · gate key · sandbox · answers DealerRegulatorComplaintRespond@1

No input — this capability takes no request body.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (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.

EmitsDealer.regulatorComplaintResponded@1.

the SDK — dealer.regulatorComplaintRespond
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.regulatorComplaintRespond()
POST /dealers/regulator-complaint-respond
curl -X POST https://apis.vin/dealers/regulator-complaint-respond \
  -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.747Z · HTTP 200
{
  "type": "OK",
  "answers": "DealerRegulatorComplaintRespond@1",
  "value": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "complaint": {
      "id": "RC-3a449105",
      "status": "responded",
      "respondedOn": "2026-08-10"
    }
  },
  "evidence": {
    "noun": "dealer",
    "asOf": "2026-08-10",
    "dealerId": "DLR-b9066ade",
    "complaint": {
      "id": "RC-3a449105",
      "status": "responded",
      "respondedOn": "2026-08-10"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "identity-comms-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

rooftop

dealer.rooftop · GET /dealers/rooftop · gate key · live · answers DealerRooftop@1

FieldTypeRequiredNotes
vinstringno

Doordealers.vin serves this noun on its two routes: / (the landing) · /KL4CJASB9JB659645 (the VIN lens).

Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.

the SDK — dealer.rooftop
import { dealer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await dealer.rooftop({"vin":"KL4CJASB9JB659645"})
GET /dealers/rooftop
curl 'https://apis.vin/dealers/rooftop?vin=KL4CJASB9JB659645'

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.

Dealer

Schema

PropertyType
rooftopIdsref→Rooftop[]
dealerLicensestring
auctionStandingstring

Relationships

FromToCardinalityAs
allocationdealer*:1to
partydealerISAis-a

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.

Dealer · Class model

Dealer · State machine

Dealer · State machine


Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.