document
The document noun — identity, lifecycle, events, and every capability as an anchored section: 17 capabilities, 0 live, 17 sandbox, 0 declared.
document 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 | document |
| Pillar | Data (facets: 8 data · 7 services · 2 commerce) |
| Capabilities | 17 — 0 live · 17 sandbox · 0 declared |
| Entities | Document |
| Doors | aggregator.vin |
| SDK | Vin.document.* from apis.vin |
| Address | /catalog/document#{action} — the anchor IS the wire name minus document. |
Lifecycle
Document — DocumentFSM: 7 states, 6 transitions — Draft · Prepared · Sent · Signed · Notarized · Filed · Executed. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 21 past-tense, versioned event types, each linked to the capability that emits it:
Document.archiveRequested@1— emitted byarchiveDocument.archived@1— emitted byarchiveDocument.classified@1— emitted byclassifyDocument.feeCharged@1— emitted byfeeDocument.feeRequested@1— emitted byfeeDocument.generateRequested@1— emitted bygenerateDocument.generated@1— emitted bygenerateDocument.paid@1— emitted bypayDocument.payFailed@1— emitted bypayDocument.payRequested@1— emitted bypayDocument.redactRequested@1— emitted byredactDocument.redacted@1— emitted byredactDocument.routeRequested@1— emitted byrouteDocument.routed@1— emitted byrouteDocument.scanRequested@1— emitted byscanDocument.scanned@1— emitted byscanDocument.stampRequested@1— emitted bystampDocument.stamped@1— emitted bystampDocument.uploadRequested@1— emitted byuploadDocument.uploaded@1— emitted byuploadPoa.generated@1— emitted bygenerate
Discover & read
search
document.search · GET /documents/search · gate none · sandbox · answers DocumentSearch@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.search({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/search?vin=1GTU9DED4KZ250897'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": "DocumentSearch@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"results": {
"documents": 7,
"inVault": 3,
"inFlight": 4
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"results": {
"documents": 7,
"inVault": 3,
"inFlight": 4
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}read
document.read · GET /documents/read · gate none · sandbox · answers DocumentRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.read({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/read?vin=1GTU9DED4KZ250897'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": "DocumentRead@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"document": {
"id": "DOC-6e119877",
"position": "Draft",
"kind": "vehicle-record",
"custody": "in-flight"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"document": {
"id": "DOC-6e119877",
"position": "Draft",
"kind": "vehicle-record",
"custody": "in-flight"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
document.status · GET /documents/status · gate none · sandbox · answers DocumentStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.status({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/status?vin=1GTU9DED4KZ250897'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": "DocumentStatus@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"document": {
"id": "DOC-6e119877",
"position": "Draft",
"kind": "vehicle-record",
"custody": "in-flight"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"document": {
"id": "DOC-6e119877",
"position": "Draft",
"kind": "vehicle-record",
"custody": "in-flight"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
document.verify · GET /documents/verify · gate none · sandbox · answers DocumentVerify@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.verify({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/verify?vin=1GTU9DED4KZ250897'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": "DocumentVerify@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"verification": {
"id": "DOC-6e119877",
"verified": false,
"reason": "not-yet-signed",
"position": "Draft"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"verification": {
"id": "DOC-6e119877",
"verified": false,
"reason": "not-yet-signed",
"position": "Draft"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}scan
document.scan · POST /documents/scan · gate offer · sandbox · answers DocumentScan@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) · /1GTU9DED4KZ250897 (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.scanRequested@1 · Document.scanned@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.scan({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/scan \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentScan@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"scan": {
"id": "DOC-6e119877",
"pages": 2,
"resolutionDpi": 300,
"status": "scanned"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"scan": {
"id": "DOC-6e119877",
"pages": 2,
"resolutionDpi": 300,
"status": "scanned"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}classify
document.classify · GET /documents/classify · gate key · sandbox · answers DocumentClassify@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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.classified@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.classify({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/classify?vin=1GTU9DED4KZ250897'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": "DocumentClassify@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"classification": {
"id": "DOC-6e119877",
"kind": "vehicle-record",
"basis": "world-arc"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"classification": {
"id": "DOC-6e119877",
"kind": "vehicle-record",
"basis": "world-arc"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
fee
document.fee · POST /documents/fee · gate offer · sandbox · answers DocumentFee@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) · /1GTU9DED4KZ250897 (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.feeCharged@1 · Document.feeRequested@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.fee({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/fee \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentFee@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"fee": {
"id": "DF-009e5477",
"amountCents": 8500,
"currency": "USD",
"status": "quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"fee": {
"id": "DF-009e5477",
"amountCents": 8500,
"currency": "USD",
"status": "quoted"
},
"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
}
}Pay & settle
pay
document.pay · POST /documents/pay · gate offer · sandbox · answers DocumentPay@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) · /1GTU9DED4KZ250897 (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.paid@1 · Document.payFailed@1 · Document.payRequested@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.pay({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/pay \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentPay@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-506e7595",
"amountCents": 8500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-506e7595",
"amountCents": 8500,
"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
}
}Fulfill & operate
generate
document.generate · POST /documents/generate · gate offer · sandbox · answers DocumentGenerate@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) · /1GTU9DED4KZ250897 (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.generateRequested@1 · Poa.generated@1 · Document.generated@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.generate({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/generate \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentGenerate@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"document": {
"status": "already-on-file",
"id": "DOC-6e119877",
"position": "Draft"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"document": {
"status": "already-on-file",
"id": "DOC-6e119877",
"position": "Draft"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}upload
document.upload · POST /documents/upload · gate offer · sandbox · answers DocumentUpload@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) · /1GTU9DED4KZ250897 (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.uploadRequested@1 · Document.uploaded@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.upload({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/upload \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentUpload@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"upload": {
"status": "uploaded",
"id": "DOC-6e119877",
"vaultId": "VLT-e3387c4b",
"custody": "vault"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"upload": {
"status": "uploaded",
"id": "DOC-6e119877",
"vaultId": "VLT-e3387c4b",
"custody": "vault"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
archive
document.archive · POST /documents/archive · gate offer · sandbox · answers DocumentArchive@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) · /1GTU9DED4KZ250897 (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.archiveRequested@1 · Document.archived@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.archive({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/archive \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentArchive@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"archive": {
"id": "DOC-6e119877",
"status": "still-active",
"position": "Draft"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"archive": {
"id": "DOC-6e119877",
"status": "still-active",
"position": "Draft"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
expiry
document.expiry · GET /documents/expiry · gate none · sandbox · answers DocumentExpiry@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.expiry({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/expiry?vin=1GTU9DED4KZ250897'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": "DocumentExpiry@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"expiry": {
"id": "DOC-6e119877",
"expires": true,
"expiresOn": "2026-09-09",
"position": "Draft"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"expiry": {
"id": "DOC-6e119877",
"expires": true,
"expiresOn": "2026-09-09",
"position": "Draft"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}extract
document.extract · GET /documents/extract · gate none · sandbox · answers DocumentExtract@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.extract({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/extract?vin=1GTU9DED4KZ250897'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": "DocumentExtract@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"extraction": {
"id": "DOC-6e119877",
"vin": "1GTU9DED4KZ250897",
"buyer": "Ava Good",
"priceCents": 2300000,
"currency": "USD",
"status": "extracted"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"extraction": {
"id": "DOC-6e119877",
"vin": "1GTU9DED4KZ250897",
"buyer": "Ava Good",
"priceCents": 2300000,
"currency": "USD",
"status": "extracted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}ocr
document.ocr · GET /documents/ocr · gate none · sandbox · answers DocumentOcr@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GTU9DED4KZ250897 (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 { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.ocr({"vin":"1GTU9DED4KZ250897"})curl 'https://apis.vin/documents/ocr?vin=1GTU9DED4KZ250897'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": "DocumentOcr@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"ocr": {
"id": "DOC-6e119877",
"confidencePct": 94,
"fields": [
"vin",
"buyer",
"price"
],
"status": "recognized"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"ocr": {
"id": "DOC-6e119877",
"confidencePct": 94,
"fields": [
"vin",
"buyer",
"price"
],
"status": "recognized"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}redact
document.redact · POST /documents/redact · gate offer · sandbox · answers DocumentRedact@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) · /1GTU9DED4KZ250897 (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.redactRequested@1 · Document.redacted@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.redact({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/redact \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentRedact@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"redaction": {
"id": "DOC-6e119877",
"fields": [
"ssn",
"dob",
"accountNumber"
],
"status": "redacted"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"redaction": {
"id": "DOC-6e119877",
"fields": [
"ssn",
"dob",
"accountNumber"
],
"status": "redacted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}route
document.route · POST /documents/route · gate offer · sandbox · answers DocumentRoute@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) · /1GTU9DED4KZ250897 (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.routeRequested@1 · Document.routed@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.route({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/route \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentRoute@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"routing": {
"id": "DOC-6e119877",
"destination": "desk",
"status": "routed"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"routing": {
"id": "DOC-6e119877",
"destination": "desk",
"status": "routed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stamp
document.stamp · POST /documents/stamp · gate offer · sandbox · answers DocumentStamp@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) · /1GTU9DED4KZ250897 (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.stampRequested@1 · Document.stamped@1.
import { document } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await document.stamp({"vin":"1GTU9DED4KZ250897"})curl -X POST https://apis.vin/documents/stamp \
-H 'content-type: application/json' \
-d '{"vin":"1GTU9DED4KZ250897"}'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": "DocumentStamp@1",
"value": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"stamp": {
"id": "DOC-6e119877",
"status": "not-yet-signed",
"position": "Draft"
}
},
"evidence": {
"vin": "1GTU9DED4KZ250897",
"noun": "document",
"asOf": "2026-08-10",
"stamp": {
"id": "DOC-6e119877",
"status": "not-yet-signed",
"position": "Draft"
}
},
"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.
Document
Schema
| Property | Type | Notes |
|---|---|---|
id | id | doc_ |
type | DocType | POA|buyersOrder|contract|MCO|disclosure |
subjectId | ref→Deal | — |
url | string | — |
hash | string | — |
signers | Signer[] | — |
status | DocumentFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
deal | document | 1:0..* | papered |
document | signing | 1:0..* | signed via |
document | notary | 1:0..* | notarized via |
dealJacket | document | 1:0..* | holds |
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 2 diagrams, rendered from the estate model.
Document · Class model
Document · State machine
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.