kyc
The kyc noun — identity, lifecycle, events, and every capability as an anchored section: 13 capabilities, 0 live, 13 sandbox, 0 declared.
kyc is one of the estate's 317 automotive nouns — a job a car needs done. It carries 13 capabilities: 0 live, 13 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | kyc |
| Pillar | Data (facets: 6 data · 6 services · 1 commerce) |
| Capabilities | 13 — 0 live · 13 sandbox · 0 declared |
| Entities | Party |
| Doors | aggregator.vin |
| SDK | Vin.kyc.* from apis.vin |
| Address | /catalog/kyc#{action} — the anchor IS the wire name minus kyc. |
Events
The vocabulary this noun can append to the record — 8 past-tense, versioned event types, each linked to the capability that emits it:
Kyc.cleared@1— emitted byclearKyc.documentsCollected@1— emitted bydocumentCollectKyc.escalated@1— emitted byescalateKyc.failed@1— emitted bypayKyc.initiated@1— emitted byinitiateKyc.paid@1— emitted bypayKyc.reVerified@1— emitted byreVerifyKyc.verified@1— emitted byverify
Discover & read
read
kyc.read · GET /kycs/read · gate none · sandbox · answers KycRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM6XT3777011 (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 { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.read({"vin":"4S4GUHM6XT3777011"})curl 'https://apis.vin/kycs/read?vin=4S4GUHM6XT3777011'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": "KycRead@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"file": {
"id": "KYC-95f4c5c9",
"identityId": "ID-11f17424",
"name": "Ava Good",
"kyc": "clear",
"ofac": "clear",
"standing": "verified",
"consent": {
"identityId": "ID-11f17424",
"status": "granted",
"channels": [
"email",
"sms",
"phone"
],
"capturedAt": "2026-04-12"
}
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"file": {
"id": "KYC-95f4c5c9",
"identityId": "ID-11f17424",
"name": "Ava Good",
"kyc": "clear",
"ofac": "clear",
"standing": "verified",
"consent": {
"identityId": "ID-11f17424",
"status": "granted",
"channels": [
"email",
"sms",
"phone"
],
"capturedAt": "2026-04-12"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
kyc.status · GET /kycs/status · gate none · sandbox · answers KycStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM6XT3777011 (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 { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.status({"vin":"4S4GUHM6XT3777011"})curl 'https://apis.vin/kycs/status?vin=4S4GUHM6XT3777011'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": "KycStatus@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": {
"standing": "verified",
"kyc": "clear",
"identityId": "ID-11f17424"
},
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424"
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": {
"standing": "verified",
"kyc": "clear",
"identityId": "ID-11f17424"
},
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
kyc.verify · POST /kycs/verify · gate offer · sandbox · answers KycVerify@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) · /4S4GUHM6XT3777011 (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 — Kyc.verified@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.verify({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/verify \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycVerify@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"verification": {
"status": "verified",
"kyc": "clear",
"ofac": "clear"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"verification": {
"status": "verified",
"kyc": "clear",
"ofac": "clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}result
kyc.result · GET /kycs/result · gate none · sandbox · answers KycResult@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM6XT3777011 (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 { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.result({"vin":"4S4GUHM6XT3777011"})curl 'https://apis.vin/kycs/result?vin=4S4GUHM6XT3777011'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": "KycResult@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"result": {
"outcome": "clear",
"standing": "verified",
"amlScore": 6,
"ofac": "clear"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"result": {
"outcome": "clear",
"standing": "verified",
"amlScore": 6,
"ofac": "clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}reVerify
kyc.reVerify · POST /kycs/re-verify · gate offer · sandbox · answers KycReVerify@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) · /4S4GUHM6XT3777011 (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 — Kyc.reVerified@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.reVerify({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/re-verify \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycReVerify@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"verification": {
"status": "verified",
"kyc": "clear",
"ofac": "clear"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"verification": {
"status": "verified",
"kyc": "clear",
"ofac": "clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
kyc.pay · POST /kycs/pay · gate offer · sandbox · answers KycPay@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) · /4S4GUHM6XT3777011 (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 — Kyc.failed@1 · Kyc.paid@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.pay({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/pay \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycPay@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"payment": {
"id": "PAY-a1e5a1ef",
"amountCents": 2500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"payment": {
"id": "PAY-a1e5a1ef",
"amountCents": 2500,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}documentCollect
kyc.documentCollect · POST /kycs/document-collect · gate offer · sandbox · answers KycDocumentCollect@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) · /4S4GUHM6XT3777011 (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 — Kyc.documentsCollected@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.documentCollect({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/document-collect \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycDocumentCollect@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"documents": {
"status": "no-documents-required",
"kyc": "clear"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"documents": {
"status": "no-documents-required",
"kyc": "clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
escalate
kyc.escalate · POST /kycs/escalate · gate offer · sandbox · answers KycEscalate@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) · /4S4GUHM6XT3777011 (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 — Kyc.escalated@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.escalate({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/escalate \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycEscalate@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"escalation": {
"status": "nothing-to-escalate",
"kyc": "clear"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"escalation": {
"status": "nothing-to-escalate",
"kyc": "clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}clear
kyc.clear · POST /kycs/clear · gate offer · sandbox · answers KycClear@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) · /4S4GUHM6XT3777011 (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 — Kyc.cleared@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.clear({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/clear \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycClear@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"clearance": {
"status": "already-clear",
"kyc": "clear"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"clearance": {
"status": "already-clear",
"kyc": "clear"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
amlScore
kyc.amlScore · GET /kycs/aml-score · gate key · sandbox · answers KycAmlScore@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM6XT3777011 (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 { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.amlScore({"vin":"4S4GUHM6XT3777011"})curl 'https://apis.vin/kycs/aml-score?vin=4S4GUHM6XT3777011'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": "KycAmlScore@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"aml": {
"score": 6,
"band": "low",
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"aml": {
"score": 6,
"band": "low",
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}beneficialOwner
kyc.beneficialOwner · GET /kycs/beneficial-owner · gate key · sandbox · answers KycBeneficialOwner@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM6XT3777011 (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 { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.beneficialOwner({"vin":"4S4GUHM6XT3777011"})curl 'https://apis.vin/kycs/beneficial-owner?vin=4S4GUHM6XT3777011'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": "KycBeneficialOwner@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"ubo": {
"businessId": "DLR-b9066ade",
"owner": {
"name": "Estate Holdings",
"ownershipPct": 100
},
"status": "resolved"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"ubo": {
"businessId": "DLR-b9066ade",
"owner": {
"name": "Estate Holdings",
"ownershipPct": 100
},
"status": "resolved"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}initiate
kyc.initiate · POST /kycs/initiate · gate offer · sandbox · answers KycInitiate@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) · /4S4GUHM6XT3777011 (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 — Kyc.initiated@1.
import { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.initiate({"vin":"4S4GUHM6XT3777011"})curl -X POST https://apis.vin/kycs/initiate \
-H 'content-type: application/json' \
-d '{"vin":"4S4GUHM6XT3777011"}'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": "KycInitiate@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"file": {
"id": "KYC-95f4c5c9",
"identityId": "ID-11f17424",
"status": "already-on-file",
"openedAt": "2026-04-12"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"file": {
"id": "KYC-95f4c5c9",
"identityId": "ID-11f17424",
"status": "already-on-file",
"openedAt": "2026-04-12"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}watchlistScreen
kyc.watchlistScreen · GET /kycs/watchlist-screen · gate key · sandbox · answers KycWatchlistScreen@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /4S4GUHM6XT3777011 (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 { kyc } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await kyc.watchlistScreen({"vin":"4S4GUHM6XT3777011"})curl 'https://apis.vin/kycs/watchlist-screen?vin=4S4GUHM6XT3777011'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": "KycWatchlistScreen@1",
"value": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"screen": {
"ofac": "clear",
"matches": [],
"identityId": "ID-11f17424"
}
},
"evidence": {
"partyId": "ID-11f17424",
"type": "person",
"name": "Ava Good",
"identifiers": [
{
"kind": "cast-key",
"value": "ava-good"
}
],
"roles": [
{
"role": "customer"
}
],
"status": "active",
"vin": "4S4GUHM6XT3777011",
"noun": "kyc",
"asOf": "2026-08-10",
"identityId": "ID-11f17424",
"screen": {
"ofac": "clear",
"matches": [],
"identityId": "ID-11f17424"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paperwork-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Data model
The record shape behind this noun — one entity, each property an evidence field. See the whole estate model on the data model page.
Party
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.
Kyc · Class model
Kyc · State machine
Kyc · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.