docs.vin

recall

The recall noun — identity, lifecycle, events, and every capability as an anchored section: 31 capabilities, 12 live, 19 sandbox, 0 declared.

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

Identity

Nounrecall
PillarData (facets: 16 data · 10 services · 5 commerce)
Capabilities31 — 12 live · 19 sandbox · 0 declared
EntitiesVehicleRecord
Doorsaggregator.vin
SDKVin.recall.* from apis.vin
Address/catalog/recall#{action} — the anchor IS the wire name minus recall.

Events

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

Discover & read

lookup

recall.lookup · GET /recalls/lookup · gate none · live · answers RecallLookup@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.lookup
import { recall } from 'apis.vin'

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

read

recall.read · GET /recalls/read · gate none · live · answers RecallRead@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.read
import { recall } from 'apis.vin'

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

history

recall.history · GET /recalls/history · gate none · live · answers RecallHistory@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.history
import { recall } from 'apis.vin'

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

status

recall.status · GET /recalls/status · gate none · live · answers RecallStatus@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.status
import { recall } from 'apis.vin'

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

verify

recall.verify · GET /recalls/verify · gate key · live · answers RecallVerify@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.verify
import { recall } from 'apis.vin'

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

remedyLookup

recall.remedyLookup · GET /recalls/remedy-lookup · gate none · live · answers RecallRemedyLookup@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.remedyLookup
import { recall } from 'apis.vin'

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

statusRead

recall.statusRead · GET /recalls/status-read · gate none · live · answers RecallStatusRead@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.statusRead
import { recall } from 'apis.vin'

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

campaignDecode

recall.campaignDecode · GET /recalls/campaign-decode · gate none · live · answers RecallCampaignDecode@1

FieldTypeRequiredNotes
vinstringno

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

EmitsRecall.campaignDecoded@1.

the SDK — recall.campaignDecode
import { recall } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.campaignDecode({"vin":"5XYP5DGC5SG630536"})
GET /recalls/campaign-decode
curl 'https://apis.vin/recalls/campaign-decode?vin=5XYP5DGC5SG630536'

partsAvailability

recall.partsAvailability · GET /recalls/parts-availability · gate none · sandbox · answers RecallPartsAvailability@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.partsAvailability({"vin":"5XYP5DGC5SG630536"})
GET /recalls/parts-availability
curl 'https://apis.vin/recalls/parts-availability?vin=5XYP5DGC5SG630536'

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:16.213Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallPartsAvailability@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "parts": {
      "available": false,
      "reason": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "parts": {
      "available": false,
      "reason": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

batchCheck

recall.batchCheck · GET /recalls/batch-check · gate none · sandbox · answers RecallBatchCheck@1

No input — this capability takes no request body.

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.batchCheck()
GET /recalls/batch-check
curl 'https://apis.vin/recalls/batch-check'

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.994Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallBatchCheck@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "results": [
      {
        "vin": "1HGCM82633A004352",
        "open": false
      }
    ]
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "results": [
      {
        "vin": "1HGCM82633A004352",
        "open": false
      }
    ]
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

openCheck

recall.openCheck · GET /recalls/open-check · gate none · live · answers RecallOpenCheck@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.openCheck
import { recall } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.openCheck({"vin":"5XYP5DGC5SG630536"})
GET /recalls/open-check
curl 'https://apis.vin/recalls/open-check?vin=5XYP5DGC5SG630536'

Apply & book

schedule

recall.schedule · POST /recalls/schedule · gate offer · sandbox · answers RecallSchedule@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.requested@1 · Recall.scheduleRequested@1 · Recall.scheduled@1.

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

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

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:16.241Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallSchedule@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "appointment": {
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "appointment": {
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

subscribe

recall.subscribe · POST /recalls/subscribe · gate key · sandbox · answers RecallSubscribe@1

No input — this capability takes no request body.

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

EmitsRecall.opened@1 · Recall.subscribed@1.

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.subscribe()
POST /recalls/subscribe
curl -X POST https://apis.vin/recalls/subscribe \
  -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.995Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallSubscribe@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "subscription": {
      "id": "SB-24d25adb",
      "topic": "recall-notices",
      "status": "active"
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "subscription": {
      "id": "SB-24d25adb",
      "topic": "recall-notices",
      "status": "active"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

settle

recall.settle · POST /recalls/settle · gate offer · sandbox · answers RecallSettle@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.settleFailed@1 · Recall.settleRequested@1 · Recall.settled@1.

the SDK — recall.settle
import { recall } from 'apis.vin'

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

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:16.246Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallSettle@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "payment": {
      "id": "PAY-f3171dfe",
      "status": "settled",
      "amountCents": 0,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "payment": {
      "id": "PAY-f3171dfe",
      "status": "settled",
      "amountCents": 0,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

reimburse

recall.reimburse · POST /recalls/reimburse · gate offer · sandbox · answers RecallReimburse@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.failed@1 · Recall.reimbursed@1.

the SDK — recall.reimburse
import { recall } from 'apis.vin'

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

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:16.240Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallReimburse@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "reimbursement": {
      "id": "RR-271b239f",
      "kind": "remedy",
      "status": "refused",
      "amountCents": 0,
      "currency": "USD",
      "reason": "no-open-recall"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "reimbursement": {
      "id": "RR-271b239f",
      "kind": "remedy",
      "status": "refused",
      "amountCents": 0,
      "currency": "USD",
      "reason": "no-open-recall"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

warrantyBill

recall.warrantyBill · POST /recalls/warranty-bill · gate offer · sandbox · answers RecallWarrantyBill@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.warrantyBillRequested@1 · Recall.warrantyBilled@1.

the SDK — recall.warrantyBill
import { recall } from 'apis.vin'

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

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:16.246Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallWarrantyBill@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "bill": {
      "id": "CB-f74adc98",
      "billable": false,
      "amountCents": 0,
      "currency": "USD",
      "status": "nothing-to-bill"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "bill": {
      "id": "CB-f74adc98",
      "billable": false,
      "amountCents": 0,
      "currency": "USD",
      "status": "nothing-to-bill"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Fulfill & operate

perform

recall.perform · POST /recalls/perform · gate offer · sandbox · answers RecallPerform@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.performed@1 · Recall.requested@1.

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

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

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:16.217Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallPerform@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "work": {
      "id": "RW-6b8e86f6",
      "operation": "perform",
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "work": {
      "id": "RW-6b8e86f6",
      "operation": "perform",
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

publish

recall.publish · POST /recalls/publish · gate offer · sandbox · answers RecallPublish@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.published@1.

the SDK — recall.publish
import { recall } from 'apis.vin'

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

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:16.223Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallPublish@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaign": {
      "id": "CAMP-1edd83f1",
      "type": "safety-recall",
      "status": "published"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaign": {
      "id": "CAMP-1edd83f1",
      "type": "safety-recall",
      "status": "published"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

complete

recall.complete · POST /recalls/complete · gate offer · sandbox · answers RecallComplete@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.completeRequested@1 · Recall.completed@1.

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

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

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:16.204Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallComplete@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "work": {
      "id": "RW-ac4c3c6e",
      "operation": "complete",
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "work": {
      "id": "RW-ac4c3c6e",
      "operation": "complete",
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

notify

recall.notify · POST /recalls/notify · gate offer · sandbox · answers RecallNotify@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.notified@1.

the SDK — recall.notify
import { recall } from 'apis.vin'

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

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:16.204Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallNotify@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "notice": {
      "id": "RN-4a673438",
      "channel": "mail",
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "notice": {
      "id": "RN-4a673438",
      "channel": "mail",
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

reNotify

recall.reNotify · POST /recalls/re-notify · gate offer · sandbox · answers RecallReNotify@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.reNotified@1 · Recall.reNotifyRequested@1.

the SDK — recall.reNotify
import { recall } from 'apis.vin'

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

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:16.240Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallReNotify@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "notice": {
      "id": "RN-fa017f6d",
      "channel": "mail",
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "notice": {
      "id": "RN-fa017f6d",
      "channel": "mail",
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Authorize & resolve

claim

recall.claim · POST /recalls/claim · gate offer · sandbox · answers RecallClaim@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.claimFailed@1 · Recall.claimRequested@1 · Recall.claimed@1.

the SDK — recall.claim
import { recall } from 'apis.vin'

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

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:16.204Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallClaim@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "claim": {
      "id": "RC-c6d76da3",
      "status": "refused",
      "reason": "no-open-recall"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "claim": {
      "id": "RC-c6d76da3",
      "status": "refused",
      "reason": "no-open-recall"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Lifecycle & state

close

recall.close · POST /recalls/close · gate offer · sandbox · answers RecallClose@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.closeRequested@1 · Recall.closed@1.

the SDK — recall.close
import { recall } from 'apis.vin'

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

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:16.204Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallClose@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "close": {
      "status": "closed"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "close": {
      "status": "closed"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

byVin

recall.byVin · GET /recalls/by-vin · gate none · live · answers RecallByVin@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.byVin
import { recall } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.byVin({"vin":"5XYP5DGC5SG630536"})
GET /recalls/by-vin
curl 'https://apis.vin/recalls/by-vin?vin=5XYP5DGC5SG630536'

dtcCorrelate

recall.dtcCorrelate · GET /recalls/dtc-correlate · gate none · sandbox · answers RecallDtcCorrelate@1

No input — this capability takes no request body.

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.dtcCorrelate()
GET /recalls/dtc-correlate
curl 'https://apis.vin/recalls/dtc-correlate'

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.994Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallDtcCorrelate@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "correlation": {
      "scanVerdict": "pass",
      "correlated": false
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "correlation": {
      "scanVerdict": "pass",
      "correlated": false
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

notifyOwner

recall.notifyOwner · POST /recalls/notify-owner · gate offer · sandbox · answers RecallNotifyOwner@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.notifyOwnerRequested@1 · Recall.notifyOwnered@1 · Recall.ownerNotified@1.

the SDK — recall.notifyOwner
import { recall } from 'apis.vin'

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

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:16.210Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallNotifyOwner@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "notice": {
      "id": "RN-57a63a0f",
      "channel": "mail",
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "notice": {
      "id": "RN-57a63a0f",
      "channel": "mail",
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

openCount

recall.openCount · GET /recalls/open-count · gate key · live · answers RecallOpenCount@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.openCount
import { recall } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.openCount({"vin":"5XYP5DGC5SG630536"})
GET /recalls/open-count
curl 'https://apis.vin/recalls/open-count?vin=5XYP5DGC5SG630536'

performRemedy

recall.performRemedy · POST /recalls/perform-remedy · gate offer · sandbox · answers RecallPerformRemedy@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.performRemedied@1 · Recall.performRemedyRequested@1 · Recall.remedyPerformed@1.

the SDK — recall.performRemedy
import { recall } from 'apis.vin'

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

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:16.222Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallPerformRemedy@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "work": {
      "id": "RW-e8bfd40e",
      "operation": "performRemedy",
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "campaignId": "CAMP-1edd83f1",
    "work": {
      "id": "RW-e8bfd40e",
      "operation": "performRemedy",
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

reimbursePrior

recall.reimbursePrior · POST /recalls/reimburse-prior · gate offer · sandbox · answers RecallReimbursePrior@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.priorReimbursed@1 · Recall.reimbursePriorRequested@1.

the SDK — recall.reimbursePrior
import { recall } from 'apis.vin'

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

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:16.240Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallReimbursePrior@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "reimbursement": {
      "id": "RR-2d0c2101",
      "kind": "prior-out-of-pocket-repair",
      "status": "refused",
      "amountCents": 0,
      "currency": "USD",
      "reason": "no-open-recall"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "reimbursement": {
      "id": "RR-2d0c2101",
      "kind": "prior-out-of-pocket-repair",
      "status": "refused",
      "amountCents": 0,
      "currency": "USD",
      "reason": "no-open-recall"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

remedy

recall.remedy · GET /recalls/remedy · gate key · live · answers RecallRemedy@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — recall.remedy
import { recall } from 'apis.vin'

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

scheduleRemedy

recall.scheduleRemedy · POST /recalls/schedule-remedy · gate offer · sandbox · answers RecallScheduleRemedy@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) · /5XYP5DGC5SG630536 (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.

EmitsRecall.scheduleRemedied@1.

the SDK — recall.scheduleRemedy
import { recall } from 'apis.vin'

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

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:16.241Z · HTTP 200
{
  "type": "OK",
  "answers": "RecallScheduleRemedy@1",
  "value": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "appointment": {
      "status": "no-open-recall"
    }
  },
  "evidence": {
    "vin": "5XYP5DGC5SG630536",
    "noun": "recall",
    "asOf": "2026-08-10",
    "open": false,
    "appointment": {
      "status": "no-open-recall"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-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.

VehicleRecord

Modeled

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

Recall · Class model

Recall · State machine

Recall · Sequence


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