docs.vin

approval

The approval noun — identity, lifecycle, events, and every capability as an anchored section: 12 capabilities, 0 live, 12 sandbox, 0 declared.

approval is one of the estate's 317 automotive nouns — a job a car needs done. It carries 12 capabilities: 0 live, 12 sandbox, 0 declared · doors aggregator.vin.

Identity

Nounapproval
PillarServices (facets: 3 data · 6 services · 3 commerce)
Capabilities12 — 0 live · 12 sandbox · 0 declared
EntitiesEstimate
Doorsaggregator.vin
SDKVin.approval.* from apis.vin
Address/catalog/approval#{action} — the anchor IS the wire name minus approval.

Events

The vocabulary this noun can append to the record — 20 past-tense, versioned event types, each linked to the capability that emits it:

Discover & read

history

approval.history · GET /approvals/history · gate none · sandbox · answers ApprovalHistory@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1G1FG1R79G0181145 (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 — approval.history
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.history({"vin":"1G1FG1R79G0181145"})
GET /approvals/history
curl 'https://apis.vin/approvals/history?vin=1G1FG1R79G0181145'

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:07.630Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalHistory@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "events": [
      {
        "date": "2026-08-01",
        "kind": "estimate-built",
        "id": "EST-a436637f"
      }
    ]
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "events": [
      {
        "date": "2026-08-01",
        "kind": "estimate-built",
        "id": "EST-a436637f"
      }
    ]
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

status

approval.status · GET /approvals/status · gate none · sandbox · answers ApprovalStatus@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1G1FG1R79G0181145 (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 — approval.status
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.status({"vin":"1G1FG1R79G0181145"})
GET /approvals/status
curl 'https://apis.vin/approvals/status?vin=1G1FG1R79G0181145'

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:07.671Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalStatus@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "approval": {
      "id": "EST-a436637f",
      "stance": "Built",
      "totalCents": 199041,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "approval": {
      "id": "EST-a436637f",
      "stance": "Built",
      "totalCents": 199041,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Apply & book

request

approval.request · POST /approvals/request · gate offer · sandbox · answers ApprovalRequest@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.requestRequested@1 · Approval.requested@1.

the SDK — approval.request
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.request({"vin":"1G1FG1R79G0181145"})
POST /approvals/request
curl -X POST https://apis.vin/approvals/request \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.671Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalRequest@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "request": {
      "status": "requested",
      "id": "EST-a436637f",
      "requestedOf": "Ava Good",
      "amountCents": 199041,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "request": {
      "status": "requested",
      "id": "EST-a436637f",
      "requestedOf": "Ava Good",
      "amountCents": 199041,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

pay

approval.pay · POST /approvals/pay · gate offer · sandbox · answers ApprovalPay@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.paid@1 · Approval.payFailed@1 · Approval.payRequested@1.

the SDK — approval.pay
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.pay({"vin":"1G1FG1R79G0181145"})
POST /approvals/pay
curl -X POST https://apis.vin/approvals/pay \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.630Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalPay@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "payment": {
      "status": "refused",
      "reason": "nothing-approved-to-pay",
      "id": "EST-a436637f",
      "stance": "Built"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "payment": {
      "status": "refused",
      "reason": "nothing-approved-to-pay",
      "id": "EST-a436637f",
      "stance": "Built"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

deposit

approval.deposit · POST /approvals/deposit · gate offer · sandbox · answers ApprovalDeposit@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.depositRequested@1 · Approval.deposited@1.

the SDK — approval.deposit
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.deposit({"vin":"1G1FG1R79G0181145"})
POST /approvals/deposit
curl -X POST https://apis.vin/approvals/deposit \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.630Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalDeposit@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "deposit": {
      "id": "ED-70c6c4d9",
      "amountCents": 19904,
      "currency": "USD",
      "status": "held"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "deposit": {
      "id": "ED-70c6c4d9",
      "amountCents": 19904,
      "currency": "USD",
      "status": "held"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

authorizeCharge

approval.authorizeCharge · POST /approvals/authorize-charge · gate offer · sandbox · answers ApprovalAuthorizeCharge@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.authorizeChargeRequested@1 · Approval.authorizeCharged@1.

the SDK — approval.authorizeCharge
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.authorizeCharge({"vin":"1G1FG1R79G0181145"})
POST /approvals/authorize-charge
curl -X POST https://apis.vin/approvals/authorize-charge \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.629Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalAuthorizeCharge@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "authorization": {
      "status": "refused",
      "reason": "nothing-approved-to-authorize",
      "id": "EST-a436637f",
      "stance": "Built"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "authorization": {
      "status": "refused",
      "reason": "nothing-approved-to-authorize",
      "id": "EST-a436637f",
      "stance": "Built"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Fulfill & operate

remind

approval.remind · POST /approvals/remind · gate offer · sandbox · answers ApprovalRemind@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.remindRequested@1 · Approval.reminded@1.

the SDK — approval.remind
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.remind({"vin":"1G1FG1R79G0181145"})
POST /approvals/remind
curl -X POST https://apis.vin/approvals/remind \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.666Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalRemind@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "reminder": {
      "status": "reminded",
      "id": "EST-a436637f",
      "to": "Ava Good",
      "channel": "email"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "reminder": {
      "status": "reminded",
      "id": "EST-a436637f",
      "to": "Ava Good",
      "channel": "email"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

send

approval.send · POST /approvals/send · gate offer · sandbox · answers ApprovalSend@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.sendRequested@1 · Approval.sent@1.

the SDK — approval.send
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.send({"vin":"1G1FG1R79G0181145"})
POST /approvals/send
curl -X POST https://apis.vin/approvals/send \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.671Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalSend@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "delivery": {
      "id": "EST-a436637f",
      "to": "Ava Good",
      "channel": "email",
      "status": "sent"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "delivery": {
      "id": "EST-a436637f",
      "to": "Ava Good",
      "channel": "email",
      "status": "sent"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Authorize & resolve

decline

approval.decline · POST /approvals/decline · gate offer · sandbox · answers ApprovalDecline@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.declineRequested@1 · Approval.declined@1.

the SDK — approval.decline
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.decline({"vin":"1G1FG1R79G0181145"})
POST /approvals/decline
curl -X POST https://apis.vin/approvals/decline \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.630Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalDecline@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "decline": {
      "status": "declined",
      "id": "EST-a436637f"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "decline": {
      "status": "declined",
      "id": "EST-a436637f"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

threshold

approval.threshold · GET /approvals/threshold · gate none · sandbox · answers ApprovalThreshold@1

FieldTypeRequiredNotes
vinstringno

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /1G1FG1R79G0181145 (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 — approval.threshold
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.threshold({"vin":"1G1FG1R79G0181145"})
GET /approvals/threshold
curl 'https://apis.vin/approvals/threshold?vin=1G1FG1R79G0181145'

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:07.671Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalThreshold@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "threshold": {
      "thresholdCents": 100000,
      "currency": "USD",
      "totalCents": 199041,
      "requiresApproval": true
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "threshold": {
      "thresholdCents": 100000,
      "currency": "USD",
      "totalCents": 199041,
      "requiresApproval": true
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

captureSignature

approval.captureSignature · POST /approvals/capture-signature · gate offer · sandbox · answers ApprovalCaptureSignature@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.captureSignatureRequested@1 · Approval.signatureCaptured@1.

the SDK — approval.captureSignature
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.captureSignature({"vin":"1G1FG1R79G0181145"})
POST /approvals/capture-signature
curl -X POST https://apis.vin/approvals/capture-signature \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.629Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalCaptureSignature@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "signature": {
      "status": "no-decision-to-sign",
      "id": "EST-a436637f",
      "stance": "Built"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "signature": {
      "status": "no-decision-to-sign",
      "id": "EST-a436637f",
      "stance": "Built"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

record

approval.record · POST /approvals/record · gate offer · sandbox · answers ApprovalRecord@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) · /1G1FG1R79G0181145 (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.

EmitsApproval.recordFailed@1 · Approval.recordRequested@1 · Approval.recorded@1.

the SDK — approval.record
import { approval } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await approval.record({"vin":"1G1FG1R79G0181145"})
POST /approvals/record
curl -X POST https://apis.vin/approvals/record \
  -H 'content-type: application/json' \
  -d '{"vin":"1G1FG1R79G0181145"}'

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:07.630Z · HTTP 200
{
  "type": "OK",
  "answers": "ApprovalRecord@1",
  "value": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "approval": {
      "status": "approved",
      "id": "EST-a436637f",
      "approvedCents": 199041,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "1G1FG1R79G0181145",
    "noun": "approval",
    "asOf": "2026-08-10",
    "approval": {
      "status": "approved",
      "id": "EST-a436637f",
      "approvedCents": 199041,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "desk-band-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.

Estimate

Modeled

The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 2 diagrams, rendered from the estate model.

Approval · Class model

Approval · State machine


Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.