terms
Consent, versioned

Your terms change.
Who accepted what?

Draft, version, and publish your Terms & Conditions and Privacy Policy in one workspace. Your application asks one question per sign-in — has this user accepted the latest version? — and records the click when they do. Every acceptance is an immutable audit record.

public endpoints
5
public endpoints
question per sign-in
1
question per sign-in
webhooks needed
0
webhooks needed
audit trail
100%
audit trail
Terms & Conditions
v2 published · tue
maya.lindqvist
accepted v2 · tue evening
signs straight in
jonas.beck
accepted v1 · four months ago
sees the new terms first
wed, 09:02 — both sign in · GET /api/v1/status decides
01Why

A PDF in a repo is not a consent record.

very product ships terms. Almost none can answer the question that actually matters later: which version did this specific user agree to, and when? The document lives in a repo, the checkbox lives in the signup form, and the connection between them evaporates the day legal ships an update.

terms keeps the document, its versions, and every user's acceptances in one place. Publishing v2 automatically makes everyone who only accepted v1 non-compliant — your app finds out on their next sign-in, shows the new text, and records the click. No migration, no webhook, no backfill.

02How

Draft. Publish. Gate.

01

Upload

Drop in the document exactly as legal shipped it — a PDF. Drafts get the next version number automatically and stay invisible to users.

02

Publish

One click makes it the latest-and-greatest. The file is pinned to an immutable URL; published versions can never be edited or deleted.

03

Gate

Your app calls /status with its own user id on sign-in. compliant: false → render the document, POST the acceptance, let them through.

03API

The whole integration is three calls.

Authenticate with a workspace API key. Your user ids stay yours — we never see your auth system. Acceptances are idempotent, so retries are safe by construction.

# 1 · Is user "b121bcd" up to date?
curl -H "Authorization: Bearer tk_..." \
  "https://terms.example.com/api/v1/status?userId=b121bcd"
# → { "compliant": false,
#     "documents": [ { "slug": "terms",
#                      "latestVersion": 2,
#                      "acceptedVersion": 1,
#                      "upToDate": false } ] }

# 2 · Show them the latest version (the PDF itself)…
curl -H "Authorization: Bearer tk_..." \
  "https://terms.example.com/api/v1/documents/terms"
# → { "version": { "version": 2, "fileUrl": "https://…/terms/v2.pdf" } }

# 3 · …and record the click on "Accept".
curl -X POST "https://terms.example.com/api/v1/acceptances" \
  -H "Authorization: Bearer tk_..." \
  -H "Content-Type: application/json" \
  -d '{ "userId": "b121bcd", "document": "terms" }'