docs.vin

wash

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

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

Identity

Nounwash
PillarServices (facets: 3 data · 6 services · 4 commerce)
Capabilities13 — 0 live · 13 sandbox · 0 declared
EntitiesReconditioning
Doorsaggregator.vin
SDKVin.wash.* from apis.vin
Address/catalog/wash#{action} — the anchor IS the wire name minus wash.

Events

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

Discover & read

history

wash.history · GET /washes/history · gate none · sandbox · answers WashHistory@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await wash.history({"vin":"5XYP6DHC6NG286280"})
GET /washes/history
curl 'https://apis.vin/washes/history?vin=5XYP6DHC6NG286280'

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:18.992Z · HTTP 200
{
  "type": "OK",
  "answers": "WashHistory@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "events": [
      {
        "date": "2026-07-05",
        "type": "express-exterior",
        "event": "washed"
      },
      {
        "date": "2026-08-08",
        "type": "express-exterior",
        "event": "washed"
      }
    ]
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "events": [
      {
        "date": "2026-07-05",
        "type": "express-exterior",
        "event": "washed"
      },
      {
        "date": "2026-08-08",
        "type": "express-exterior",
        "event": "washed"
      }
    ]
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

status

wash.status · GET /washes/status · gate none · sandbox · answers WashStatus@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await wash.status({"vin":"5XYP6DHC6NG286280"})
GET /washes/status
curl 'https://apis.vin/washes/status?vin=5XYP6DHC6NG286280'

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:19.024Z · HTTP 200
{
  "type": "OK",
  "answers": "WashStatus@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "wash": {
      "jobId": "WSH-f9fdefc3",
      "type": "express-exterior",
      "stage": "intake",
      "includedInRecon": true,
      "lastWashDate": "2026-08-08"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "wash": {
      "jobId": "WSH-f9fdefc3",
      "type": "express-exterior",
      "stage": "intake",
      "includedInRecon": true,
      "lastWashDate": "2026-08-08"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

typeLookup

wash.typeLookup · GET /washes/type-lookup · gate none · sandbox · answers WashTypeLookup@1

FieldTypeRequiredNotes
vinstringno

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

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

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:19.024Z · HTTP 200
{
  "type": "OK",
  "answers": "WashTypeLookup@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "menu": [
      {
        "type": "express-exterior",
        "amountCents": 2995,
        "currency": "USD",
        "recommended": true
      },
      {
        "type": "full-service",
        "amountCents": 5995,
        "currency": "USD",
        "recommended": false
      },
      {
        "type": "basic-rinse",
        "amountCents": 1495,
        "currency": "USD",
        "recommended": false
      }
    ]
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "menu": [
      {
        "type": "express-exterior",
        "amountCents": 2995,
        "currency": "USD",
        "recommended": true
      },
      {
        "type": "full-service",
        "amountCents": 5995,
        "currency": "USD",
        "recommended": false
      },
      {
        "type": "basic-rinse",
        "amountCents": 1495,
        "currency": "USD",
        "recommended": false
      }
    ]
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Quote & price

quote

wash.quote · POST /washes/quote · gate offer · sandbox · answers WashQuote@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.quoteRequested@1 · Wash.quoted@1.

the SDK — wash.quote
import { wash } from 'apis.vin'

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

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:18.996Z · HTTP 200
{
  "type": "OK",
  "answers": "WashQuote@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "quote": {
      "jobId": "WSH-f9fdefc3",
      "status": "included-in-recon-detail",
      "package": "maintenance-detail",
      "amountCents": 0,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "quote": {
      "jobId": "WSH-f9fdefc3",
      "status": "included-in-recon-detail",
      "package": "maintenance-detail",
      "amountCents": 0,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Apply & book

order

wash.order · POST /washes/order · gate offer · sandbox · answers WashOrder@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) · /5XYP6DHC6NG286280 (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.

EmitsServiceOrder.settled@1 · Wash.completed@1 · Wash.dispatched@1 · Wash.ordered@1.

the SDK — wash.order
import { wash } from 'apis.vin'

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

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:18.996Z · HTTP 200
{
  "type": "OK",
  "answers": "WashOrder@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "order": {
      "jobId": "WSH-f9fdefc3",
      "status": "included-in-recon-detail",
      "package": "maintenance-detail",
      "amountCents": 0,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "order": {
      "jobId": "WSH-f9fdefc3",
      "status": "included-in-recon-detail",
      "package": "maintenance-detail",
      "amountCents": 0,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

schedule

wash.schedule · POST /washes/schedule · gate offer · sandbox · answers WashSchedule@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.scheduleRequested@1 · Wash.scheduled@1.

the SDK — wash.schedule
import { wash } from 'apis.vin'

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

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:19.024Z · HTTP 200
{
  "type": "OK",
  "answers": "WashSchedule@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "appointment": {
      "id": "WB-9c1e86bd",
      "date": "2026-08-11",
      "status": "scheduled",
      "type": "express-exterior"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "appointment": {
      "id": "WB-9c1e86bd",
      "date": "2026-08-11",
      "status": "scheduled",
      "type": "express-exterior"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

subscribe

wash.subscribe · POST /washes/subscribe · gate offer · sandbox · answers WashSubscribe@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.subscribeRequested@1 · Wash.subscribed@1.

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

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

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:19.024Z · HTTP 200
{
  "type": "OK",
  "answers": "WashSubscribe@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "subscription": {
      "id": "SB-a4b3db58",
      "plan": "unlimited-wash",
      "amountCents": 3995,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "subscription": {
      "id": "SB-a4b3db58",
      "plan": "unlimited-wash",
      "amountCents": 3995,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

pay

wash.pay · POST /washes/pay · gate offer · sandbox · answers WashPay@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.paid@1 · Wash.payFailed@1 · Wash.payRequested@1.

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

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

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:18.996Z · HTTP 200
{
  "type": "OK",
  "answers": "WashPay@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "payment": {
      "id": "PAY-e314f4de",
      "amountCents": 0,
      "currency": "USD",
      "status": "settled"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "payment": {
      "id": "PAY-e314f4de",
      "amountCents": 0,
      "currency": "USD",
      "status": "settled"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Fulfill & operate

perform

wash.perform · POST /washes/perform · gate offer · sandbox · answers WashPerform@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.performFailed@1 · Wash.performRequested@1 · Wash.performed@1.

the SDK — wash.perform
import { wash } from 'apis.vin'

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

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:18.996Z · HTTP 200
{
  "type": "OK",
  "answers": "WashPerform@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "work": {
      "jobId": "WSH-f9fdefc3",
      "type": "express-exterior",
      "status": "performed"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "work": {
      "jobId": "WSH-f9fdefc3",
      "type": "express-exterior",
      "status": "performed"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

complete

wash.complete · POST /washes/complete · gate offer · sandbox · answers WashComplete@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.completeRequested@1 · Wash.completed@1.

the SDK — wash.complete
import { wash } from 'apis.vin'

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

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:18.973Z · HTTP 200
{
  "type": "OK",
  "answers": "WashComplete@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "work": {
      "jobId": "WSH-f9fdefc3",
      "type": "express-exterior",
      "status": "completed"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "work": {
      "jobId": "WSH-f9fdefc3",
      "type": "express-exterior",
      "status": "completed"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

dry

wash.dry · POST /washes/dry · gate offer · sandbox · answers WashDry@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.dried@1 · Wash.dryRequested@1.

the SDK — wash.dry
import { wash } from 'apis.vin'

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

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:18.973Z · HTTP 200
{
  "type": "OK",
  "answers": "WashDry@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "step": {
      "operation": "dry",
      "status": "performed",
      "jobId": "WSH-f9fdefc3"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "step": {
      "operation": "dry",
      "status": "performed",
      "jobId": "WSH-f9fdefc3"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

exterior

wash.exterior · POST /washes/exterior · gate offer · sandbox · answers WashExterior@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.exteriorRequested@1 · Wash.exteriorWashed@1.

the SDK — wash.exterior
import { wash } from 'apis.vin'

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

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:18.979Z · HTTP 200
{
  "type": "OK",
  "answers": "WashExterior@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "step": {
      "operation": "exterior",
      "status": "performed",
      "jobId": "WSH-f9fdefc3"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "step": {
      "operation": "exterior",
      "status": "performed",
      "jobId": "WSH-f9fdefc3"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

rinse

wash.rinse · POST /washes/rinse · gate offer · sandbox · answers WashRinse@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) · /5XYP6DHC6NG286280 (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.

EmitsWash.rinseRequested@1 · Wash.rinsed@1.

the SDK — wash.rinse
import { wash } from 'apis.vin'

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

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:18.999Z · HTTP 200
{
  "type": "OK",
  "answers": "WashRinse@1",
  "value": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "step": {
      "operation": "rinse",
      "status": "performed",
      "jobId": "WSH-f9fdefc3"
    }
  },
  "evidence": {
    "vin": "5XYP6DHC6NG286280",
    "noun": "wash",
    "asOf": "2026-08-10",
    "stage": "intake",
    "type": "express-exterior",
    "step": {
      "operation": "rinse",
      "status": "performed",
      "jobId": "WSH-f9fdefc3"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "lot-services-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.

Reconditioning


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