tradeIn
The tradeIn noun — identity, lifecycle, events, and every capability as an anchored section: 10 capabilities, 1 live, 9 sandbox, 0 declared.
tradeIn is one of the estate's 317 automotive nouns — a job a car needs done. It carries 10 capabilities: 1 live, 9 sandbox, 0 declared · doors aggregator.vin · offers.vin.
Identity
| Noun | tradeIn |
| Pillar | Commerce (facets: 2 data · 3 services · 5 commerce) |
| Capabilities | 10 — 1 live · 9 sandbox · 0 declared |
| Entities | Appraisal |
| Doors | aggregator.vin · offers.vin |
| SDK | Vin.tradeIn.* from apis.vin |
| Address | /catalog/tradeIn#{action} — the anchor IS the wire name minus tradeIn. |
Events
The vocabulary this noun can append to the record — 13 past-tense, versioned event types, each linked to the capability that emits it:
Offer.accepted@1— emitted byofferOffer.declined@1— emitted byofferOffer.expired@1— emitted byofferOffer.extended@1— emitted byofferTrade.captured@1— emitted byofferTradeIn.allowanceSet@1— emitted byallowanceTradeIn.failed@1— emitted bypayoffCollect·rollNegative·taxCreditTradeIn.instantOffered@1— emitted byinstantOfferTradeIn.negativeRolled@1— emitted byrollNegativeTradeIn.payoffCollected@1— emitted bypayoffCollectTradeIn.photoReceived@1— emitted byphotoIntakeTradeIn.selfAppraised@1— emitted byselfAppraiseTradeIn.taxCreditApplied@1— emitted bytaxCredit
Quote & price
value
tradeIn.value · GET /trade-ins/value · gate key · live · answers TradeInValue@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNRL5H35GB050852 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.value({"vin":"5FNRL5H35GB050852"})curl 'https://apis.vin/trade-ins/value?vin=5FNRL5H35GB050852'offer
tradeIn.offer · POST /trade-ins/offer · gate offer · sandbox · answers TradeOffer@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
condition | object | yes | 28-param vehicle-condition disclosure schema |
mileage | integer | no | — |
zip | string | no | — |
payoff | string | no | — |
subject | 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.
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — offers.vin serves this noun on its two routes: / (the landing) · /5FNRL5H35GB050852 (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 — Offer.accepted@1 · Offer.declined@1 · Offer.expired@1 · Offer.extended@1 · Trade.captured@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.offer({"vin":"5FNRL5H35GB050852","condition":{}})curl -X POST https://apis.vin/trade-ins/offer \
-H 'content-type: application/json' \
-d '{"vin":"5FNRL5H35GB050852","condition":{}}'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": "TradeOffer@1",
"value": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"offer": {
"status": "accepted",
"id": "APR-e95b7d6b",
"amountCents": 1850000,
"currency": "USD"
}
},
"evidence": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"offer": {
"status": "accepted",
"id": "APR-e95b7d6b",
"amountCents": 1850000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
},
"connect": {
"type": "OFFER",
"kind": "connect",
"reason": "CONNECTION_ABSENT",
"portClass": "auction-market",
"state": "absent",
"url": "https://integrates.vin/connect/auction-market",
"message": "tradeIn.offer is live via connection — certified, connect to activate: complete the auction-market link ceremony at https://integrates.vin/connect/auction-market. The credential vault (auth.vin) holds the token, and the same call answers simulated:false — activation is the token, never a deploy."
}
}selfAppraise
tradeIn.selfAppraise · POST /trade-ins/self-appraise · gate key · sandbox · answers TradeInSelfAppraise@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNRL5H35GB050852 (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 — TradeIn.selfAppraised@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.selfAppraise()curl -X POST https://apis.vin/trade-ins/self-appraise \
-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": "TradeInSelfAppraise@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "tradeIn",
"asOf": "2026-08-10",
"appraisal": {
"status": "no-appraisal-on-file"
},
"selfAppraisal": {
"status": "received-fresh",
"id": "APR-97264503",
"opensAt": "Requested"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "tradeIn",
"asOf": "2026-08-10",
"appraisal": {
"status": "no-appraisal-on-file"
},
"selfAppraisal": {
"status": "received-fresh",
"id": "APR-97264503",
"opensAt": "Requested"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}instantOffer
tradeIn.instantOffer · POST /trade-ins/instant-offer · gate key · sandbox · answers TradeInInstantOffer@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNRL5H35GB050852 (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 — TradeIn.instantOffered@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.instantOffer()curl -X POST https://apis.vin/trade-ins/instant-offer \
-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": "BLOCKED",
"reason": "INVALID_VIN",
"position": 9,
"message": "the supplied VIN is not a valid 17-char VIN (check-digit seat is position 9)",
"received": "",
"events": [],
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "sandbox"
}
}Pay & settle
payoffCollect
tradeIn.payoffCollect · POST /trade-ins/payoff-collect · gate offer · sandbox · answers TradeInPayoffCollect@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) · /5FNRL5H35GB050852 (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 — TradeIn.failed@1 · TradeIn.payoffCollected@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.payoffCollect({"vin":"5FNRL5H35GB050852"})curl -X POST https://apis.vin/trade-ins/payoff-collect \
-H 'content-type: application/json' \
-d '{"vin":"5FNRL5H35GB050852"}'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": "TradeInPayoffCollect@1",
"value": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"collection": {
"status": "nothing-to-collect",
"reason": "no-open-loan"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"collection": {
"status": "nothing-to-collect",
"reason": "no-open-loan"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
allowance
tradeIn.allowance · POST /trade-ins/allowance · gate offer · sandbox · answers TradeInAllowance@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) · /5FNRL5H35GB050852 (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 — TradeIn.allowanceSet@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.allowance({"vin":"5FNRL5H35GB050852"})curl -X POST https://apis.vin/trade-ins/allowance \
-H 'content-type: application/json' \
-d '{"vin":"5FNRL5H35GB050852"}'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": "TradeInAllowance@1",
"value": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"allowanceQuote": {
"status": "set",
"id": "APR-e95b7d6b",
"amountCents": 1850000,
"currency": "USD",
"basis": "no-over-allowance-the-appraised-figure"
}
},
"evidence": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"allowanceQuote": {
"status": "set",
"id": "APR-e95b7d6b",
"amountCents": 1850000,
"currency": "USD",
"basis": "no-over-allowance-the-appraised-figure"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}equity
tradeIn.equity · GET /trade-ins/equity · gate key · sandbox · answers TradeInEquity@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNRL5H35GB050852 (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 { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.equity({"vin":"5FNRL5H35GB050852"})curl 'https://apis.vin/trade-ins/equity?vin=5FNRL5H35GB050852'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": "TradeInEquity@1",
"value": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"equity": {
"status": "free-and-clear",
"allowanceCents": 1850000,
"equityCents": 1850000
}
},
"evidence": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"equity": {
"status": "free-and-clear",
"allowanceCents": 1850000,
"equityCents": 1850000
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}photoIntake
tradeIn.photoIntake · POST /trade-ins/photo-intake · gate key · sandbox · answers TradeInPhotoIntake@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5FNRL5H35GB050852 (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 — TradeIn.photoReceived@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.photoIntake()curl -X POST https://apis.vin/trade-ins/photo-intake \
-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": "TradeInPhotoIntake@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "tradeIn",
"asOf": "2026-08-10",
"appraisal": {
"status": "no-appraisal-on-file"
},
"intake": {
"status": "received",
"id": "PHB-862ac20c"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "tradeIn",
"asOf": "2026-08-10",
"appraisal": {
"status": "no-appraisal-on-file"
},
"intake": {
"status": "received",
"id": "PHB-862ac20c"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rollNegative
tradeIn.rollNegative · POST /trade-ins/roll-negative · gate offer · sandbox · answers TradeInRollNegative@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) · /5FNRL5H35GB050852 (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 — TradeIn.failed@1 · TradeIn.negativeRolled@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.rollNegative({"vin":"5FNRL5H35GB050852"})curl -X POST https://apis.vin/trade-ins/roll-negative \
-H 'content-type: application/json' \
-d '{"vin":"5FNRL5H35GB050852"}'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": "TradeInRollNegative@1",
"value": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"roll": {
"status": "nothing-to-roll",
"reason": "free-and-clear"
}
},
"evidence": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"roll": {
"status": "nothing-to-roll",
"reason": "free-and-clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}taxCredit
tradeIn.taxCredit · POST /trade-ins/tax-credit · gate offer · sandbox · answers TradeInTaxCredit@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) · /5FNRL5H35GB050852 (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 — TradeIn.failed@1 · TradeIn.taxCreditApplied@1.
import { tradeIn } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await tradeIn.taxCredit({"vin":"5FNRL5H35GB050852"})curl -X POST https://apis.vin/trade-ins/tax-credit \
-H 'content-type: application/json' \
-d '{"vin":"5FNRL5H35GB050852"}'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": "TradeInTaxCredit@1",
"value": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"taxCredit": {
"status": "applied",
"allowanceCents": 1850000,
"taxCreditCents": 152625,
"taxBps": 825,
"currency": "USD",
"basis": "posted-sales-tax-bps-on-the-allowance"
}
},
"evidence": {
"vin": "5FNRL5H35GB050852",
"noun": "tradeIn",
"asOf": "2026-08-10",
"id": "APR-e95b7d6b",
"mileage": 51517,
"inspectionId": "INSP-b1253985",
"allowance": 1850000,
"value": 1850000,
"status": "Accepted",
"taxCredit": {
"status": "applied",
"allowanceCents": 1850000,
"taxCreditCents": 152625,
"taxBps": 825,
"currency": "USD",
"basis": "posted-sales-tax-bps-on-the-allowance"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "trade-desk-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.
Appraisal
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 3 diagrams, rendered from the estate model.
TradeIn · Class model
TradeIn · State machine
TradeIn · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.