contact
The contact noun — identity, lifecycle, events, and every capability as an anchored section: 19 capabilities, 0 live, 19 sandbox, 0 declared.
contact is one of the estate's 317 automotive nouns — a job a car needs done. It carries 19 capabilities: 0 live, 19 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | contact |
| Pillar | Data (facets: 10 data · 9 services) |
| Capabilities | 19 — 0 live · 19 sandbox · 0 declared |
| Entities | Customer |
| Doors | aggregator.vin |
| SDK | Vin.contact.* from apis.vin |
| Address | /catalog/contact#{action} — the anchor IS the wire name minus contact. |
Events
The vocabulary this noun can append to the record — 9 past-tense, versioned event types, each linked to the capability that emits it:
Contact.created@1— emitted bycreateContact.merged@1— emitted bymergeContact.reactivated@1— emitted byreactivationContact.segmented@1— emitted bysegmentContact.serviceToSalesConverted@1— emitted byserviceToSalesContact.subscribed@1— emitted bysubscribeContact.suppressed@1— emitted bysuppressContact.unsubscribed@1— emitted byunsubscribeContact.updated@1— emitted byupdate
Discover & read
lookup
contact.lookup · GET /contacts/lookup · gate none · sandbox · answers ContactLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.lookup({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/lookup?vin=1FBAX2Y8XRKA11471'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": "ContactLookup@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"contact": {
"identityId": "ID-11f17424",
"name": "Ava Good",
"castRow": "super-prime",
"tier": "super-prime",
"score": 843,
"lifecycleStage": "owner",
"garage": [
"1FKEEPREG1STERED0",
"1FKEEPVER1F1ED000"
]
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"contact": {
"identityId": "ID-11f17424",
"name": "Ava Good",
"castRow": "super-prime",
"tier": "super-prime",
"score": 843,
"lifecycleStage": "owner",
"garage": [
"1FKEEPREG1STERED0",
"1FKEEPVER1F1ED000"
]
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}read
contact.read · GET /contacts/read · gate none · sandbox · answers ContactRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.read({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/read?vin=1FBAX2Y8XRKA11471'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": "ContactRead@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"contact": {
"identityId": "ID-11f17424",
"name": "Ava Good",
"castRow": "super-prime",
"tier": "super-prime",
"score": 843,
"lifecycleStage": "owner",
"garage": [
"1FKEEPREG1STERED0",
"1FKEEPVER1F1ED000"
]
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"contact": {
"identityId": "ID-11f17424",
"name": "Ava Good",
"castRow": "super-prime",
"tier": "super-prime",
"score": 843,
"lifecycleStage": "owner",
"garage": [
"1FKEEPREG1STERED0",
"1FKEEPVER1F1ED000"
]
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}consentStatus
contact.consentStatus · GET /contacts/consent-status · gate none · sandbox · answers ContactConsentStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.consentStatus({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/consent-status?vin=1FBAX2Y8XRKA11471'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": "ContactConsentStatus@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"consent": {
"identityId": "ID-11f17424",
"status": "granted",
"channels": [
"email",
"sms",
"phone"
],
"capturedAt": "2026-04-12"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"consent": {
"identityId": "ID-11f17424",
"status": "granted",
"channels": [
"email",
"sms",
"phone"
],
"capturedAt": "2026-04-12"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
create
contact.create · POST /contacts/create · gate offer · sandbox · answers ContactCreate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.created@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.create({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/create \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactCreate@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"result": {
"status": "existing-identity",
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"result": {
"status": "existing-identity",
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}subscribe
contact.subscribe · POST /contacts/subscribe · gate offer · sandbox · answers ContactSubscribe@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.subscribed@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.subscribe({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/subscribe \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactSubscribe@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"subscription": {
"status": "subscribed",
"topics": [
"service-reminders",
"offers"
],
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"subscription": {
"status": "subscribed",
"topics": [
"service-reminders",
"offers"
],
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}unsubscribe
contact.unsubscribe · POST /contacts/unsubscribe · gate offer · sandbox · answers ContactUnsubscribe@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.unsubscribed@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.unsubscribe({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/unsubscribe \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactUnsubscribe@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"subscription": {
"status": "unsubscribed",
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"subscription": {
"status": "unsubscribed",
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}lifecycleStage
contact.lifecycleStage · GET /contacts/lifecycle-stage · gate none · sandbox · answers ContactLifecycleStage@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.lifecycleStage({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/lifecycle-stage?vin=1FBAX2Y8XRKA11471'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": "ContactLifecycleStage@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"stage": {
"name": "owner",
"basis": "cast-financing-anchor"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"stage": {
"name": "owner",
"basis": "cast-financing-anchor"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
update
contact.update · POST /contacts/update · gate offer · sandbox · answers ContactUpdate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.updated@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.update({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/update \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactUpdate@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"result": {
"status": "updated",
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"result": {
"status": "updated",
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
dataAppend
contact.dataAppend · GET /contacts/data-append · gate none · sandbox · answers ContactDataAppend@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.dataAppend()curl 'https://apis.vin/contacts/data-append'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": "ContactDataAppend@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"append": {
"status": "appended",
"fields": [
"phone",
"email"
],
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"append": {
"status": "appended",
"fields": [
"phone",
"email"
],
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}equityPosition
contact.equityPosition · GET /contacts/equity-position · gate key · sandbox · answers ContactEquityPosition@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.equityPosition({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/equity-position?vin=1FBAX2Y8XRKA11471'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": "ContactEquityPosition@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"equity": {
"vin": "1FKEEPREG1STERED0",
"equityCents": 888100,
"currency": "USD",
"basis": "world-mileage"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"equity": {
"vin": "1FKEEPREG1STERED0",
"equityCents": 888100,
"currency": "USD",
"basis": "world-mileage"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}garage
contact.garage · GET /contacts/garage · gate key · sandbox · answers ContactGarage@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.garage({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/garage?vin=1FBAX2Y8XRKA11471'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": "ContactGarage@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"garage": {
"vehicles": [
{
"vin": "1FKEEPREG1STERED0",
"keepPosition": "Registered",
"mileage": 61190
},
{
"vin": "1FKEEPVER1F1ED000",
"keepPosition": "OwnershipVerified",
"mileage": 73109
}
]
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"garage": {
"vehicles": [
{
"vin": "1FKEEPREG1STERED0",
"keepPosition": "Registered",
"mileage": 61190
},
{
"vin": "1FKEEPVER1F1ED000",
"keepPosition": "OwnershipVerified",
"mileage": 73109
}
]
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}ltv
contact.ltv · GET /contacts/ltv · gate key · sandbox · answers ContactLtv@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.ltv({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/ltv?vin=1FBAX2Y8XRKA11471'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": "ContactLtv@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"ltv": {
"ltvCents": 843000,
"currency": "USD",
"basis": "credit-score"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"ltv": {
"ltvCents": 843000,
"currency": "USD",
"basis": "credit-score"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}merge
contact.merge · POST /contacts/merge · gate offer · sandbox · answers ContactMerge@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.merged@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.merge({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/merge \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactMerge@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"merge": {
"survivingId": "ID-11f17424",
"mergedDuplicates": 1,
"status": "merged"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"merge": {
"survivingId": "ID-11f17424",
"mergedDuplicates": 1,
"status": "merged"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}profile360
contact.profile360 · GET /contacts/profile360 · gate key · sandbox · answers ContactProfile360@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.profile360({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/profile360?vin=1FBAX2Y8XRKA11471'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": "ContactProfile360@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"profile": {
"identityId": "ID-11f17424",
"name": "Ava Good",
"castRow": "super-prime",
"tier": "super-prime",
"score": 843,
"lifecycleStage": "owner",
"consent": {
"identityId": "ID-11f17424",
"status": "granted",
"channels": [
"email",
"sms",
"phone"
],
"capturedAt": "2026-04-12"
},
"garage": [
{
"vin": "1FKEEPREG1STERED0",
"keepPosition": "Registered",
"mileage": 61190
},
{
"vin": "1FKEEPVER1F1ED000",
"keepPosition": "OwnershipVerified",
"mileage": 73109
}
],
"ltvCents": 843000,
"currency": "USD"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"profile": {
"identityId": "ID-11f17424",
"name": "Ava Good",
"castRow": "super-prime",
"tier": "super-prime",
"score": 843,
"lifecycleStage": "owner",
"consent": {
"identityId": "ID-11f17424",
"status": "granted",
"channels": [
"email",
"sms",
"phone"
],
"capturedAt": "2026-04-12"
},
"garage": [
{
"vin": "1FKEEPREG1STERED0",
"keepPosition": "Registered",
"mileage": 61190
},
{
"vin": "1FKEEPVER1F1ED000",
"keepPosition": "OwnershipVerified",
"mileage": 73109
}
],
"ltvCents": 843000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}reactivation
contact.reactivation · POST /contacts/reactivation · gate key · sandbox · answers ContactReactivation@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.reactivated@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.reactivation()curl -X POST https://apis.vin/contacts/reactivation \
-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": "ContactReactivation@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"reactivation": {
"eligible": false,
"campaign": "none"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"reactivation": {
"eligible": false,
"campaign": "none"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}segment
contact.segment · POST /contacts/segment · gate offer · sandbox · answers ContactSegment@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.segmented@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.segment({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/segment \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactSegment@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"segment": {
"name": "super-prime",
"basis": "persona-cast-row"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"segment": {
"name": "super-prime",
"basis": "persona-cast-row"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}serviceDue
contact.serviceDue · GET /contacts/service-due · gate key · sandbox · answers ContactServiceDue@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.serviceDue({"vin":"1FBAX2Y8XRKA11471"})curl 'https://apis.vin/contacts/service-due?vin=1FBAX2Y8XRKA11471'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": "ContactServiceDue@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"serviceDue": {
"dueNow": false,
"vehicles": []
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"serviceDue": {
"dueNow": false,
"vehicles": []
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}serviceToSales
contact.serviceToSales · POST /contacts/service-to-sales · gate key · sandbox · answers ContactServiceToSales@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.serviceToSalesConverted@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.serviceToSales()curl -X POST https://apis.vin/contacts/service-to-sales \
-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": "ContactServiceToSales@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"opportunities": []
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"opportunities": []
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}suppress
contact.suppress · POST /contacts/suppress · gate offer · sandbox · answers ContactSuppress@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FBAX2Y8XRKA11471 (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 — Contact.suppressed@1.
import { contact } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.suppress({"vin":"1FBAX2Y8XRKA11471"})curl -X POST https://apis.vin/contacts/suppress \
-H 'content-type: application/json' \
-d '{"vin":"1FBAX2Y8XRKA11471"}'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": "ContactSuppress@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"suppression": {
"status": "suppressed",
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"noun": "contact",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"suppression": {
"status": "suppressed",
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "identity-comms-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.
Customer
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. One diagram, rendered from the estate model.
Contact · Class model
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.