docs.vin

offer

The offer noun — identity, lifecycle, events, and every capability as an anchored section: 15 capabilities, 1 live, 14 sandbox, 0 declared.

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

Identity

Nounoffer
PillarServices (facets: 3 data · 6 services · 6 commerce)
Capabilities15 — 1 live · 14 sandbox · 0 declared
EntitiesOffer
Doorsaggregator.vin
SDKVin.offer.* from apis.vin
Address/catalog/offer#{action} — the anchor IS the wire name minus offer.

Lifecycle

OfferOfferFSM: 6 states, 7 transitions — Extended · Countered · Accepted · Declined · Expired · Withdrawn. Each transition is a past-tense event on the record.

Events

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

Discover & read

read

offer.read · GET /offers/read · gate none · sandbox · answers OfferRead@1

FieldTypeRequiredNotes
vinstringno

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

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

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:14.617Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferRead@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "offer": {
      "id": "OFR-75e5c373",
      "position": "Extended",
      "amountCents": 2300000,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "offer": {
      "id": "OFR-75e5c373",
      "position": "Extended",
      "amountCents": 2300000,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

status

offer.status · GET /offers/status · gate none · sandbox · answers OfferStatus@1

FieldTypeRequiredNotes
vinstringno

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

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

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:14.617Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferStatus@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "offer": {
      "id": "OFR-75e5c373",
      "position": "Extended",
      "amountCents": 2300000,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "offer": {
      "id": "OFR-75e5c373",
      "position": "Extended",
      "amountCents": 2300000,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Quote & price

terms

offer.terms · GET /offers/terms · gate none · sandbox · answers OfferTerms@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await offer.terms({"vin":"1GTZ7HFP3P1229718"})
GET /offers/terms
curl 'https://apis.vin/offers/terms?vin=1GTZ7HFP3P1229718'

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:14.617Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferTerms@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "terms": {
      "id": "OFR-75e5c373",
      "decision": "approved",
      "rateBand": "best",
      "termMonths": 60,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "terms": {
      "id": "OFR-75e5c373",
      "decision": "approved",
      "rateBand": "best",
      "termMonths": 60,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

instantCashOffer

offer.instantCashOffer · POST /offers/instant-cash-offer · gate key · live · answers OfferInstantCashOffer@1

Promoted — earned its own page: /catalog/offer.instantCashOffer (computed on every regen: live on the wire + carries its own stateSet).

No input — this capability takes no request body.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1GTZ7HFP3P1229718 (the VIN lens).

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

EmitsOffer.instantCashOffered@1.

the SDK — offer.instantCashOffer
import { offer } from 'apis.vin'

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

Pay & settle

deposit

offer.deposit · POST /offers/deposit · gate offer · sandbox · answers OfferDeposit@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.deposited@1 · Offer.failed@1.

the SDK — offer.deposit
import { offer } from 'apis.vin'

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

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:14.616Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferDeposit@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "deposit": {
      "id": "OFD-dabf935d",
      "amountCents": 50000,
      "currency": "USD",
      "status": "held",
      "refundable": true
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "deposit": {
      "id": "OFD-dabf935d",
      "amountCents": 50000,
      "currency": "USD",
      "status": "held",
      "refundable": true
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

refund

offer.refund · POST /offers/refund · gate offer · sandbox · answers OfferRefund@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.failed@1 · Offer.refunded@1.

the SDK — offer.refund
import { offer } from 'apis.vin'

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

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:14.617Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferRefund@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "refund": {
      "status": "deposit-still-held",
      "id": "OFR-75e5c373",
      "position": "Extended"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "refund": {
      "status": "deposit-still-held",
      "id": "OFR-75e5c373",
      "position": "Extended"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Fulfill & operate

guaranteeIssue

offer.guaranteeIssue · POST /offers/guarantee-issue · gate key · sandbox · answers OfferGuaranteeIssue@1

No input — this capability takes no request body.

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

EmitsOffer.guaranteeIssued@1.

the SDK — offer.guaranteeIssue
import { offer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await offer.guaranteeIssue()
POST /offers/guarantee-issue
curl -X POST https://apis.vin/offers/guarantee-issue \
  -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.945Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferGuaranteeIssue@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "offer",
    "asOf": "2026-08-10",
    "guarantee": {
      "id": "OG-d491a166",
      "offerId": "OFR-056ae566",
      "guaranteedCents": 399600,
      "currency": "USD",
      "expiresOn": "2026-08-17",
      "status": "issued"
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "offer",
    "asOf": "2026-08-10",
    "guarantee": {
      "id": "OG-d491a166",
      "offerId": "OFR-056ae566",
      "guaranteedCents": 399600,
      "currency": "USD",
      "expiresOn": "2026-08-17",
      "status": "issued"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Authorize & resolve

accept

offer.accept · POST /offers/accept · gate offer · sandbox · answers OfferAccept@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.accepted@1.

the SDK — offer.accept
import { offer } from 'apis.vin'

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

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:14.580Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferAccept@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "acceptance": {
      "status": "accepted",
      "id": "OFR-75e5c373",
      "amountCents": 2300000,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "acceptance": {
      "status": "accepted",
      "id": "OFR-75e5c373",
      "amountCents": 2300000,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

decline

offer.decline · POST /offers/decline · gate offer · sandbox · answers OfferDecline@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.declined@1.

the SDK — offer.decline
import { offer } from 'apis.vin'

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

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:14.616Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferDecline@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "decline": {
      "status": "declined",
      "id": "OFR-75e5c373"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "decline": {
      "status": "declined",
      "id": "OFR-75e5c373"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Lifecycle & state

expire

offer.expire · POST /offers/expire · gate offer · sandbox · answers OfferExpire@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.expired@1.

the SDK — offer.expire
import { offer } from 'apis.vin'

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

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:14.616Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferExpire@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "expiry": {
      "id": "OFR-75e5c373",
      "expires": true,
      "expiresOn": "2026-08-17",
      "position": "Extended"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "expiry": {
      "id": "OFR-75e5c373",
      "expires": true,
      "expiresOn": "2026-08-17",
      "position": "Extended"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

bind

offer.bind · POST /offers/bind · gate offer · sandbox · answers OfferBind@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.bound@1 · Offer.failed@1.

the SDK — offer.bind
import { offer } from 'apis.vin'

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

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:14.582Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferBind@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "binding": {
      "status": "not-accepted",
      "id": "OFR-75e5c373",
      "position": "Extended"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "binding": {
      "status": "not-accepted",
      "id": "OFR-75e5c373",
      "position": "Extended"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

counter

offer.counter · POST /offers/counter · gate offer · sandbox · answers OfferCounter@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.countered@1.

the SDK — offer.counter
import { offer } from 'apis.vin'

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

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:14.602Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferCounter@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "counter": {
      "status": "countered",
      "id": "OFR-75e5c373",
      "amountCents": 2185000,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "counter": {
      "status": "countered",
      "id": "OFR-75e5c373",
      "amountCents": 2185000,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

make

offer.make · POST /offers/make · gate offer · sandbox · answers OfferMake@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.made@1.

the SDK — offer.make
import { offer } from 'apis.vin'

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

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:14.617Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferMake@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "offer": {
      "status": "already-extended",
      "id": "OFR-75e5c373",
      "position": "Extended"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "offer": {
      "status": "already-extended",
      "id": "OFR-75e5c373",
      "position": "Extended"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-desk-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

redeem

offer.redeem · POST /offers/redeem · gate key · sandbox · answers OfferRedeem@1

No input — this capability takes no request body.

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

EmitsOffer.redeemed@1.

the SDK — offer.redeem
import { offer } from 'apis.vin'

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

withdraw

offer.withdraw · POST /offers/withdraw · gate offer · sandbox · answers OfferWithdraw@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) · /1GTZ7HFP3P1229718 (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.

EmitsOffer.withdrawn@1.

the SDK — offer.withdraw
import { offer } from 'apis.vin'

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

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:14.617Z · HTTP 200
{
  "type": "OK",
  "answers": "OfferWithdraw@1",
  "value": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "withdrawal": {
      "status": "withdrawn",
      "id": "OFR-75e5c373"
    }
  },
  "evidence": {
    "vin": "1GTZ7HFP3P1229718",
    "noun": "offer",
    "asOf": "2026-08-10",
    "withdrawal": {
      "status": "withdrawn",
      "id": "OFR-75e5c373"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "car-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.

Offer

Schema

PropertyTypeNotes
offerIdidoff_
vinstring
amountmoney
payoffIdref→Payoff
netToSellermoney
providerstringabstract
statusOfferFSM
expiresAtdatetime

Relationships

FromToCardinalityAs
dealoffer1:0..1trade
offerpayoff1:0..1nets against

Modeled

The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 2 diagrams, rendered from the estate model.

Offer · Class model

Offer · State machine


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