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
| Noun | recall |
| Pillar | Data (facets: 16 data · 10 services · 5 commerce) |
| Capabilities | 31 — 12 live · 19 sandbox · 0 declared |
| Entities | VehicleRecord |
| Doors | aggregator.vin |
| SDK | Vin.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:
Recall.campaignDecoded@1— emitted bycampaignDecodeRecall.claimFailed@1— emitted byclaimRecall.claimRequested@1— emitted byclaimRecall.claimed@1— emitted byclaimRecall.closeRequested@1— emitted bycloseRecall.closed@1— emitted bycloseRecall.completeRequested@1— emitted bycompleteRecall.completed@1— emitted bycompleteRecall.failed@1— emitted byreimburseRecall.notified@1— emitted bynotifyRecall.notifyOwnerRequested@1— emitted bynotifyOwnerRecall.notifyOwnered@1— emitted bynotifyOwnerRecall.opened@1— emitted bysubscribeRecall.ownerNotified@1— emitted bynotifyOwnerRecall.performRemedied@1— emitted byperformRemedyRecall.performRemedyRequested@1— emitted byperformRemedyRecall.performed@1— emitted byperformRecall.priorReimbursed@1— emitted byreimbursePriorRecall.published@1— emitted bypublishRecall.reNotified@1— emitted byreNotifyRecall.reNotifyRequested@1— emitted byreNotifyRecall.reimbursePriorRequested@1— emitted byreimbursePriorRecall.reimbursed@1— emitted byreimburseRecall.remedyPerformed@1— emitted byperformRemedyRecall.requested@1— emitted byperform·scheduleRecall.scheduleRemedied@1— emitted byscheduleRemedyRecall.scheduleRequested@1— emitted byscheduleRecall.scheduled@1— emitted byscheduleRecall.settleFailed@1— emitted bysettleRecall.settleRequested@1— emitted bysettleRecall.settled@1— emitted bysettleRecall.subscribed@1— emitted bysubscribeRecall.warrantyBillRequested@1— emitted bywarrantyBillRecall.warrantyBilled@1— emitted bywarrantyBill
Discover & read
lookup
recall.lookup · GET /recalls/lookup · gate none · live · answers RecallLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/lookup?vin=5XYP5DGC5SG630536'read
recall.read · GET /recalls/read · gate none · live · answers RecallRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/read?vin=5XYP5DGC5SG630536'history
recall.history · GET /recalls/history · gate none · live · answers RecallHistory@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/history?vin=5XYP5DGC5SG630536'status
recall.status · GET /recalls/status · gate none · live · answers RecallStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/status?vin=5XYP5DGC5SG630536'verify
recall.verify · GET /recalls/verify · gate key · live · answers RecallVerify@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/verify?vin=5XYP5DGC5SG630536'remedyLookup
recall.remedyLookup · GET /recalls/remedy-lookup · gate none · live · answers RecallRemedyLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/remedy-lookup?vin=5XYP5DGC5SG630536'statusRead
recall.statusRead · GET /recalls/status-read · gate none · live · answers RecallStatusRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/status-read?vin=5XYP5DGC5SG630536'campaignDecode
recall.campaignDecode · GET /recalls/campaign-decode · gate none · live · answers RecallCampaignDecode@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
Emits — Recall.campaignDecoded@1.
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"})curl 'https://apis.vin/recalls/campaign-decode?vin=5XYP5DGC5SG630536'partsAvailability
recall.partsAvailability · GET /recalls/parts-availability · gate none · sandbox · answers RecallPartsAvailability@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})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.
{
"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.
Door — aggregator.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.
import { recall } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.batchCheck()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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/open-check?vin=5XYP5DGC5SG630536'Apply & book
schedule
recall.schedule · POST /recalls/schedule · gate offer · sandbox · answers RecallSchedule@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.requested@1 · Recall.scheduleRequested@1 · Recall.scheduled@1.
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"})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.
{
"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.
Door — aggregator.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.
Emits — Recall.opened@1 · Recall.subscribed@1.
import { recall } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.settleFailed@1 · Recall.settleRequested@1 · Recall.settled@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.failed@1 · Recall.reimbursed@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.warrantyBillRequested@1 · Recall.warrantyBilled@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.performed@1 · Recall.requested@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.published@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.completeRequested@1 · Recall.completed@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.notified@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.reNotified@1 · Recall.reNotifyRequested@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.claimFailed@1 · Recall.claimRequested@1 · Recall.claimed@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.closeRequested@1 · Recall.closed@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})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.
Door — aggregator.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.
import { recall } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await recall.dtcCorrelate()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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.notifyOwnerRequested@1 · Recall.notifyOwnered@1 · Recall.ownerNotified@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/open-count?vin=5XYP5DGC5SG630536'performRemedy
recall.performRemedy · POST /recalls/perform-remedy · gate offer · sandbox · answers RecallPerformRemedy@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.performRemedied@1 · Recall.performRemedyRequested@1 · Recall.remedyPerformed@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.priorReimbursed@1 · Recall.reimbursePriorRequested@1.
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"})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.
{
"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
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.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.
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"})curl 'https://apis.vin/recalls/remedy?vin=5XYP5DGC5SG630536'scheduleRemedy
recall.scheduleRemedy · POST /recalls/schedule-remedy · gate offer · sandbox · answers RecallScheduleRemedy@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.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.
Emits — Recall.scheduleRemedied@1.
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"})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.
{
"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.