escrow
The escrow noun — identity, lifecycle, events, and every capability as an anchored section: 15 capabilities, 0 live, 15 sandbox, 0 declared.
escrow is one of the estate's 317 automotive nouns — a job a car needs done. It carries 15 capabilities: 0 live, 15 sandbox, 0 declared · doors escrow.vin · aggregator.vin.
Identity
| Noun | escrow |
| Pillar | Commerce (facets: 3 data · 5 services · 7 commerce) |
| Capabilities | 15 — 0 live · 15 sandbox · 0 declared |
| Entities | Escrow |
| Doors | aggregator.vin · escrow.vin |
| SDK | Vin.escrow.* from apis.vin |
| Address | /catalog/escrow#{action} — the anchor IS the wire name minus escrow. |
Lifecycle
Escrow — EscrowFSM: 6 states, 6 transitions — Funded · InspectionHeld · FundsVerified · Disputed · Refunded · Released. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 14 past-tense, versioned event types, each linked to the capability that emits it:
Escrow.closed@1— emitted bycloseEscrow.disbursed@1— emitted bydisburse·fundEscrow.disputed@1— emitted bydisputeEscrow.expired@1— emitted byfundEscrow.failed@1— emitted bydisburse·fund·refund·releaseEscrow.funded@1— emitted byfundEscrow.fundsVerified@1— emitted byverifyEscrow.inspectionHeld@1— emitted byinspectionHoldEscrow.interestAccrued@1— emitted byinterestAccrueEscrow.milestoneReleased@1— emitted bymilestoneReleaseEscrow.opened@1— emitted byfund·openEscrow.refunded@1— emitted byfund·refundEscrow.released@1— emitted byfund·inspectionHold·releaseEscrow.subaccountOpened@1— emitted bysubaccount
Discover & read
status
escrow.status · GET /escrows/status · gate none · sandbox · answers EscrowStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.status({"vin":"2C4RDGBGXHR789631"})curl 'https://apis.vin/escrows/status?vin=2C4RDGBGXHR789631'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": "EscrowStatus@1",
"value": {
"escrow": {
"$type": "EscrowHandle",
"$id": "escrow_es_1",
"contractRef": "outcomecontract_2C4RDGBGXHR789631",
"buyerRef": "payer-sandbox",
"sellerRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"state": "held",
"escrowAccountRef": "acct_escrow_es_1",
"fundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "es_1"
},
"deadline": "2026-12-01T00:00:00.000Z"
}
},
"evidence": {
"escrow": {
"$type": "EscrowHandle",
"$id": "escrow_es_1",
"contractRef": "outcomecontract_2C4RDGBGXHR789631",
"buyerRef": "payer-sandbox",
"sellerRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"state": "held",
"escrowAccountRef": "acct_escrow_es_1",
"fundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "es_1"
},
"deadline": "2026-12-01T00:00:00.000Z"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
escrow.verify · POST /escrows/verify · gate offer · sandbox · answers EscrowVerify@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.fundsVerified@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.verify({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/verify \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowVerify@1",
"value": {
"reference": "2C4RDGBGXHR789631",
"verified": true,
"heldBalance": {
"amount": "5000.00",
"currency": "USD"
},
"state": "held"
},
"evidence": {
"reference": "2C4RDGBGXHR789631",
"verified": true,
"heldBalance": {
"amount": "5000.00",
"currency": "USD"
},
"state": "held"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
open
escrow.open · POST /escrows/open · gate offer · sandbox · answers EscrowOpen@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.opened@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.open({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/open \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowOpen@1",
"value": {
"escrow": {
"$type": "EscrowHandle",
"$id": "escrow_es_1",
"contractRef": "outcomecontract_2C4RDGBGXHR789631",
"buyerRef": "payer-sandbox",
"sellerRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"state": "held",
"escrowAccountRef": "acct_escrow_es_1",
"fundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "es_1"
},
"deadline": "2026-12-01T00:00:00.000Z"
}
},
"evidence": {
"escrow": {
"$type": "EscrowHandle",
"$id": "escrow_es_1",
"contractRef": "outcomecontract_2C4RDGBGXHR789631",
"buyerRef": "payer-sandbox",
"sellerRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"state": "held",
"escrowAccountRef": "acct_escrow_es_1",
"fundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "es_1"
},
"deadline": "2026-12-01T00:00:00.000Z"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
fund
escrow.fund · POST /escrows/fund · gate offer · sandbox · answers Escrow@1
| Field | Type | Required | Notes |
|---|---|---|---|
amount | string | yes | decimal |
conditions | array<string> | yes | release conditions gated on the stips FSM |
subject | 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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.disbursed@1 · Escrow.expired@1 · Escrow.failed@1 · Escrow.funded@1 · Escrow.opened@1 · Escrow.refunded@1 · Escrow.released@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.fund({"amount":"amount","conditions":[]})curl -X POST https://apis.vin/escrows/fund \
-H 'content-type: application/json' \
-d '{"amount":"amount","conditions":[]}'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": "Escrow@1",
"value": {
"escrow": {
"$type": "EscrowHandle",
"$id": "escrow_es_1",
"contractRef": "outcomecontract_1HGCM82633A004352",
"buyerRef": "payer-sandbox",
"sellerRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"state": "held",
"escrowAccountRef": "acct_escrow_es_1",
"fundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "es_1"
},
"deadline": "2026-12-01T00:00:00.000Z"
}
},
"evidence": {
"escrow": {
"$type": "EscrowHandle",
"$id": "escrow_es_1",
"contractRef": "outcomecontract_1HGCM82633A004352",
"buyerRef": "payer-sandbox",
"sellerRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"state": "held",
"escrowAccountRef": "acct_escrow_es_1",
"fundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "es_1"
},
"deadline": "2026-12-01T00:00:00.000Z"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}disburse
escrow.disburse · POST /escrows/disburse · gate offer · sandbox · answers EscrowDisburse@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.disbursed@1 · Escrow.failed@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.disburse({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/disburse \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowDisburse@1",
"value": {
"disbursement": {
"$type": "Payout",
"$id": "payout_po_1",
"payeeRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"scheme": "wire",
"destinationRef": "dest_seller_sandbox",
"status": "paid",
"createdAt": "2026-08-10T00:00:00.000Z",
"ledgerRef": "ledgerentry_po_1",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "settlement-rail"
},
"providerData": {
"externalId": "po_1"
}
},
"state": "disbursed"
},
"evidence": {
"disbursement": {
"$type": "Payout",
"$id": "payout_po_1",
"payeeRef": "payee-sandbox",
"amount": {
"amount": "500000",
"currency": "USD"
},
"scheme": "wire",
"destinationRef": "dest_seller_sandbox",
"status": "paid",
"createdAt": "2026-08-10T00:00:00.000Z",
"ledgerRef": "ledgerentry_po_1",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "settlement-rail"
},
"providerData": {
"externalId": "po_1"
}
},
"state": "disbursed"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
escrow.refund · POST /escrows/refund · gate offer · sandbox · answers EscrowRefund@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.failed@1 · Escrow.refunded@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.refund({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/refund \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowRefund@1",
"value": {
"refund": {
"$type": "EscrowRefund",
"$id": "escrowrefund_erf_1",
"handle": "escrow_es_1",
"amount": {
"amount": "500000",
"currency": "USD"
},
"reason": "cancelled",
"refundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "erf_1"
}
}
},
"evidence": {
"refund": {
"$type": "EscrowRefund",
"$id": "escrowrefund_erf_1",
"handle": "escrow_es_1",
"amount": {
"amount": "500000",
"currency": "USD"
},
"reason": "cancelled",
"refundedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "erf_1"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
dispute
escrow.dispute · POST /escrows/dispute · gate offer · sandbox · answers EscrowDispute@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.disputed@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.dispute({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/dispute \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowDispute@1",
"value": {
"id": "escrow_d7a15fb1",
"subjectId": "deal_09345a89",
"amount": {
"amount": "3465.22",
"currency": "USD"
},
"balance": {
"amount": "3465.22",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P13D",
"status": "Funded"
},
"evidence": {
"id": "escrow_d7a15fb1",
"subjectId": "deal_09345a89",
"amount": {
"amount": "3465.22",
"currency": "USD"
},
"balance": {
"amount": "3465.22",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P13D",
"status": "Funded"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}inspectionHold
escrow.inspectionHold · POST /escrows/inspection-hold · gate key · sandbox · answers InspectionHold@1
| Field | Type | Required | Notes |
|---|---|---|---|
subject | string | yes | — |
window | object | yes | buyer inspection window before release |
Door — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.inspectionHeld@1 · Escrow.released@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.inspectionHold({"subject":"subject","window":{}})curl -X POST https://apis.vin/escrows/inspection-hold \
-H 'content-type: application/json' \
-d '{"subject":"subject","window":{}}'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": "InspectionHold@1",
"value": {
"id": "escrow_f5036700",
"subjectId": "deal_1f239202",
"amount": {
"amount": "1658.71",
"currency": "USD"
},
"balance": {
"amount": "1658.71",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P82D",
"status": "Disputed"
},
"evidence": {
"id": "escrow_f5036700",
"subjectId": "deal_1f239202",
"amount": {
"amount": "1658.71",
"currency": "USD"
},
"balance": {
"amount": "1658.71",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P82D",
"status": "Disputed"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
release
escrow.release · POST /escrows/release · gate offer · sandbox · answers EscrowRelease@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.failed@1 · Escrow.released@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.release({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/release \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowRelease@1",
"value": {
"release": {
"$type": "EscrowRelease",
"$id": "escrowrelease_rel_1",
"handle": "escrow_es_1",
"amount": {
"amount": "500000",
"currency": "USD"
},
"proofRef": "proofofresult_2C4RDGBGXHR789631",
"releasedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "rel_1"
}
}
},
"evidence": {
"release": {
"$type": "EscrowRelease",
"$id": "escrowrelease_rel_1",
"handle": "escrow_es_1",
"amount": {
"amount": "500000",
"currency": "USD"
},
"proofRef": "proofofresult_2C4RDGBGXHR789631",
"releasedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "rel_1"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}close
escrow.close · POST /escrows/close · gate offer · sandbox · answers EscrowClose@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 — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.closed@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.close({"vin":"2C4RDGBGXHR789631"})curl -X POST https://apis.vin/escrows/close \
-H 'content-type: application/json' \
-d '{"vin":"2C4RDGBGXHR789631"}'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": "EscrowClose@1",
"value": {
"id": "escrow_24d1a8f1",
"subjectId": "deal_02b65bc9",
"amount": {
"amount": "548.78",
"currency": "USD"
},
"balance": {
"amount": "548.78",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P39D",
"status": "FundsVerified"
},
"evidence": {
"id": "escrow_24d1a8f1",
"subjectId": "deal_02b65bc9",
"amount": {
"amount": "548.78",
"currency": "USD"
},
"balance": {
"amount": "548.78",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P39D",
"status": "FundsVerified"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}milestoneRelease
escrow.milestoneRelease · POST /escrows/milestone-release · gate key · sandbox · answers EscrowMilestoneRelease@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.milestoneReleased@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.milestoneRelease()curl -X POST https://apis.vin/escrows/milestone-release \
-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": "EscrowMilestoneRelease@1",
"value": {
"release": {
"$type": "EscrowRelease",
"$id": "escrowrelease_rel_1",
"handle": "escrow_es_1",
"amount": {
"amount": "500000",
"currency": "USD"
},
"proofRef": "proofofresult_1HGCM82633A004352",
"releasedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "rel_1"
}
}
},
"evidence": {
"release": {
"$type": "EscrowRelease",
"$id": "escrowrelease_rel_1",
"handle": "escrow_es_1",
"amount": {
"amount": "500000",
"currency": "USD"
},
"proofRef": "proofofresult_1HGCM82633A004352",
"releasedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "escrow-rail"
},
"providerData": {
"externalId": "rel_1"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
balance
escrow.balance · GET /escrows/balance · gate key · sandbox · answers EscrowBalance@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.balance({"vin":"2C4RDGBGXHR789631"})curl 'https://apis.vin/escrows/balance?vin=2C4RDGBGXHR789631'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": "EscrowBalance@1",
"value": {
"handle": "escrow_es_1",
"state": "held",
"balance": {
"amount": "500000",
"currency": "USD"
}
},
"evidence": {
"handle": "escrow_es_1",
"state": "held",
"balance": {
"amount": "500000",
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}interestAccrue
escrow.interestAccrue · POST /escrows/interest-accrue · gate key · sandbox · answers EscrowInterestAccrue@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.interestAccrued@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.interestAccrue()curl -X POST https://apis.vin/escrows/interest-accrue \
-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": "EscrowInterestAccrue@1",
"value": {
"id": "escrow_f44f7b2b",
"subjectId": "deal_52a785f7",
"amount": {
"amount": "1694.45",
"currency": "USD"
},
"balance": {
"amount": "1694.45",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P26D",
"status": "InspectionHeld"
},
"evidence": {
"id": "escrow_f44f7b2b",
"subjectId": "deal_52a785f7",
"amount": {
"amount": "1694.45",
"currency": "USD"
},
"balance": {
"amount": "1694.45",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P26D",
"status": "InspectionHeld"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}ledger
escrow.ledger · GET /escrows/ledger · gate key · sandbox · answers EscrowLedger@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — escrow.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.ledger({"vin":"2C4RDGBGXHR789631"})curl 'https://apis.vin/escrows/ledger?vin=2C4RDGBGXHR789631'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": "EscrowLedger@1",
"value": {
"reference": "2C4RDGBGXHR789631",
"entries": [
{
"type": "fund",
"amount": {
"amount": "5000.00",
"currency": "USD"
},
"memo": "buyer funds held"
},
{
"type": "hold",
"amount": {
"amount": "5000.00",
"currency": "USD"
},
"memo": "outcome-contract hold"
}
],
"balance": {
"amount": "5000.00",
"currency": "USD"
}
},
"evidence": {
"reference": "2C4RDGBGXHR789631",
"entries": [
{
"type": "fund",
"amount": {
"amount": "5000.00",
"currency": "USD"
},
"memo": "buyer funds held"
},
{
"type": "hold",
"amount": {
"amount": "5000.00",
"currency": "USD"
},
"memo": "outcome-contract hold"
}
],
"balance": {
"amount": "5000.00",
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}subaccount
escrow.subaccount · POST /escrows/subaccount · gate key · sandbox · answers EscrowSubaccount@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /2C4RDGBGXHR789631 (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 — Escrow.subaccountOpened@1.
import { escrow } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await escrow.subaccount()curl -X POST https://apis.vin/escrows/subaccount \
-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": "EscrowSubaccount@1",
"value": {
"id": "escrow_e1833615",
"subjectId": "deal_5b47b3cd",
"amount": {
"amount": "2722.25",
"currency": "USD"
},
"balance": {
"amount": "2722.25",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P66D",
"status": "Released"
},
"evidence": {
"id": "escrow_e1833615",
"subjectId": "deal_5b47b3cd",
"amount": {
"amount": "2722.25",
"currency": "USD"
},
"balance": {
"amount": "2722.25",
"currency": "USD"
},
"conditions": [],
"inspectionWindow": "P66D",
"status": "Released"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "escrow-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.
Escrow
Schema
| Property | Type | Notes |
|---|---|---|
id | id | esc_ |
subjectId | ref→Deal | — |
amount | money | — |
balance | money | — |
conditions | Condition[] | stips FSM gated |
inspectionWindow | duration | — |
status | EscrowFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
deal | escrow | 1:0..1 | escrowed |
escrow | disbursement | 1:1..* | splits |
escrow | payout | 1:0..* | releases |
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.
Escrow · Class model
Escrow · State machine
Escrow · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
disbursement
The disbursement noun — identity, lifecycle, events, and every capability as an anchored section: 10 capabilities, 0 live, 10 sandbox, 0 declared.
fiReserve
The fiReserve noun — identity, lifecycle, events, and every capability as an anchored section: 5 capabilities, 0 live, 5 sandbox, 0 declared.