docs.vin

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.

Case-fold group — one page, 2 nouns

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

NouneContract
PillarServices (facets: 1 services)
Capabilities1 — 0 live · 1 sandbox · 0 declared
EntitiesEcontract
Doorsdocs.vin
SDKVin.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:

More actions

prepare

eContract.prepare · POST /e-contracts/prepare · gate offer · sandbox · answers DocumentPacket@1

FieldTypeRequiredNotes
subjectstringyesdeal_ or party context
formsarray<string>nobuyers-order, contract, disclosures
statestringno
authoritystringno

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.

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

EmitsDocument.assembled@1 · Poa.generated@1 · Document.generated@1.

the SDK — eContract.prepare
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"})
POST /e-contracts/prepare
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.

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

Nounecontract
PillarServices (facets: 5 data · 8 services · 4 commerce)
Capabilities17 — 0 live · 17 sandbox · 0 declared
EntitiesEcontract
Doorsaggregator.vin
SDKVin.econtract.* from apis.vin
Address/catalog/eContract#{action} — the anchor IS the wire name minus econtract.

Lifecycle

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

Discover & read

read

econtract.read · GET /econtracts/read · gate none · sandbox · answers EcontractRead@1

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — econtract.status
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"})
GET /econtracts/status
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.

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

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

EmitsEcontract.validateRequested@1 · Econtract.validated@1.

the SDK — econtract.validate
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"})
POST /econtracts/validate
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — econtract.complianceCheck
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"})
GET /econtracts/compliance-check
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.

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

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

EmitsEcontract.paid@1 · Econtract.payFailed@1 · Econtract.payRequested@1.

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

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

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

EmitsEcontract.fundFailed@1 · Econtract.fundRequested@1 · Econtract.funded@1.

the SDK — econtract.fund
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"})
POST /econtracts/fund
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.

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

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

EmitsEcontract.settleFailed@1 · Econtract.settleRequested@1 · Econtract.settled@1.

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

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

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

EmitsEcontract.generateRequested@1 · Econtract.generated@1.

the SDK — econtract.generate
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"})
POST /econtracts/generate
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.

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

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

EmitsEcontract.assembleRequested@1 · Econtract.assembled@1.

the SDK — econtract.assemble
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"})
POST /econtracts/assemble
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.

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

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

EmitsDeal.contracted@1 · Document.executed@1 · Econtract.esignFailed@1 · Econtract.esignRequested@1 · Econtract.esigned@1.

the SDK — econtract.esign
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"})
POST /econtracts/esign
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — econtract.auditTrail
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"})
GET /econtracts/audit-trail
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — econtract.completeness
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"})
GET /econtracts/completeness
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.

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

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

EmitsEcontract.fundPackageRequested@1 · Econtract.packageFunded@1.

the SDK — econtract.fundPackage
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"})
POST /econtracts/fund-package
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.

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

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

EmitsEcontract.remedied@1 · Econtract.remedyRequested@1.

the SDK — econtract.remedy
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"})
POST /econtracts/remedy
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.

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

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

EmitsEcontract.routeRequested@1 · Econtract.routed@1.

the SDK — econtract.route
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"})
POST /econtracts/route
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.

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

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

EmitsEcontract.stipulateRequested@1 · Econtract.stipulated@1.

the SDK — econtract.stipulate
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"})
POST /econtracts/stipulate
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.

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

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

EmitsEcontract.submitToLenderRequested@1 · Econtract.lenderSubmitted@1.

the SDK — econtract.submitToLender
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"})
POST /econtracts/submit-to-lender
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.

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

PropertyTypeNotes
ididec_
dealIdref→Deal
lenderIdref→Lender
documentsDocument[]
statusEcontractFSM

Relationships

FromToCardinalityAs
econtractdeal1:1contracts
econtractlender*:1submitted-to

Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.