docs.vin

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

Nounkyc
PillarData (facets: 6 data · 6 services · 1 commerce)
Capabilities13 — 0 live · 13 sandbox · 0 declared
EntitiesParty
Doorsaggregator.vin
SDKVin.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:

Discover & read

read

kyc.read · GET /kycs/read · gate none · sandbox · answers KycRead@1

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.verified@1.

the SDK — kyc.verify
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"})
POST /kycs/verify
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — kyc.result
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"})
GET /kycs/result
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.reVerified@1.

the SDK — kyc.reVerify
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"})
POST /kycs/re-verify
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.failed@1 · Kyc.paid@1.

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

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.documentsCollected@1.

the SDK — kyc.documentCollect
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"})
POST /kycs/document-collect
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.escalated@1.

the SDK — kyc.escalate
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"})
POST /kycs/escalate
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.cleared@1.

the SDK — kyc.clear
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"})
POST /kycs/clear
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — kyc.amlScore
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"})
GET /kycs/aml-score
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — kyc.beneficialOwner
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"})
GET /kycs/beneficial-owner
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /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.

EmitsKyc.initiated@1.

the SDK — kyc.initiate
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"})
POST /kycs/initiate
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — kyc.watchlistScreen
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"})
GET /kycs/watchlist-screen
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.

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