docs.vin

crmEvent

The crmEvent noun — identity, lifecycle, events, and every capability as an anchored section: 9 capabilities, 0 live, 9 sandbox, 0 declared.

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

Identity

NouncrmEvent
PillarServices (facets: 3 data · 6 services)
Capabilities9 — 0 live · 9 sandbox · 0 declared
EntitiesLead
Doorsaggregator.vin
SDKVin.crmEvent.* from apis.vin
Address/catalog/crmEvent#{action} — the anchor IS the wire name minus crmEvent.

Events

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

Discover & read

read

crmEvent.read · GET /crm-events/read · gate none · sandbox · answers CrmEventRead@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1FT7W2BT3NEC05046 (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 — crmEvent.read
import { crmEvent } from 'apis.vin'

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

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.960Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventRead@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured"
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Apply & book

reassign

crmEvent.reassign · POST /crm-events/reassign · gate offer · sandbox · answers CrmEventReassign@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) · /1FT7W2BT3NEC05046 (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.

EmitsCrmEvent.reassigned@1.

the SDK — crmEvent.reassign
import { crmEvent } from 'apis.vin'

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

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.962Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventReassign@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "reassignment": {
      "status": "not-yet-assigned",
      "leadId": "LD-db56e074",
      "position": "Captured"
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "reassignment": {
      "status": "not-yet-assigned",
      "leadId": "LD-db56e074",
      "position": "Captured"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Authorize & resolve

escalate

crmEvent.escalate · POST /crm-events/escalate · gate offer · sandbox · answers CrmEventEscalate@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) · /1FT7W2BT3NEC05046 (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.

EmitsCrmEvent.escalated@1.

the SDK — crmEvent.escalate
import { crmEvent } from 'apis.vin'

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

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.957Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventEscalate@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "escalation": {
      "status": "not-yet-assigned",
      "leadId": "LD-db56e074",
      "position": "Captured"
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "escalation": {
      "status": "not-yet-assigned",
      "leadId": "LD-db56e074",
      "position": "Captured"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

attribution

crmEvent.attribution · GET /crm-events/attribution · gate key · sandbox · answers CrmEventAttribution@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1FT7W2BT3NEC05046 (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 — crmEvent.attribution
import { crmEvent } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await crmEvent.attribution({"vin":"1FT7W2BT3NEC05046"})
GET /crm-events/attribution
curl 'https://apis.vin/crm-events/attribution?vin=1FT7W2BT3NEC05046'

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.948Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventAttribution@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "attribution": {
      "leadId": "LD-db56e074",
      "source": "estate-site",
      "dealerId": "DLR-b9066ade"
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "attribution": {
      "leadId": "LD-db56e074",
      "source": "estate-site",
      "dealerId": "DLR-b9066ade"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

emit

crmEvent.emit · POST /crm-events/emit · gate offer · sandbox · answers CrmEventEmit@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) · /1FT7W2BT3NEC05046 (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.

EmitsCrmEvent.emitted@1.

the SDK — crmEvent.emit
import { crmEvent } from 'apis.vin'

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

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.949Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventEmit@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "emission": {
      "id": "CE-5e7a91c3",
      "leadId": "LD-db56e074",
      "position": "Captured",
      "status": "emitted"
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "emission": {
      "id": "CE-5e7a91c3",
      "leadId": "LD-db56e074",
      "position": "Captured",
      "status": "emitted"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

log

crmEvent.log · POST /crm-events/log · gate offer · sandbox · answers CrmEventLog@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) · /1FT7W2BT3NEC05046 (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.

EmitsCrmEvent.logged@1.

the SDK — crmEvent.log
import { crmEvent } from 'apis.vin'

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

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.957Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventLog@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "log": {
      "id": "CE-43264b3a",
      "leadId": "LD-db56e074",
      "position": "Captured",
      "status": "logged"
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "log": {
      "id": "CE-43264b3a",
      "leadId": "LD-db56e074",
      "position": "Captured",
      "status": "logged"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

nextBestAction

crmEvent.nextBestAction · POST /crm-events/next-best-action · gate key · sandbox · answers CrmEventNextBestAction@1

No input — this capability takes no request body.

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

EmitsCrmEvent.nextBestActioned@1.

the SDK — crmEvent.nextBestAction
import { crmEvent } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await crmEvent.nextBestAction()
POST /crm-events/next-best-action
curl -X POST https://apis.vin/crm-events/next-best-action \
  -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.737Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventNextBestAction@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "event": {
      "status": "no-lead-on-file"
    },
    "nextBestAction": {
      "action": "capture-lead"
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "event": {
      "status": "no-lead-on-file"
    },
    "nextBestAction": {
      "action": "capture-lead"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

timeline

crmEvent.timeline · GET /crm-events/timeline · gate key · sandbox · answers CrmEventTimeline@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1FT7W2BT3NEC05046 (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 — crmEvent.timeline
import { crmEvent } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await crmEvent.timeline({"vin":"1FT7W2BT3NEC05046"})
GET /crm-events/timeline
curl 'https://apis.vin/crm-events/timeline?vin=1FT7W2BT3NEC05046'

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.969Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventTimeline@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "timeline": {
      "leadId": "LD-db56e074",
      "events": [
        {
          "date": "2026-06-26",
          "kind": "lead-captured"
        }
      ]
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "timeline": {
      "leadId": "LD-db56e074",
      "events": [
        {
          "date": "2026-06-26",
          "kind": "lead-captured"
        }
      ]
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

trigger

crmEvent.trigger · POST /crm-events/trigger · gate offer · sandbox · answers CrmEventTrigger@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) · /1FT7W2BT3NEC05046 (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.

EmitsCrmEvent.requested@1 · CrmEvent.triggered@1.

the SDK — crmEvent.trigger
import { crmEvent } from 'apis.vin'

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

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.974Z · HTTP 200
{
  "type": "OK",
  "answers": "CrmEventTrigger@1",
  "value": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "trigger": {
      "id": "CE-5ee8b464",
      "leadId": "LD-db56e074",
      "position": "Captured",
      "status": "triggered"
    }
  },
  "evidence": {
    "vin": "1FT7W2BT3NEC05046",
    "noun": "crmEvent",
    "asOf": "2026-08-10",
    "id": "LD-db56e074",
    "customerId": "ID-11f17424",
    "source": "estate-site",
    "dealerId": "DLR-b9066ade",
    "status": "Captured",
    "trigger": {
      "id": "CE-5ee8b464",
      "leadId": "LD-db56e074",
      "position": "Captured",
      "status": "triggered"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "contact-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Data model

The record shape behind this noun — one entity, each property an evidence field. See the whole estate model on the data model page.

Lead

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.

CrmEvent · 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.