docs.vin

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

Nouncontact
PillarData (facets: 10 data · 9 services)
Capabilities19 — 0 live · 19 sandbox · 0 declared
EntitiesCustomer
Doorsaggregator.vin
SDKVin.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:

Discover & read

lookup

contact.lookup · GET /contacts/lookup · gate none · sandbox · answers ContactLookup@1

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.consentStatus
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"})
GET /contacts/consent-status
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.

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

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.

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

EmitsContact.created@1.

the SDK — contact.create
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"})
POST /contacts/create
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.

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

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.

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

EmitsContact.subscribed@1.

the SDK — contact.subscribe
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"})
POST /contacts/subscribe
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.

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

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.

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

EmitsContact.unsubscribed@1.

the SDK — contact.unsubscribe
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"})
POST /contacts/unsubscribe
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.lifecycleStage
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"})
GET /contacts/lifecycle-stage
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.

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

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.

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

EmitsContact.updated@1.

the SDK — contact.update
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"})
POST /contacts/update
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.

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

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

the SDK — contact.dataAppend
import { contact } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.dataAppend()
GET /contacts/data-append
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.equityPosition
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"})
GET /contacts/equity-position
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.garage
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"})
GET /contacts/garage
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.ltv
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"})
GET /contacts/ltv
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.

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

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.

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

EmitsContact.merged@1.

the SDK — contact.merge
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"})
POST /contacts/merge
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.profile360
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"})
GET /contacts/profile360
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.

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

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

EmitsContact.reactivated@1.

the SDK — contact.reactivation
import { contact } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.reactivation()
POST /contacts/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.

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

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.

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

EmitsContact.segmented@1.

the SDK — contact.segment
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"})
POST /contacts/segment
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — contact.serviceDue
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"})
GET /contacts/service-due
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.

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

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

EmitsContact.serviceToSalesConverted@1.

the SDK — contact.serviceToSales
import { contact } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await contact.serviceToSales()
POST /contacts/service-to-sales
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.

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

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.

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

EmitsContact.suppressed@1.

the SDK — contact.suppress
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"})
POST /contacts/suppress
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.

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