protectionProduct
The protectionProduct noun — identity, lifecycle, events, and every capability as an anchored section: 15 capabilities, 0 live, 15 sandbox, 0 declared.
protectionProduct is one of the estate's 317 automotive nouns — a job a car needs done. It carries 15 capabilities: 0 live, 15 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | protectionProduct |
| Pillar | Data (facets: 5 data · 5 services · 5 commerce) |
| Capabilities | 15 — 0 live · 15 sandbox · 0 declared |
| Entities | ProtectionProduct |
| Doors | aggregator.vin |
| SDK | Vin.protectionProduct.* from apis.vin |
| Address | /catalog/protectionProduct#{action} — the anchor IS the wire name minus protectionProduct. |
Events
The vocabulary this noun can append to the record — 11 past-tense, versioned event types, each linked to the capability that emits it:
ProtectionProduct.canceled@1— emitted bycancelProtectionProduct.claimFiled@1— emitted byclaimProtectionProduct.claimPaid@1— emitted byclaimPayProtectionProduct.contracted@1— emitted bycontractProtectionProduct.failed@1— emitted bycancel·claimPay·pay·quote·refundProtectionProduct.paid@1— emitted bypayProtectionProduct.quoted@1— emitted byquoteProtectionProduct.redeemed@1— emitted byredeemProtectionProduct.refunded@1— emitted bycancel·refundProtectionProduct.registered@1— emitted byregisterProtectionProduct.transferred@1— emitted bytransfer
Discover & read
eligibility
protectionProduct.eligibility · GET /protection-products/eligibility · gate key · sandbox · answers ProtectionProductEligibility@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /W1W4EBVY8NP490574 (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 { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.eligibility({"vin":"W1W4EBVY8NP490574"})curl 'https://apis.vin/protection-products/eligibility?vin=W1W4EBVY8NP490574'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": "ProtectionProductEligibility@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"eligibility": {
"eligible": true,
"products": [
"VSC",
"GAP",
"PPM",
"EWT",
"TIRE",
"KEY"
]
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"eligibility": {
"eligible": true,
"products": [
"VSC",
"GAP",
"PPM",
"EWT",
"TIRE",
"KEY"
]
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}coverage
protectionProduct.coverage · GET /protection-products/coverage · gate key · sandbox · answers ProtectionProductCoverage@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /W1W4EBVY8NP490574 (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 { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.coverage({"vin":"W1W4EBVY8NP490574"})curl 'https://apis.vin/protection-products/coverage?vin=W1W4EBVY8NP490574'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": "ProtectionProductCoverage@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"coverage": {
"id": "PP-e25632b3",
"productType": "GAP",
"covered": true,
"termMonths": 36
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"coverage": {
"id": "PP-e25632b3",
"productType": "GAP",
"covered": true,
"termMonths": 36
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}claimStatus
protectionProduct.claimStatus · GET /protection-products/claim-status · gate none · sandbox · answers ProtectionProductClaimStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /W1W4EBVY8NP490574 (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 { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.claimStatus({"vin":"W1W4EBVY8NP490574"})curl 'https://apis.vin/protection-products/claim-status?vin=W1W4EBVY8NP490574'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": "ProtectionProductClaimStatus@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"claim": {
"id": "PP-e25632b3",
"status": "no-claim-on-file"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"claim": {
"id": "PP-e25632b3",
"status": "no-claim-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
quote
protectionProduct.quote · POST /protection-products/quote · gate offer · sandbox · answers ProtectionProductQuote@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.failed@1 · ProtectionProduct.quoted@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.quote({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/quote \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductQuote@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"quote": {
"id": "PP-e25632b3",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 90400
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 100500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"quote": {
"id": "PP-e25632b3",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 90400
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 100500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rate
protectionProduct.rate · GET /protection-products/rate · gate key · sandbox · answers ProtectionProductRate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /W1W4EBVY8NP490574 (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 { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.rate({"vin":"W1W4EBVY8NP490574"})curl 'https://apis.vin/protection-products/rate?vin=W1W4EBVY8NP490574'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": "ProtectionProductRate@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"quote": {
"id": "PP-e25632b3",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 90400
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 100500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"quote": {
"id": "PP-e25632b3",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 90400
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 100500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
register
protectionProduct.register · POST /protection-products/register · gate offer · sandbox · answers ProtectionProductRegister@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.registered@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.register({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/register \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductRegister@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"contract": {
"id": "PP-e25632b3",
"productType": "GAP",
"status": "registered"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"contract": {
"id": "PP-e25632b3",
"productType": "GAP",
"status": "registered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
protectionProduct.pay · POST /protection-products/pay · gate offer · sandbox · answers ProtectionProductPay@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.failed@1 · ProtectionProduct.paid@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.pay({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/pay \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductPay@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-d99f45dd",
"amountCents": 53655,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-d99f45dd",
"amountCents": 53655,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
protectionProduct.refund · POST /protection-products/refund · gate offer · sandbox · answers ProtectionProductRefund@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.failed@1 · ProtectionProduct.refunded@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.refund({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/refund \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductRefund@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"refund": {
"id": "PP-e25632b3",
"amountCents": 56447,
"currency": "USD",
"basis": "pro-rata",
"status": "refunded"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"refund": {
"id": "PP-e25632b3",
"amountCents": 56447,
"currency": "USD",
"basis": "pro-rata",
"status": "refunded"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}claimPay
protectionProduct.claimPay · POST /protection-products/claim-pay · gate offer · sandbox · answers ProtectionProductClaimPay@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.claimPaid@1 · ProtectionProduct.failed@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.claimPay({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/claim-pay \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductClaimPay@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"payment": {
"status": "no-covered-loss",
"id": "PP-e25632b3"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"payment": {
"status": "no-covered-loss",
"id": "PP-e25632b3"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
claim
protectionProduct.claim · POST /protection-products/claim · gate offer · sandbox · answers ProtectionProductClaim@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.claimFiled@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.claim({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/claim \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductClaim@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"claim": {
"status": "no-covered-loss",
"id": "PP-e25632b3"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"claim": {
"status": "no-covered-loss",
"id": "PP-e25632b3"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
transfer
protectionProduct.transfer · POST /protection-products/transfer · gate offer · sandbox · answers ProtectionProductTransfer@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.transferred@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.transfer({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/transfer \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductTransfer@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"transfer": {
"id": "PP-e25632b3",
"status": "transferred",
"to": "Ava Good"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"transfer": {
"id": "PP-e25632b3",
"status": "transferred",
"to": "Ava Good"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}cancel
protectionProduct.cancel · POST /protection-products/cancel · gate offer · sandbox · answers ProtectionProductCancel@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.canceled@1 · ProtectionProduct.failed@1 · ProtectionProduct.refunded@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.cancel({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/cancel \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductCancel@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"cancellation": {
"id": "PP-e25632b3",
"status": "cancelled",
"basis": "pro-rata",
"refundCents": 56447,
"currency": "USD"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"cancellation": {
"id": "PP-e25632b3",
"status": "cancelled",
"basis": "pro-rata",
"refundCents": 56447,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
catalog
protectionProduct.catalog · GET /protection-products/catalog · gate none · sandbox · answers ProtectionProductCatalog@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /W1W4EBVY8NP490574 (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 { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.catalog({"vin":"W1W4EBVY8NP490574"})curl 'https://apis.vin/protection-products/catalog?vin=W1W4EBVY8NP490574'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": "ProtectionProductCatalog@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"catalog": {
"products": [
{
"productType": "VSC",
"planCode": "VSC-PLAT",
"termOptions": 3
},
{
"productType": "GAP",
"planCode": "GAP-STD",
"termOptions": 2
},
{
"productType": "PPM",
"planCode": "PPM-36",
"termOptions": 1
},
{
"productType": "EWT",
"planCode": "EWT-STD",
"termOptions": 1
},
{
"productType": "TIRE",
"planCode": "TIRE-STD",
"termOptions": 1
},
{
"productType": "KEY",
"planCode": "KEY-STD",
"termOptions": 1
}
],
"count": 6,
"tier": "super-prime"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"catalog": {
"products": [
{
"productType": "VSC",
"planCode": "VSC-PLAT",
"termOptions": 3
},
{
"productType": "GAP",
"planCode": "GAP-STD",
"termOptions": 2
},
{
"productType": "PPM",
"planCode": "PPM-36",
"termOptions": 1
},
{
"productType": "EWT",
"planCode": "EWT-STD",
"termOptions": 1
},
{
"productType": "TIRE",
"planCode": "TIRE-STD",
"termOptions": 1
},
{
"productType": "KEY",
"planCode": "KEY-STD",
"termOptions": 1
}
],
"count": 6,
"tier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}contract
protectionProduct.contract · POST /protection-products/contract · gate offer · sandbox · answers ProtectionProductContract@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.contracted@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.contract({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/contract \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductContract@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"contract": {
"id": "PP-e25632b3",
"productType": "GAP",
"status": "active"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"contract": {
"id": "PP-e25632b3",
"productType": "GAP",
"status": "active"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}redeem
protectionProduct.redeem · POST /protection-products/redeem · gate offer · sandbox · answers ProtectionProductRedeem@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) · /W1W4EBVY8NP490574 (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 — ProtectionProduct.redeemed@1.
import { protectionProduct } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await protectionProduct.redeem({"vin":"W1W4EBVY8NP490574"})curl -X POST https://apis.vin/protection-products/redeem \
-H 'content-type: application/json' \
-d '{"vin":"W1W4EBVY8NP490574"}'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": "ProtectionProductRedeem@1",
"value": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"redemption": {
"status": "no-service-due",
"id": "PP-e25632b3"
}
},
"evidence": {
"vin": "W1W4EBVY8NP490574",
"noun": "protectionProduct",
"asOf": "2026-08-10",
"redemption": {
"status": "no-service-due",
"id": "PP-e25632b3"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-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.
ProtectionProduct
Schema
| Property | Type | Notes |
|---|---|---|
id | id | pp_ |
dealId | ref→Deal | — |
holderId | ref→Party | — |
product | string | — |
term | string | — |
premium | money | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
protectionProduct | deal | *:0..1 | sold-on |
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.
ProtectionProduct · Class model
ProtectionProduct · State machine
ProtectionProduct · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
pricing
The pricing noun — identity, lifecycle, events, and every capability as an anchored section: 15 capabilities, 1 live, 14 sandbox, 0 declared.
provenance
The provenance noun — identity, lifecycle, events, and every capability as an anchored section: 7 capabilities, 1 live, 6 sandbox, 0 declared.