eContract
The eContract / econtract case-fold group — 2 catalog nouns whose names differ only by case, on one page: 18 capabilities, 0 live, 18 sandbox, 0 declared.
eContract and econtract are distinct catalog nouns whose names differ only by case. A case-insensitive filesystem holds one file for both spellings, so this page carries the whole group — the same one-artifact rule the SDK applies to its apis.vin/eContract subpath. Each section below is one noun, rendered whole. Capability anchors stay frozen: the action of a member noun's wire name anchors here.
eContract
eContract is one of the estate's 317 automotive nouns — a job a car needs done. It carries 1 capability: 0 live, 1 sandbox, 0 declared · doors docs.vin.
Identity
| Noun | eContract |
| Pillar | Services (facets: 1 services) |
| Capabilities | 1 — 0 live · 1 sandbox · 0 declared |
| Entities | Econtract |
| Doors | docs.vin |
| SDK | Vin.eContract.* from apis.vin |
| Address | /catalog/eContract#{action} — the anchor IS the wire name minus eContract. |
Events
The vocabulary this noun can append to the record — 3 past-tense, versioned event types, each linked to the capability that emits it:
Document.assembled@1— emitted byprepareDocument.generated@1— emitted bypreparePoa.generated@1— emitted byprepare
More actions
prepare
eContract.prepare · POST /e-contracts/prepare · gate offer · sandbox · answers DocumentPacket@1
| Field | Type | Required | Notes |
|---|---|---|---|
subject | string | yes | deal_ or party context |
forms | array<string> | no | buyers-order, contract, disclosures |
state | string | no | — |
authority | 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 — docs.vin serves this noun on its two routes: / (the landing) · /JTEVB5BR4T5047785 (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 — Document.assembled@1 · Poa.generated@1 · Document.generated@1.
import { eContract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await eContract.prepare({"subject":"subject"})curl -X POST https://apis.vin/e-contracts/prepare \
-H 'content-type: application/json' \
-d '{"subject":"subject"}'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": "DocumentPacket@1",
"value": {
"vin": "SUBJECT",
"noun": "eContract",
"asOf": "2026-08-10",
"id": "EC-517c6f28",
"documents": [
"DOC-39bcd0a2"
],
"status": "Generated",
"preparation": {
"status": "already-on-file",
"id": "DOC-39bcd0a2",
"position": "Draft"
}
},
"evidence": {
"vin": "SUBJECT",
"noun": "eContract",
"asOf": "2026-08-10",
"id": "EC-517c6f28",
"documents": [
"DOC-39bcd0a2"
],
"status": "Generated",
"preparation": {
"status": "already-on-file",
"id": "DOC-39bcd0a2",
"position": "Draft"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "funding-pipeline-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.
Econtract
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.
EContract · Class model
EContract · Class model
EContract · State machine
econtract
econtract is one of the estate's 317 automotive nouns — a job a car needs done. It carries 17 capabilities: 0 live, 17 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | econtract |
| Pillar | Services (facets: 5 data · 8 services · 4 commerce) |
| Capabilities | 17 — 0 live · 17 sandbox · 0 declared |
| Entities | Econtract |
| Doors | aggregator.vin |
| SDK | Vin.econtract.* from apis.vin |
| Address | /catalog/eContract#{action} — the anchor IS the wire name minus econtract. |
Lifecycle
Econtract — EcontractFSM: 8 states, 8 transitions — Generated · Assembled · Validated · Routed · Signed · Submitted · Funded · Settled. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 30 past-tense, versioned event types, each linked to the capability that emits it:
Deal.contracted@1— emitted byesignDocument.executed@1— emitted byesignEcontract.assembleRequested@1— emitted byassembleEcontract.assembled@1— emitted byassembleEcontract.esignFailed@1— emitted byesignEcontract.esignRequested@1— emitted byesignEcontract.esigned@1— emitted byesignEcontract.fundFailed@1— emitted byfundEcontract.fundPackageRequested@1— emitted byfundPackageEcontract.fundRequested@1— emitted byfundEcontract.funded@1— emitted byfundEcontract.generateRequested@1— emitted bygenerateEcontract.generated@1— emitted bygenerateEcontract.lenderSubmitted@1— emitted bysubmitToLenderEcontract.packageFunded@1— emitted byfundPackageEcontract.paid@1— emitted bypayEcontract.payFailed@1— emitted bypayEcontract.payRequested@1— emitted bypayEcontract.remedied@1— emitted byremedyEcontract.remedyRequested@1— emitted byremedyEcontract.routeRequested@1— emitted byrouteEcontract.routed@1— emitted byrouteEcontract.settleFailed@1— emitted bysettleEcontract.settleRequested@1— emitted bysettleEcontract.settled@1— emitted bysettleEcontract.stipulateRequested@1— emitted bystipulateEcontract.stipulated@1— emitted bystipulateEcontract.submitToLenderRequested@1— emitted bysubmitToLenderEcontract.validateRequested@1— emitted byvalidateEcontract.validated@1— emitted byvalidate
Discover & read
read
econtract.read · GET /econtracts/read · gate none · sandbox · answers EcontractRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /JTEVB5BR4T5047785 (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 { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.read({"vin":"JTEVB5BR4T5047785"})curl 'https://apis.vin/econtracts/read?vin=JTEVB5BR4T5047785'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": "EcontractRead@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"contract": {
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"contract": {
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
econtract.status · GET /econtracts/status · gate none · sandbox · answers EcontractStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /JTEVB5BR4T5047785 (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 { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.status({"vin":"JTEVB5BR4T5047785"})curl 'https://apis.vin/econtracts/status?vin=JTEVB5BR4T5047785'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": "EcontractStatus@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"contract": {
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"contract": {
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}validate
econtract.validate · POST /econtracts/validate · gate offer · sandbox · answers EcontractValidate@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) · /JTEVB5BR4T5047785 (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 — Econtract.validateRequested@1 · Econtract.validated@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.validate({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/validate \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractValidate@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"validation": {
"status": "not-yet-assembled",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"validation": {
"status": "not-yet-assembled",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}complianceCheck
econtract.complianceCheck · GET /econtracts/compliance-check · gate none · sandbox · answers EcontractComplianceCheck@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /JTEVB5BR4T5047785 (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 { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.complianceCheck({"vin":"JTEVB5BR4T5047785"})curl 'https://apis.vin/econtracts/compliance-check?vin=JTEVB5BR4T5047785'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": "EcontractComplianceCheck@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"compliance": {
"id": "EC-e0369dc6",
"compliant": true,
"checks": [
"tila",
"ecoa",
"state-disclosures"
],
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"compliance": {
"id": "EC-e0369dc6",
"compliant": true,
"checks": [
"tila",
"ecoa",
"state-disclosures"
],
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
econtract.pay · POST /econtracts/pay · gate offer · sandbox · answers EcontractPay@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) · /JTEVB5BR4T5047785 (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 — Econtract.paid@1 · Econtract.payFailed@1 · Econtract.payRequested@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.pay({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/pay \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractPay@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-f85ed642",
"amountCents": 2500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-f85ed642",
"amountCents": 2500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}fund
econtract.fund · POST /econtracts/fund · gate offer · sandbox · answers EcontractFund@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) · /JTEVB5BR4T5047785 (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 — Econtract.fundFailed@1 · Econtract.fundRequested@1 · Econtract.funded@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.fund({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/fund \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractFund@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"funding": {
"status": "not-yet-submitted",
"id": "EC-e0369dc6",
"position": "Generated"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"funding": {
"status": "not-yet-submitted",
"id": "EC-e0369dc6",
"position": "Generated"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}settle
econtract.settle · POST /econtracts/settle · gate offer · sandbox · answers EcontractSettle@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) · /JTEVB5BR4T5047785 (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 — Econtract.settleFailed@1 · Econtract.settleRequested@1 · Econtract.settled@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.settle({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/settle \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractSettle@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"settlement": {
"status": "not-yet-funded",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"settlement": {
"status": "not-yet-funded",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
generate
econtract.generate · POST /econtracts/generate · gate offer · sandbox · answers EcontractGenerate@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) · /JTEVB5BR4T5047785 (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 — Econtract.generateRequested@1 · Econtract.generated@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.generate({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/generate \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractGenerate@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"contract": {
"status": "already-generated",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"contract": {
"status": "already-generated",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}assemble
econtract.assemble · POST /econtracts/assemble · gate offer · sandbox · answers EcontractAssemble@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) · /JTEVB5BR4T5047785 (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 — Econtract.assembleRequested@1 · Econtract.assembled@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.assemble({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/assemble \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractAssemble@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"assembly": {
"status": "assembled",
"id": "EC-e0369dc6"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"assembly": {
"status": "assembled",
"id": "EC-e0369dc6"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
esign
econtract.esign · POST /econtracts/esign · gate offer · sandbox · answers EcontractEsign@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) · /JTEVB5BR4T5047785 (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 — Deal.contracted@1 · Document.executed@1 · Econtract.esignFailed@1 · Econtract.esignRequested@1 · Econtract.esigned@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.esign({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/esign \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractEsign@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"signature": {
"status": "not-yet-routed",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"signature": {
"status": "not-yet-routed",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [
"Deal.contracted@1",
"Document.executed@1",
"Econtract.esigned@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
auditTrail
econtract.auditTrail · GET /econtracts/audit-trail · gate none · sandbox · answers EcontractAuditTrail@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /JTEVB5BR4T5047785 (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 { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.auditTrail({"vin":"JTEVB5BR4T5047785"})curl 'https://apis.vin/econtracts/audit-trail?vin=JTEVB5BR4T5047785'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": "EcontractAuditTrail@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"events": [
{
"date": "2026-07-20",
"kind": "econtract-generated",
"id": "EC-e0369dc6"
}
]
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"events": [
{
"date": "2026-07-20",
"kind": "econtract-generated",
"id": "EC-e0369dc6"
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}completeness
econtract.completeness · GET /econtracts/completeness · gate none · sandbox · answers EcontractCompleteness@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /JTEVB5BR4T5047785 (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 { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.completeness({"vin":"JTEVB5BR4T5047785"})curl 'https://apis.vin/econtracts/completeness?vin=JTEVB5BR4T5047785'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": "EcontractCompleteness@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"completeness": {
"id": "EC-e0369dc6",
"complete": false,
"missing": [
"validation"
],
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"completeness": {
"id": "EC-e0369dc6",
"complete": false,
"missing": [
"validation"
],
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}fundPackage
econtract.fundPackage · POST /econtracts/fund-package · gate offer · sandbox · answers EcontractFundPackage@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) · /JTEVB5BR4T5047785 (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 — Econtract.fundPackageRequested@1 · Econtract.packageFunded@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.fundPackage({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/fund-package \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractFundPackage@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"package": {
"contracts": [
"EC-e0369dc6"
],
"totalCents": 736000,
"currency": "USD",
"status": "pending-funding"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"package": {
"contracts": [
"EC-e0369dc6"
],
"totalCents": 736000,
"currency": "USD",
"status": "pending-funding"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}remedy
econtract.remedy · POST /econtracts/remedy · gate offer · sandbox · answers EcontractRemedy@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) · /JTEVB5BR4T5047785 (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 — Econtract.remedied@1 · Econtract.remedyRequested@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.remedy({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/remedy \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractRemedy@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"remedy": {
"id": "EC-e0369dc6",
"status": "no-remedy-needed"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"remedy": {
"id": "EC-e0369dc6",
"status": "no-remedy-needed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}route
econtract.route · POST /econtracts/route · gate offer · sandbox · answers EcontractRoute@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) · /JTEVB5BR4T5047785 (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 — Econtract.routeRequested@1 · Econtract.routed@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.route({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/route \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractRoute@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"routing": {
"status": "not-yet-validated",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"routing": {
"status": "not-yet-validated",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stipulate
econtract.stipulate · POST /econtracts/stipulate · gate offer · sandbox · answers EcontractStipulate@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) · /JTEVB5BR4T5047785 (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 — Econtract.stipulateRequested@1 · Econtract.stipulated@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.stipulate({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/stipulate \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractStipulate@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"stipulations": {
"id": "EC-e0369dc6",
"items": [],
"status": "none-required"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"stipulations": {
"id": "EC-e0369dc6",
"items": [],
"status": "none-required"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}submitToLender
econtract.submitToLender · POST /econtracts/submit-to-lender · gate offer · sandbox · answers EcontractSubmitToLender@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) · /JTEVB5BR4T5047785 (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 — Econtract.submitToLenderRequested@1 · Econtract.lenderSubmitted@1.
import { econtract } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await econtract.submitToLender({"vin":"JTEVB5BR4T5047785"})curl -X POST https://apis.vin/econtracts/submit-to-lender \
-H 'content-type: application/json' \
-d '{"vin":"JTEVB5BR4T5047785"}'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": "EcontractSubmitToLender@1",
"value": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"submission": {
"status": "not-yet-signed",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"evidence": {
"vin": "JTEVB5BR4T5047785",
"noun": "econtract",
"asOf": "2026-08-10",
"submission": {
"status": "not-yet-signed",
"id": "EC-e0369dc6",
"position": "Generated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-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.
Econtract
Schema
| Property | Type | Notes |
|---|---|---|
id | id | ec_ |
dealId | ref→Deal | — |
lenderId | ref→Lender | — |
documents | Document[] | — |
status | EcontractFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
econtract | deal | 1:1 | contracts |
econtract | lender | *:1 | submitted-to |
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
driveline
The driveline noun — identity, lifecycle, events, and every capability as an anchored section: 29 capabilities, 2 live, 27 sandbox, 0 declared.
electrical
The electrical noun — identity, lifecycle, events, and every capability as an anchored section: 25 capabilities, 0 live, 25 sandbox, 0 declared.