gap
The gap noun — identity, lifecycle, events, and every capability as an anchored section: 11 capabilities, 0 live, 11 sandbox, 0 declared.
gap is one of the estate's 317 automotive nouns — a job a car needs done. It carries 11 capabilities: 0 live, 11 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | gap |
| Pillar | Commerce (facets: 3 data · 3 services · 5 commerce) |
| Capabilities | 11 — 0 live · 11 sandbox · 0 declared |
| Entities | ProtectionProduct |
| Doors | aggregator.vin |
| SDK | Vin.gap.* from apis.vin |
| Address | /catalog/gap#{action} — the anchor IS the wire name minus gap. |
Events
The vocabulary this noun can append to the record — 9 past-tense, versioned event types, each linked to the capability that emits it:
Gap.canceled@1— emitted bycancelGap.claimFiled@1— emitted byclaimGap.claimPaid@1— emitted byclaimPayGap.contracted@1— emitted bycontractGap.failed@1— emitted bycancel·claimPay·pay·quote·refundGap.paid@1— emitted bypayGap.quoted@1— emitted byquoteGap.refunded@1— emitted bycancel·refundGap.registered@1— emitted byregister
Discover & read
eligibility
gap.eligibility · GET /gaps/eligibility · gate key · sandbox · answers GapEligibility@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNYF6H73NB002534 (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 { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.eligibility({"vin":"5FNYF6H73NB002534"})curl 'https://apis.vin/gaps/eligibility?vin=5FNYF6H73NB002534'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": "GapEligibility@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"eligibility": {
"eligible": true,
"product": "GAP"
},
"note": {
"standing": "eligible",
"loanStatus": "Current"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"eligibility": {
"eligible": true,
"product": "GAP"
},
"note": {
"standing": "eligible",
"loanStatus": "Current"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
quote
gap.quote · POST /gaps/quote · gate offer · sandbox · answers GapQuote@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) · /5FNYF6H73NB002534 (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 — Gap.failed@1 · Gap.quoted@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.quote({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/quote \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapQuote@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"quote": {
"id": "PP-86ef1257",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 91300
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 101500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"quote": {
"id": "PP-86ef1257",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 91300
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 101500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rate
gap.rate · GET /gaps/rate · gate key · sandbox · answers GapRate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNYF6H73NB002534 (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 { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.rate({"vin":"5FNYF6H73NB002534"})curl 'https://apis.vin/gaps/rate?vin=5FNYF6H73NB002534'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": "GapRate@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"quote": {
"id": "PP-86ef1257",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 91300
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 101500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"quote": {
"id": "PP-86ef1257",
"productType": "GAP",
"planCode": "GAP-STD",
"terms": [
{
"termMonths": 60,
"termMiles": 0,
"retailCents": 91300
},
{
"termMonths": 72,
"termMiles": 0,
"retailCents": 101500
}
],
"tier": "super-prime"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}claimCompute
gap.claimCompute · GET /gaps/claim-compute · gate key · sandbox · answers GapClaimCompute@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNYF6H73NB002534 (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 { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.claimCompute({"vin":"5FNYF6H73NB002534"})curl 'https://apis.vin/gaps/claim-compute?vin=5FNYF6H73NB002534'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": "GapClaimCompute@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"computation": {
"payoffCents": 2240317,
"settlementCents": 2300000,
"deficiencyCents": 0,
"currency": "USD",
"lienholder": "Huntington National Bank",
"coveredLoss": "none",
"noteStanding": "eligible",
"basis": "net-payoff-minus-settlement-value"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"computation": {
"payoffCents": 2240317,
"settlementCents": 2300000,
"deficiencyCents": 0,
"currency": "USD",
"lienholder": "Huntington National Bank",
"coveredLoss": "none",
"noteStanding": "eligible",
"basis": "net-payoff-minus-settlement-value"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
register
gap.register · POST /gaps/register · gate offer · sandbox · answers GapRegister@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) · /5FNYF6H73NB002534 (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 — Gap.registered@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.register({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/register \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapRegister@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"contract": {
"id": "PP-86ef1257",
"productType": "GAP",
"status": "registered"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"contract": {
"id": "PP-86ef1257",
"productType": "GAP",
"status": "registered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
gap.pay · POST /gaps/pay · gate offer · sandbox · answers GapPay@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) · /5FNYF6H73NB002534 (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 — Gap.failed@1 · Gap.paid@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.pay({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/pay \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapPay@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"payment": {
"id": "PAY-f6edb6f7",
"contractId": "PP-86ef1257",
"amountCents": 91300,
"currency": "USD",
"status": "settled",
"basis": "rated-retail-premium"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"payment": {
"id": "PAY-f6edb6f7",
"contractId": "PP-86ef1257",
"amountCents": 91300,
"currency": "USD",
"status": "settled",
"basis": "rated-retail-premium"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
gap.refund · POST /gaps/refund · gate offer · sandbox · answers GapRefund@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) · /5FNYF6H73NB002534 (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 — Gap.failed@1 · Gap.refunded@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.refund({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/refund \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapRefund@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"refund": {
"id": "PP-86ef1257",
"amountCents": 67344,
"currency": "USD",
"basis": "pro-rata",
"status": "refunded"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"refund": {
"id": "PP-86ef1257",
"amountCents": 67344,
"currency": "USD",
"basis": "pro-rata",
"status": "refunded"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}claimPay
gap.claimPay · POST /gaps/claim-pay · gate offer · sandbox · answers GapClaimPay@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) · /5FNYF6H73NB002534 (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 — Gap.claimPaid@1 · Gap.failed@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.claimPay({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/claim-pay \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapClaimPay@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"payment": {
"status": "no-covered-loss",
"id": "PP-86ef1257"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"payment": {
"status": "no-covered-loss",
"id": "PP-86ef1257"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
claim
gap.claim · POST /gaps/claim · gate offer · sandbox · answers GapClaim@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) · /5FNYF6H73NB002534 (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 — Gap.claimFiled@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.claim({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/claim \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapClaim@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"claim": {
"status": "no-covered-loss",
"id": "PP-86ef1257"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"claim": {
"status": "no-covered-loss",
"id": "PP-86ef1257"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
cancel
gap.cancel · POST /gaps/cancel · gate offer · sandbox · answers GapCancel@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) · /5FNYF6H73NB002534 (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 — Gap.canceled@1 · Gap.failed@1 · Gap.refunded@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.cancel({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/cancel \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapCancel@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"cancellation": {
"id": "PP-86ef1257",
"status": "cancelled",
"basis": "pro-rata",
"refundCents": 67344,
"currency": "USD"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"cancellation": {
"id": "PP-86ef1257",
"status": "cancelled",
"basis": "pro-rata",
"refundCents": 67344,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
contract
gap.contract · POST /gaps/contract · gate offer · sandbox · answers GapContract@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) · /5FNYF6H73NB002534 (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 — Gap.contracted@1.
import { gap } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await gap.contract({"vin":"5FNYF6H73NB002534"})curl -X POST https://apis.vin/gaps/contract \
-H 'content-type: application/json' \
-d '{"vin":"5FNYF6H73NB002534"}'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": "GapContract@1",
"value": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"contract": {
"id": "PP-86ef1257",
"productType": "GAP",
"status": "active"
}
},
"evidence": {
"vin": "5FNYF6H73NB002534",
"noun": "gap",
"asOf": "2026-08-10",
"id": "PP-86ef1257",
"dealId": "DL-b58e1191",
"holderId": "ID-11f17424",
"product": "GAP",
"term": 60,
"premium": 91300,
"contract": {
"id": "PP-86ef1257",
"productType": "GAP",
"status": "active"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "fi-back-end-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
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 2 diagrams, rendered from the estate model.
Gap · Class model
Gap · State machine
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.