salvage
The salvage noun — identity, lifecycle, events, and every capability as an anchored section: 20 capabilities, 0 live, 20 sandbox, 0 declared.
salvage is one of the estate's 317 automotive nouns — a job a car needs done. It carries 20 capabilities: 0 live, 20 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | salvage |
| Pillar | Data (facets: 7 data · 7 services · 6 commerce) |
| Capabilities | 20 — 0 live · 20 sandbox · 0 declared |
| Entities | Salvage |
| Doors | aggregator.vin |
| SDK | Vin.salvage.* from apis.vin |
| Address | /catalog/salvage#{action} — the anchor IS the wire name minus salvage. |
Lifecycle
Salvage — SalvageFSM: 4 states, 3 transitions — Assigned · Listed · Sold · Disposed. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 20 past-tense, versioned event types, each linked to the capability that emits it:
EndOfLife.accepted@1— emitted bybuyEndOfLife.dismantled@1— emitted bydismantleAuthorizeEndOfLife.pickedUp@1— emitted bypickupSalvage.assigned@1— emitted bychannelSalvage.bidPlaced@1— emitted bybidSalvage.bought@1— emitted bybuySalvage.dismantleAuthorized@1— emitted bydismantleAuthorizeSalvage.failed@1— emitted bybid·buy·pay·settle·storageFeeSalvage.laneRun@1— emitted byrunSalvage.listed@1— emitted bychannel·listSalvage.nonRepairableBranded@1— emitted bynonRepairableBrandSalvage.paid@1— emitted bypaySalvage.pickedUp@1— emitted bypickupSalvage.rebuildInspected@1— emitted byrebuildInspectSalvage.salvageAssigned@1— emitted byassignSalvage.settled@1— emitted bysettleSalvage.sold@1— emitted bychannelSalvage.storageFeeAssessed@1— emitted bystorageFeeSalvage.towed@1— emitted bytowTitleBrand.disclosed@1— emitted bychannel
Discover & read
read
salvage.read · GET /salvages/read · gate none · sandbox · answers SalvageRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.read({"vin":"1GNSKTKL4MR102261"})curl 'https://apis.vin/salvages/read?vin=1GNSKTKL4MR102261'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": "SalvageRead@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"salvage": {
"status": "not-in-salvage-pool",
"donor": "not-a-donor"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"salvage": {
"status": "not-in-salvage-pool",
"donor": "not-a-donor"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}list
salvage.list · POST /salvages/list · gate offer · sandbox · answers SalvageList@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) · /1GNSKTKL4MR102261 (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 — Salvage.listed@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.list({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/list \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageList@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"listing": {
"status": "not-in-salvage-pool"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"listing": {
"status": "not-in-salvage-pool"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}decode
salvage.decode · GET /salvages/decode · gate none · sandbox · answers SalvageDecode@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.decode({"vin":"1GNSKTKL4MR102261"})curl 'https://apis.vin/salvages/decode?vin=1GNSKTKL4MR102261'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": "SalvageDecode@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"decoded": {
"vin": "1GNSKTKL4MR102261",
"valid": true,
"squishVin": "1GNSKTKL4MR"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"decoded": {
"vin": "1GNSKTKL4MR102261",
"valid": true,
"squishVin": "1GNSKTKL4MR"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}location
salvage.location · GET /salvages/location · gate none · sandbox · answers SalvageLocation@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.location({"vin":"1GNSKTKL4MR102261"})curl 'https://apis.vin/salvages/location?vin=1GNSKTKL4MR102261'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": "SalvageLocation@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"location": {
"status": "not-in-salvage-pool"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"location": {
"status": "not-in-salvage-pool"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
value
salvage.value · GET /salvages/value · gate key · sandbox · answers SalvageValue@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.value({"vin":"1GNSKTKL4MR102261"})curl 'https://apis.vin/salvages/value?vin=1GNSKTKL4MR102261'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": "SalvageValue@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"valuationRef": "SLV-0013",
"retailBasis": {
"amount": "18400.00",
"currency": "USD"
},
"salvageValue": {
"amount": "5888.00",
"currency": "USD"
},
"partsValue": {
"amount": "8280.00",
"currency": "USD"
},
"basis": "retail-percentage",
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"valuationRef": "SLV-0013",
"retailBasis": {
"amount": "18400.00",
"currency": "USD"
},
"salvageValue": {
"amount": "5888.00",
"currency": "USD"
},
"partsValue": {
"amount": "8280.00",
"currency": "USD"
},
"basis": "retail-percentage",
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-integrity-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}bid
salvage.bid · POST /salvages/bid · gate offer · sandbox · answers SalvageBid@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) · /1GNSKTKL4MR102261 (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 — Salvage.bidPlaced@1 · Salvage.failed@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.bid({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/bid \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageBid@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"bid": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"bid": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}partsValue
salvage.partsValue · GET /salvages/parts-value · gate key · sandbox · answers SalvagePartsValue@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.partsValue({"vin":"1GNSKTKL4MR102261"})curl 'https://apis.vin/salvages/parts-value?vin=1GNSKTKL4MR102261'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": "SalvagePartsValue@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"valuationRef": "SPV-0013",
"acv": {
"amount": "6014.00",
"currency": "USD"
},
"partsOutValue": {
"amount": "8119.00",
"currency": "USD"
},
"scrapFloor": {
"amount": "902.00",
"currency": "USD"
},
"highValueParts": [
"powertrain",
"infotainment-cluster",
"front-clip"
],
"channel": "dismantle",
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"valuationRef": "SPV-0013",
"acv": {
"amount": "6014.00",
"currency": "USD"
},
"partsOutValue": {
"amount": "8119.00",
"currency": "USD"
},
"scrapFloor": {
"amount": "902.00",
"currency": "USD"
},
"highValueParts": [
"powertrain",
"infotainment-cluster",
"front-clip"
],
"channel": "dismantle",
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-integrity-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}storageFee
salvage.storageFee · POST /salvages/storage-fee · gate offer · sandbox · answers SalvageStorageFee@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) · /1GNSKTKL4MR102261 (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 — Salvage.failed@1 · Salvage.storageFeeAssessed@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.storageFee({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/storage-fee \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageStorageFee@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"storageFee": {
"days": 10,
"billableDays": 3,
"dayRateCents": 2500,
"amountCents": 7500,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"storageFee": {
"days": 10,
"billableDays": 3,
"dayRateCents": 2500,
"amountCents": 7500,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
assign
salvage.assign · POST /salvages/assign · gate offer · sandbox · answers SalvageAssign@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) · /1GNSKTKL4MR102261 (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 — Salvage.salvageAssigned@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.assign({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/assign \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageAssign@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"assignment": {
"status": "refused",
"reason": "not-salvage-iron",
"donor": "not-a-donor"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"assignment": {
"status": "refused",
"reason": "not-salvage-iron",
"donor": "not-a-donor"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
salvage.pay · POST /salvages/pay · gate offer · sandbox · answers SalvagePay@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) · /1GNSKTKL4MR102261 (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 — Salvage.failed@1 · Salvage.paid@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.pay({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/pay \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvagePay@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"payment": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"payment": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}buy
salvage.buy · POST /salvages/buy · gate offer · sandbox · answers SalvageBuy@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) · /1GNSKTKL4MR102261 (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 — EndOfLife.accepted@1 · Salvage.bought@1 · Salvage.failed@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.buy({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/buy \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageBuy@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"purchase": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"purchase": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [
"EndOfLife.accepted@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}settle
salvage.settle · POST /salvages/settle · gate offer · sandbox · answers SalvageSettle@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) · /1GNSKTKL4MR102261 (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 — Salvage.failed@1 · Salvage.settled@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.settle({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/settle \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageSettle@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"settlement": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"settlement": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
rebuildInspect
salvage.rebuildInspect · POST /salvages/rebuild-inspect · gate key · sandbox · answers SalvageRebuildInspect@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 — Salvage.rebuildInspected@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.rebuildInspect()curl -X POST https://apis.vin/salvages/rebuild-inspect \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "SalvageRebuildInspect@1",
"value": {
"vin": "1HGCM82633A004352",
"inspectionRef": "SRI-001O",
"inspectionResult": "passed",
"brandEligible": "rebuilt",
"componentsVerified": [
"airbags",
"structural-frame",
"lighting",
"safety-restraints"
],
"photoEvidenceRequired": true,
"reinspectionRequired": false,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1HGCM82633A004352",
"inspectionRef": "SRI-001O",
"inspectionResult": "passed",
"brandEligible": "rebuilt",
"componentsVerified": [
"airbags",
"structural-frame",
"lighting",
"safety-restraints"
],
"photoEvidenceRequired": true,
"reinspectionRequired": false,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-integrity-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
dismantleAuthorize
salvage.dismantleAuthorize · POST /salvages/dismantle-authorize · gate offer · sandbox · answers SalvageDismantleAuthorize@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) · /1GNSKTKL4MR102261 (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 — EndOfLife.dismantled@1 · Salvage.dismantleAuthorized@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.dismantleAuthorize({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/dismantle-authorize \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageDismantleAuthorize@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"authorization": {
"status": "refused",
"reason": "retail-iron-never-dismantles",
"donor": "not-a-donor"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"authorization": {
"status": "refused",
"reason": "retail-iron-never-dismantles",
"donor": "not-a-donor"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [
"EndOfLife.dismantled@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
channel
salvage.channel · POST /salvages/channel · gate offer · sandbox · answers SalvageAssignment@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
channel | string | yes | one of salvage-auction, dismantler, part-out, scrap |
claim | string | no | — |
titleBrand | string | no | one of salvage, junk, rebuilt, flood, lemon |
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.
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 — Salvage.assigned@1 · Salvage.listed@1 · Salvage.sold@1 · TitleBrand.disclosed@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.channel({"vin":"1GNSKTKL4MR102261","channel":"salvage-auction"})curl -X POST https://apis.vin/salvages/channel \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261","channel":"salvage-auction"}'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": "SalvageAssignment@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"channel": {
"channel": "retail-sale",
"donor": "not-a-donor"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"channel": {
"channel": "retail-sale",
"donor": "not-a-donor"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}nonRepairableBrand
salvage.nonRepairableBrand · POST /salvages/non-repairable-brand · gate key · sandbox · answers SalvageNonRepairableBrand@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 — Salvage.nonRepairableBranded@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.nonRepairableBrand()curl -X POST https://apis.vin/salvages/non-repairable-brand \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "SalvageNonRepairableBrand@1",
"value": {
"vin": "1HGCM82633A004352",
"brandRef": "SNR-001O",
"damageType": "collision-front",
"nonRepairable": false,
"brandApplied": "salvage",
"partsOnlyDisposition": false,
"rebuildEligible": true,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1HGCM82633A004352",
"brandRef": "SNR-001O",
"damageType": "collision-front",
"nonRepairable": false,
"brandApplied": "salvage",
"partsOnlyDisposition": false,
"rebuildEligible": true,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-integrity-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}pickup
salvage.pickup · POST /salvages/pickup · gate offer · sandbox · answers SalvagePickup@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) · /1GNSKTKL4MR102261 (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 — EndOfLife.pickedUp@1 · Salvage.pickedUp@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.pickup({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/pickup \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvagePickup@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"pickup": {
"status": "not-in-salvage-pool"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"pickup": {
"status": "not-in-salvage-pool"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [
"EndOfLife.pickedUp@1",
"Salvage.pickedUp@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}run
salvage.run · POST /salvages/run · gate offer · sandbox · answers SalvageRun@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) · /1GNSKTKL4MR102261 (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 — Salvage.laneRun@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.run({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/run \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageRun@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"run": {
"status": "not-in-salvage-pool"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"run": {
"status": "not-in-salvage-pool"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}titleBrand
salvage.titleBrand · GET /salvages/title-brand · gate none · sandbox · answers SalvageTitleBrand@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GNSKTKL4MR102261 (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 { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.titleBrand({"vin":"1GNSKTKL4MR102261"})curl 'https://apis.vin/salvages/title-brand?vin=1GNSKTKL4MR102261'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": "SalvageTitleBrand@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"brandRef": "SLV-0013",
"branded": false,
"brand": "clean",
"nonRepairable": false,
"brandingState": null,
"brandDate": null,
"asOf": "2026-08-10"
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"brandRef": "SLV-0013",
"branded": false,
"brand": "clean",
"nonRepairable": false,
"brandingState": null,
"brandDate": null,
"asOf": "2026-08-10"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "title-integrity-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}tow
salvage.tow · POST /salvages/tow · gate offer · sandbox · answers SalvageTow@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) · /1GNSKTKL4MR102261 (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 — Salvage.towed@1.
import { salvage } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.tow({"vin":"1GNSKTKL4MR102261"})curl -X POST https://apis.vin/salvages/tow \
-H 'content-type: application/json' \
-d '{"vin":"1GNSKTKL4MR102261"}'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": "SalvageTow@1",
"value": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"tow": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GNSKTKL4MR102261",
"noun": "salvage",
"asOf": "2026-08-10",
"tow": {
"status": "not-in-salvage-pool"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "yard-iron-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.
Salvage
Schema
| Property | Type | Notes |
|---|---|---|
id | id | — |
vin | string | — |
channel | string | abstract |
acv | money | — |
status | SalvageFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
insuranceClaim | salvage | 1:0..1 | total-loss to |
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.
Salvage · Class model
Salvage · 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.