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
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.
Draft. Publish. Gate.
Upload
Drop in the document exactly as legal shipped it — a PDF. Drafts get the next version number automatically and stay invisible to users.
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.
Gate
Your app calls /status with its own user id on sign-in. compliant: false → render the document, POST the acceptance, let them through.
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" }'