connection
The connection noun — identity, lifecycle, events, and every capability as an anchored section: 16 capabilities, 0 live, 16 sandbox, 0 declared.
connection is one of the estate's 317 automotive nouns — a job a car needs done. It carries 16 capabilities: 0 live, 16 sandbox, 0 declared · doors apis.vin.
Identity
| Noun | connection |
| Pillar | Services (facets: 6 data · 8 services · 2 commerce) |
| Capabilities | 16 — 0 live · 16 sandbox · 0 declared |
| Entities | Connection |
| Doors | apis.vin |
| SDK | Vin.connection.* from apis.vin |
| Address | /catalog/connection#{action} — the anchor IS the wire name minus connection. |
Lifecycle
Connection — ConnectionFSM: 5 states, 5 transitions — pending · active · degraded · revoked · expired. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 16 past-tense, versioned event types, each linked to the capability that emits it:
Connection.accessFeeAssessed@1— emitted byaccessFeeConnection.authorized@1— emitted byauthorizeConnection.degraded@1— emitted byaccountsConnection.expired@1— emitted byaccountsConnection.failed@1— emitted byaccessFee·meteredPayConnection.linked@1— emitted bylinkConnection.meteredPaid@1— emitted bymeteredPayConnection.reconnected@1— emitted byreconnectConnection.refreshed@1— emitted byrefreshConnection.revoked@1— emitted byaccounts·revokeConnection.synced@1— emitted bysyncConnection.verified@1— emitted byverifyLink.created@1— emitted bylinkSync.completed@1— emitted bysyncSync.failed@1— emitted bysyncVerification.posted@1— emitted bysync·verify
Discover & read
read
connection.read · GET /connections/read · gate none · sandbox · answers ConnectionRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.read({"vin":"KM8R7DGE0RU709816"})curl 'https://apis.vin/connections/read?vin=KM8R7DGE0RU709816'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": "ConnectionRead@1",
"value": {
"connection": "conn_5858d656",
"kind": "consumer-carrier",
"provider": "acme-mutual",
"status": "active",
"scopes": [
"read:policy",
"read:coverage"
],
"properties": [
{
"vin": "KM8R7DGE0RU709816",
"insured": true,
"label": "active policy"
}
],
"vaultRef": "crd__ef9fcda3",
"createdAt": "2026-08-10T00:00:00.000Z",
"refreshedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"connection": "conn_5858d656",
"kind": "consumer-carrier",
"provider": "acme-mutual",
"status": "active",
"scopes": [
"read:policy",
"read:coverage"
],
"properties": [
{
"vin": "KM8R7DGE0RU709816",
"insured": true,
"label": "active policy"
}
],
"vaultRef": "crd__ef9fcda3",
"createdAt": "2026-08-10T00:00:00.000Z",
"refreshedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
connection.status · GET /connections/status · gate none · sandbox · answers ConnectionStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.status({"vin":"KM8R7DGE0RU709816"})curl 'https://apis.vin/connections/status?vin=KM8R7DGE0RU709816'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": "ConnectionStatus@1",
"value": {
"connection": "conn_5858d656",
"status": "active",
"provider": "acme-mutual",
"kind": "consumer-carrier",
"active": true
},
"evidence": {
"connection": "conn_5858d656",
"status": "active",
"provider": "acme-mutual",
"kind": "consumer-carrier",
"active": true
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
connection.verify · POST /connections/verify · gate key · sandbox · answers Verification@1
| Field | Type | Required | Notes |
|---|---|---|---|
check | string | yes | one of insurance-proof, ownership, dealer-credential, income |
conn | string | no | conn_… supplying the account-verified evidence |
vin | string | no | — |
requirement | string | no | the named requirement to clear (a stip, an ownership claim, a dealer-standing check) |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.verified@1 · Verification.posted@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.verify({"check":"insurance-proof"})curl -X POST https://apis.vin/connections/verify \
-H 'content-type: application/json' \
-d '{"check":"insurance-proof"}'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": "Verification@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
],
"verification": {
"verified": true,
"check": "insurance-proof",
"id": "VRF-15bc6aba"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
],
"verification": {
"verified": true,
"check": "insurance-proof",
"id": "VRF-15bc6aba"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connection-wire-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
},
"connect": {
"type": "OFFER",
"kind": "connect",
"reason": "CONNECTION_ABSENT",
"portClass": "connections-rail",
"state": "absent",
"url": "https://integrates.vin/connect/connections-rail",
"message": "connection.verify is live via connection — certified, connect to activate: complete the connections-rail link ceremony at https://integrates.vin/connect/connections-rail. The credential vault (auth.vin) holds the token, and the same call answers simulated:false — activation is the token, never a deploy."
}
}audit
connection.audit · GET /connections/audit · gate key · sandbox · answers ConnectionAudit@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.audit({"vin":"KM8R7DGE0RU709816"})curl 'https://apis.vin/connections/audit?vin=KM8R7DGE0RU709816'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": "ConnectionAudit@1",
"value": {
"connection": "conn_5858d656",
"trail": [
{
"event": "connection.linked",
"at": "2026-08-10T00:00:00.000Z"
},
{
"event": "sync.completed",
"at": "2026-08-10T00:00:00.000Z",
"sync": "sync_53ed2cb1"
}
],
"evidenceCount": 3,
"products": [
"policy",
"coverage",
"thirdParties"
],
"auditedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"connection": "conn_5858d656",
"trail": [
{
"event": "connection.linked",
"at": "2026-08-10T00:00:00.000Z"
},
{
"event": "sync.completed",
"at": "2026-08-10T00:00:00.000Z",
"sync": "sync_53ed2cb1"
}
],
"evidenceCount": 3,
"products": [
"policy",
"coverage",
"thirdParties"
],
"auditedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
accessFee
connection.accessFee · POST /connections/access-fee · gate offer · sandbox · answers ConnectionAccessFee@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 — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.accessFeeAssessed@1 · Connection.failed@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.accessFee({"vin":"KM8R7DGE0RU709816"})curl -X POST https://apis.vin/connections/access-fee \
-H 'content-type: application/json' \
-d '{"vin":"KM8R7DGE0RU709816"}'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": "ConnectionAccessFee@1",
"value": {
"connection": "conn_5858d656",
"status": "assessed",
"accessFee": {
"amount": "1907",
"currency": "USD"
},
"period": "2026-08",
"provider": "acme-mutual",
"assessedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"connection": "conn_5858d656",
"status": "assessed",
"accessFee": {
"amount": "1907",
"currency": "USD"
},
"period": "2026-08",
"provider": "acme-mutual",
"assessedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
meteredPay
connection.meteredPay · POST /connections/metered-pay · gate offer · sandbox · answers ConnectionMeteredPay@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 — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.failed@1 · Connection.meteredPaid@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.meteredPay({"vin":"KM8R7DGE0RU709816"})curl -X POST https://apis.vin/connections/metered-pay \
-H 'content-type: application/json' \
-d '{"vin":"KM8R7DGE0RU709816"}'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": "ConnectionMeteredPay@1",
"value": {
"connection": "conn_5858d656",
"status": "paid",
"payment": "cpay_186dc519",
"calls": 568,
"unitPrice": {
"amount": "2",
"currency": "USD"
},
"amount": {
"amount": "1136",
"currency": "USD"
},
"period": "2026-08",
"paidAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"connection": "conn_5858d656",
"status": "paid",
"payment": "cpay_186dc519",
"calls": 568,
"unitPrice": {
"amount": "2",
"currency": "USD"
},
"amount": {
"amount": "1136",
"currency": "USD"
},
"period": "2026-08",
"paidAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
sync
connection.sync · POST /connections/sync · gate key · sandbox · answers Sync@1
| Field | Type | Required | Notes |
|---|---|---|---|
conn | string | yes | conn_… to pull through |
products | array<string> | no | what to pull (policy, odometer, balance, standing, …) |
vin | string | no | — |
authority | string | no | mnd_… — REQUIRED when the act spends/obligates (act:* scope with nonzero third-party price) |
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.synced@1 · Sync.completed@1 · Sync.failed@1 · Verification.posted@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.sync({"conn":"conn"})curl -X POST https://apis.vin/connections/sync \
-H 'content-type: application/json' \
-d '{"conn":"conn"}'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": "Sync@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
],
"sync": {
"status": "completed",
"id": "SYN-d28bcdad",
"at": "2026-08-10"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
],
"sync": {
"status": "completed",
"id": "SYN-d28bcdad",
"at": "2026-08-10"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connection-wire-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
},
"connect": {
"type": "OFFER",
"kind": "connect",
"reason": "CONNECTION_ABSENT",
"portClass": "connections-rail",
"state": "absent",
"url": "https://integrates.vin/connect/connections-rail",
"message": "connection.sync is live via connection — certified, connect to activate: complete the connections-rail link ceremony at https://integrates.vin/connect/connections-rail. The credential vault (auth.vin) holds the token, and the same call answers simulated:false — activation is the token, never a deploy."
}
}lastSync
connection.lastSync · GET /connections/last-sync · gate none · sandbox · answers ConnectionLastSync@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.lastSync({"vin":"KM8R7DGE0RU709816"})curl 'https://apis.vin/connections/last-sync?vin=KM8R7DGE0RU709816'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": "ConnectionLastSync@1",
"value": {
"connection": "conn_5858d656",
"lastSync": "sync_53ed2cb1",
"status": "completed",
"completedAt": "2026-08-10T00:00:00.000Z",
"evidenceCount": 3
},
"evidence": {
"connection": "conn_5858d656",
"lastSync": "sync_53ed2cb1",
"status": "completed",
"completedAt": "2026-08-10T00:00:00.000Z",
"evidenceCount": 3
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
authorize
connection.authorize · POST /connections/authorize · gate offer · sandbox · answers ConnectionAuthorize@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 — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.authorized@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.authorize({"vin":"KM8R7DGE0RU709816"})curl -X POST https://apis.vin/connections/authorize \
-H 'content-type: application/json' \
-d '{"vin":"KM8R7DGE0RU709816"}'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": "ConnectionAuthorize@1",
"value": {
"link": "link_51379549",
"status": "created",
"providerClass": "carrier",
"scopes": [
"read:policy",
"read:coverage"
],
"handoff": {
"outcome": "NEEDS_HUMAN",
"url": "https://auth.vin/link/9GQS-ZN54",
"shortUrl": "https://auth.vin/link/9GQS-ZN54",
"pollUrl": "https://apis.vin/connections/links/link_51379549",
"expiresAt": "2026-08-10T04:00:00.000Z",
"terminus": "account holder (authorize)"
}
},
"evidence": {
"link": "link_51379549",
"status": "created",
"providerClass": "carrier",
"scopes": [
"read:policy",
"read:coverage"
],
"handoff": {
"outcome": "NEEDS_HUMAN",
"url": "https://auth.vin/link/9GQS-ZN54",
"shortUrl": "https://auth.vin/link/9GQS-ZN54",
"pollUrl": "https://apis.vin/connections/links/link_51379549",
"expiresAt": "2026-08-10T04:00:00.000Z",
"terminus": "account holder (authorize)"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}revoke
connection.revoke · POST /connections/revoke · gate offer · sandbox · answers ConnectionRevoke@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 — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.revoked@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.revoke({"vin":"KM8R7DGE0RU709816"})curl -X POST https://apis.vin/connections/revoke \
-H 'content-type: application/json' \
-d '{"vin":"KM8R7DGE0RU709816"}'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": "ConnectionRevoke@1",
"value": {
"connection": "conn_5858d656",
"status": "revoked",
"revoked": true
},
"evidence": {
"connection": "conn_5858d656",
"status": "revoked",
"revoked": true
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
accounts
connection.accounts · GET /connections/accounts · gate key · sandbox · answers Connection@1
Promoted — earned its own page: /catalog/connection.accounts (computed on every regen: price posted + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
id | string | no | conn_… to read; omit to list the caller's connections |
action | string | no | one of read, list, revoke, health |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.degraded@1 · Connection.expired@1 · Connection.revoked@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.accounts({"id":"id","action":"read"})curl 'https://apis.vin/connections/accounts?id=id&action=read'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": "Connection@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
]
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connection-wire-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": true
}
}health
connection.health · GET /connections/health · gate key · sandbox · answers ConnectionHealth@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.health({"vin":"KM8R7DGE0RU709816"})curl 'https://apis.vin/connections/health?vin=KM8R7DGE0RU709816'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": "ConnectionHealth@1",
"value": {
"connection": "conn_5858d656",
"status": "active",
"healthy": true,
"lastRefreshedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"connection": "conn_5858d656",
"status": "active",
"healthy": true,
"lastRefreshedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}link
connection.link · POST /connections/link · gate human · sandbox · answers Link@1
| Field | Type | Required | Notes |
|---|---|---|---|
subject | string | yes | consumer/dealer/account party ref the link binds to |
vin | string | no | — |
provider | string | no | provider slug, optional; else provider_class picker in ceremony |
providerClass | string | no | one of oauth-native, credential-ceremony, licensed-api, aggregator, system |
scopes | array<string> | yes | read:/act: grants; granted ⊆ requested, only narrows |
webhook | string | no | — |
brand | string | no | white-label embed (B2A2D) |
expiresAt | string | no | format date-time |
The gate is a 403 NEEDS_HUMAN — the human verb authorize · demand side, routed to a named, staffed, priced terminus with a poll rail. Never a dead end. Price: not posted — see /pricing.
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.linked@1 · Link.created@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.link({"subject":"subject","scopes":[]})curl -X POST https://apis.vin/connections/link \
-H 'content-type: application/json' \
-d '{"subject":"subject","scopes":[]}'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": "Link@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
],
"link": {
"status": "already-linked",
"connId": "conn_c0f1966c"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "connection",
"asOf": "2026-08-10",
"connId": "conn_c0f1966c",
"status": "active",
"scopes": [
"read",
"pull",
"push"
],
"link": {
"status": "already-linked",
"connId": "conn_c0f1966c"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connection-wire-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
},
"connect": {
"type": "OFFER",
"kind": "connect",
"reason": "CONNECTION_ABSENT",
"portClass": "connections-rail",
"state": "absent",
"url": "https://integrates.vin/connect/connections-rail",
"message": "connection.link is live via connection — certified, connect to activate: complete the connections-rail link ceremony at https://integrates.vin/connect/connections-rail. The credential vault (auth.vin) holds the token, and the same call answers simulated:false — activation is the token, never a deploy."
}
}reconnect
connection.reconnect · POST /connections/reconnect · gate offer · sandbox · answers ConnectionReconnect@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 — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.reconnected@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.reconnect({"vin":"KM8R7DGE0RU709816"})curl -X POST https://apis.vin/connections/reconnect \
-H 'content-type: application/json' \
-d '{"vin":"KM8R7DGE0RU709816"}'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": "ConnectionReconnect@1",
"value": {
"connection": "conn_5858d656",
"priorStatus": "degraded",
"status": "active",
"reconnected": true,
"provider": "acme-mutual",
"kind": "consumer-carrier",
"reconnectedAt": "2026-08-10T00:00:00.000Z"
},
"evidence": {
"connection": "conn_5858d656",
"priorStatus": "degraded",
"status": "active",
"reconnected": true,
"provider": "acme-mutual",
"kind": "consumer-carrier",
"reconnectedAt": "2026-08-10T00:00:00.000Z"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refresh
connection.refresh · POST /connections/refresh · gate offer · sandbox · answers ConnectionRefresh@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 — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 — Connection.refreshed@1.
import { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.refresh({"vin":"KM8R7DGE0RU709816"})curl -X POST https://apis.vin/connections/refresh \
-H 'content-type: application/json' \
-d '{"vin":"KM8R7DGE0RU709816"}'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": "ConnectionRefresh@1",
"value": {
"connection": "conn_5858d656",
"sync": "sync_53ed2cb1",
"status": "completed",
"refreshedAt": "2026-08-10T00:00:00.000Z",
"products": [
"policy",
"coverage",
"thirdParties"
]
},
"evidence": {
"connection": "conn_5858d656",
"sync": "sync_53ed2cb1",
"status": "completed",
"refreshedAt": "2026-08-10T00:00:00.000Z",
"products": [
"policy",
"coverage",
"thirdParties"
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}scopes
connection.scopes · GET /connections/scopes · gate none · sandbox · answers ConnectionScopes@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — apis.vin serves this noun on its two routes: / (the landing) · /KM8R7DGE0RU709816 (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 { connection } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await connection.scopes({"vin":"KM8R7DGE0RU709816"})curl 'https://apis.vin/connections/scopes?vin=KM8R7DGE0RU709816'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": "ConnectionScopes@1",
"value": {
"connection": "conn_5858d656",
"scopes": [
"read:policy",
"read:coverage"
],
"kind": "consumer-carrier"
},
"evidence": {
"connection": "conn_5858d656",
"scopes": [
"read:policy",
"read:coverage"
],
"kind": "consumer-carrier"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "connections-rail-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.
Connection
Schema
| Property | Type | Notes |
|---|---|---|
connId | id | conn_ |
kind | enum | consumer-carrier|consumer-oem|consumer-lender|dealer-source|system |
provider | string | — |
holderId | ref→Party | — |
scopes | Scope[] | — |
credentialRef | ref→Credential | — |
status | ConnectionFSM | — |
properties | LinkedProp[] | vin + insured|authorized |
createdAt | datetime | — |
refreshedAt | datetime | — |
expiresAt | datetime | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
party | connection | 1:0..* | owns |
connection | credential | 1:1 | custody |
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 6 diagrams, rendered from the estate model.
Connection · Class model
Connection · State machine
Connection · Sequence
Connection · Class model
Connection · State machine
Connection · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.