docs.vin

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

NounprotectionProduct
PillarData (facets: 5 data · 5 services · 5 commerce)
Capabilities15 — 0 live · 15 sandbox · 0 declared
EntitiesProtectionProduct
Doorsaggregator.vin
SDKVin.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:

Discover & read

eligibility

protectionProduct.eligibility · GET /protection-products/eligibility · gate key · sandbox · answers ProtectionProductEligibility@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.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.

the SDK — protectionProduct.eligibility
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"})
GET /protection-products/eligibility
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.

receipt · executed 2026-08-17T12:42:15.819Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Dooraggregator.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.

the SDK — protectionProduct.coverage
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"})
GET /protection-products/coverage
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.

receipt · executed 2026-08-17T12:42:15.818Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Dooraggregator.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.

the SDK — protectionProduct.claimStatus
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"})
GET /protection-products/claim-status
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.

receipt · executed 2026-08-17T12:42:15.817Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.failed@1 · ProtectionProduct.quoted@1.

the SDK — protectionProduct.quote
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"})
POST /protection-products/quote
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.

receipt · executed 2026-08-17T12:42:15.825Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Dooraggregator.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.

the SDK — protectionProduct.rate
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"})
GET /protection-products/rate
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.

receipt · executed 2026-08-17T12:42:15.829Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.registered@1.

the SDK — protectionProduct.register
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"})
POST /protection-products/register
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.

receipt · executed 2026-08-17T12:42:15.841Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.failed@1 · ProtectionProduct.paid@1.

the SDK — protectionProduct.pay
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"})
POST /protection-products/pay
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.

receipt · executed 2026-08-17T12:42:15.825Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.failed@1 · ProtectionProduct.refunded@1.

the SDK — protectionProduct.refund
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"})
POST /protection-products/refund
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.

receipt · executed 2026-08-17T12:42:15.835Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.claimPaid@1 · ProtectionProduct.failed@1.

the SDK — protectionProduct.claimPay
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"})
POST /protection-products/claim-pay
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.

receipt · executed 2026-08-17T12:42:15.817Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.claimFiled@1.

the SDK — protectionProduct.claim
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"})
POST /protection-products/claim
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.

receipt · executed 2026-08-17T12:42:15.816Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.transferred@1.

the SDK — protectionProduct.transfer
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"})
POST /protection-products/transfer
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.

receipt · executed 2026-08-17T12:42:15.848Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.canceled@1 · ProtectionProduct.failed@1 · ProtectionProduct.refunded@1.

the SDK — protectionProduct.cancel
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"})
POST /protection-products/cancel
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.

receipt · executed 2026-08-17T12:42:15.812Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

Dooraggregator.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.

the SDK — protectionProduct.catalog
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"})
GET /protection-products/catalog
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.

receipt · executed 2026-08-17T12:42:15.813Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.contracted@1.

the SDK — protectionProduct.contract
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"})
POST /protection-products/contract
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.

receipt · executed 2026-08-17T12:42:15.817Z · HTTP 200
{
  "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

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) · /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.

EmitsProtectionProduct.redeemed@1.

the SDK — protectionProduct.redeem
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"})
POST /protection-products/redeem
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.

receipt · executed 2026-08-17T12:42:15.832Z · HTTP 200
{
  "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

PropertyTypeNotes
ididpp_
dealIdref→Deal
holderIdref→Party
productstring
termstring
premiummoney

Relationships

FromToCardinalityAs
protectionProductdeal*:0..1sold-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.