Skip to main content

Compliance

Sellable product

This capability is granted by an API key scoped to the `` product (product face). See the product reference below.

Data-subject-request + retention state-machine capability. The regulation-agnostic skeleton: the GDPR/CCPA request FSM (submit -> verify -> cooling_off -> process -> complete), the SLA/overdue tracker, the retention -tier taxonomy (HOT/WARM/COLD/ARCHIVE) + legal holds, and the Article-30 append-only processing log. The actual erasure/export/enforce runs PRODUCT-SIDE: when a request enters processing the service fans it out to the org's pre-registered handler via the webhook-egress capability, and the product calls back /complete. I4: own Postgres store, no product data, no callback URLs (webhook-egress owns the per-org handler registry).

  • Group: Governance & platform
  • Contract: contracts/compliance/v1/openapi.yaml
  • Public base: https://api.vagarylabs.com (the consolidated API gateway — one host, per-brand sibling api.<zone>)
  • Auth: a product API key (vgk_…) issued from the console — Authorization: Bearer vgk_…
  • Product face (customer-keyed):
    • https://api.vagarylabs.com/product/v1/compliance/requests

Endpoints

MethodPathSummary
POST/v1/compliance/requestsSubmit a data-subject request (erasure/export/access/rectification/consent)
GET/v1/compliance/requestsList the org's requests (filter by subject_ref / status / request_type)
GET/v1/compliance/overdueActive requests past their regulation's statutory response window (GDPR 30d / CCPA 45d)
GET/v1/compliance/requests/&#123;request_id&#125;One request's lifecycle state
POST/v1/compliance/requests/&#123;request_id&#125;/verifyConfirm the subject-verification token (pending -> cooling_off)
POST/v1/compliance/requests/&#123;request_id&#125;/processRun the erasure (cooling_off -> processing) — capability fan-out + product-handler dispatch
POST/v1/compliance/requests/&#123;request_id&#125;/completeProduct handler reports its local body done or failed (processing -> completed
POST/v1/compliance/requests/&#123;request_id&#125;/cancelCancel a pre-processing request (pending
POST/v1/compliance/requests/&#123;request_id&#125;/rejectReject a pre-processing request by policy/operator (pending
GET/v1/compliance/auditThe Article-30 append-only processing log (filter by request_id / subject_ref)
POST/v1/compliance/retention/policiesRegister/update a retention policy (HOT/WARM/COLD/ARCHIVE tier taxonomy)
GET/v1/compliance/retention/policiesThe org's retention policies
POST/v1/compliance/retention/dueSurface retention decisions for a subject (due/blocked/action) given product-supplied data ages
POST/v1/compliance/legal-holdsCreate a legal hold (fail-closed deletion block)
GET/v1/compliance/legal-holdsThe org's legal holds
POST/v1/compliance/legal-holds/&#123;hold_id&#125;/releaseRelease (deactivate) a legal hold
GET/v1/compliance/residency/regionsThe regions this deployment ACTUALLY serves (honest, non-aspirational)
PUT/v1/compliance/residencyPin this org's data to a region
GET/v1/compliance/residencyThis org's residency pin (pinned=false when none)
DELETE/v1/compliance/residencyRemove this org's residency pin
POST/v1/compliance/residency/checkTHE ENFORCEMENT SEAM — may this org's data be processed in this region?
GET/v1/compliance/trust-centerThe trust-center DATA source (honest by construction)
POST/v1/compliance/documents/&#123;kind&#125;/acceptClick-through self-sign a document (dpa
GET/v1/compliance/documents/acceptancesThis org's acceptance evidence, newest-first
GET/v1/compliance/documents/&#123;kind&#125;/currentThe newest acceptance of a kind ("has this org signed the DPA?")
GET/healthliveness
GET/metricsPrometheus

Schemas

CapabilityErasureResult

One capability's outcome in an erasure fan-out. matched is reported separately from deleted / pseudonymized so a zero-match is never readable as a successful erasure.

FieldTypeDescription
capabilitystringe.g. session-store, revenue-tracking
outcomestringerased/pseudonymized/zero_match/no_subject_data are SETTLED; the rest mean the subject's data may still be present and downgrade the run to partial.
dispositionstringpseudonymize = statutory-retention record, unlinked not deleted
matchedintegerrows matching the subject; null when the capability did not report it
deletedinteger
pseudonymizedintegerrows whose subject link was severed while the record was preserved
http_statusinteger
detailstringwhy — carries the evidence for no_subject_data / not_implemented

FanoutReport

The result of the in-cluster capability erasure fan-out. complete is the ONLY status that may advance the request toward a successful terminal state.

FieldTypeDescription
statusstringcomplete = every capability settled AND at least one matched. no_data_found = every capability clean but none matched (usually a wrong selector — NOT an erasure). partial = at least one capability unsettled. disabled = fan-out not enabled in this deployment.
reasonstring
capabilitiesarray
unsettledarraycapabilities that may still hold the subject data

Regulation

RequestType

Status

canonical superset (§27.6) — pending/cooling_off/processing/completed/failed/rejected/cancelled

SubmitRequest

FieldTypeDescription
organization_idstringproduct-tier tenant (I6) — verified against the token, never trusted alone
regulationobject
request_typeobject
subject_refstringOPAQUE product subject identifier (the product-tier user id) — never interpreted here
require_verificationbooleandefault true (fail-safe); when true the request sits in pending until /verify
detailsobjectOPAQUE product-owned metadata — stored, never interpreted (I4). ONE reserved key: selectors, read by the erasure fan-out (see POST .../process). subject_ref is the default for every scalar selector, so selectors is only needed when a capability keys the subject differently.

RequestRecord

FieldTypeDescription
request_idstring
organization_idstring
subject_refstring
regulationobject
request_typeobject
statusobject
require_verificationboolean
verification_tokenstringreturned ONCE at submit (never on GET) when require_verification — deliver to the subject out-of-band
detailsobject
dispatch_refstring
last_errorstring
created_atstring
cooling_off_started_atstring
processing_started_atstring
completed_atstring

AuditEvent

FieldTypeDescription
idinteger
request_idstring
actionstring
actorstring
subject_refstring
regulationstring
detailsobject
created_atstring

Generated by scripts/gen-capability-docs.py from contracts/compliance/v1/openapi.yaml — the contract IS the source of truth; edit the contract, not this page.