docs.vin

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

Nounsalvage
PillarData (facets: 7 data · 7 services · 6 commerce)
Capabilities20 — 0 live · 20 sandbox · 0 declared
EntitiesSalvage
Doorsaggregator.vin
SDKVin.salvage.* from apis.vin
Address/catalog/salvage#{action} — the anchor IS the wire name minus salvage.

Lifecycle

SalvageSalvageFSM: 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:

Discover & read

read

salvage.read · GET /salvages/read · gate none · sandbox · answers SalvageRead@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — salvage.read
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"})
GET /salvages/read
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.

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

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

EmitsSalvage.listed@1.

the SDK — salvage.list
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"})
POST /salvages/list
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — salvage.decode
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"})
GET /salvages/decode
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — salvage.location
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"})
GET /salvages/location
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — salvage.value
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"})
GET /salvages/value
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.

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

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

EmitsSalvage.bidPlaced@1 · Salvage.failed@1.

the SDK — salvage.bid
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"})
POST /salvages/bid
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — salvage.partsValue
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"})
GET /salvages/parts-value
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.

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

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

EmitsSalvage.failed@1 · Salvage.storageFeeAssessed@1.

the SDK — salvage.storageFee
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"})
POST /salvages/storage-fee
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.

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

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

EmitsSalvage.salvageAssigned@1.

the SDK — salvage.assign
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"})
POST /salvages/assign
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.

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

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

EmitsSalvage.failed@1 · Salvage.paid@1.

the SDK — salvage.pay
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"})
POST /salvages/pay
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.

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

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

EmitsEndOfLife.accepted@1 · Salvage.bought@1 · Salvage.failed@1.

the SDK — salvage.buy
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"})
POST /salvages/buy
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.

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

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

EmitsSalvage.failed@1 · Salvage.settled@1.

the SDK — salvage.settle
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"})
POST /salvages/settle
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.

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

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

EmitsSalvage.rebuildInspected@1.

the SDK — salvage.rebuildInspect
import { salvage } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.rebuildInspect()
POST /salvages/rebuild-inspect
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.

receipt · executed 2026-08-16T14:50:10.038Z · HTTP 200
{
  "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

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

EmitsEndOfLife.dismantled@1 · Salvage.dismantleAuthorized@1.

the SDK — salvage.dismantleAuthorize
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"})
POST /salvages/dismantle-authorize
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.

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

FieldTypeRequiredNotes
vinstringyes
channelstringyesone of salvage-auction, dismantler, part-out, scrap
claimstringno
titleBrandstringnoone 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.

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

EmitsSalvage.assigned@1 · Salvage.listed@1 · Salvage.sold@1 · TitleBrand.disclosed@1.

the SDK — salvage.channel
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"})
POST /salvages/channel
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.

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

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

EmitsSalvage.nonRepairableBranded@1.

the SDK — salvage.nonRepairableBrand
import { salvage } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await salvage.nonRepairableBrand()
POST /salvages/non-repairable-brand
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.

receipt · executed 2026-08-16T14:50:10.037Z · HTTP 200
{
  "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

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

EmitsEndOfLife.pickedUp@1 · Salvage.pickedUp@1.

the SDK — salvage.pickup
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"})
POST /salvages/pickup
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.

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

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

EmitsSalvage.laneRun@1.

the SDK — salvage.run
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"})
POST /salvages/run
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — salvage.titleBrand
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"})
GET /salvages/title-brand
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.

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

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

EmitsSalvage.towed@1.

the SDK — salvage.tow
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"})
POST /salvages/tow
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.

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

PropertyTypeNotes
idid
vinstring
channelstringabstract
acvmoney
statusSalvageFSM

Relationships

FromToCardinalityAs
insuranceClaimsalvage1:0..1total-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.