The consent layer your product plugs into.
Capture, version, prove and revoke consent and preferences — cookies included — through one API. An append-only vault, signed offline-verifiable receipts, and every event kept in the EU.
| Subject | Purpose | State | Version | Collected | Receipt |
|---|---|---|---|---|---|
| email:a.rivera@… | marketing_email | granted | v3 | 14:02:11 | rcpt_9f2… |
| external_id:u_4821 | analytics | denied | v1 | 14:02:07 | rcpt_1c8… |
| email:m.chen@… | marketing_email | withdrawn | v3 | 13:58:44 | rcpt_a41… |
| cookie_id:ck_77b | personalization | granted | v2 | 13:58:40 | rcpt_2d0… |
| email:s.k@… | data_sharing | expired | v2 | 13:51:19 | rcpt_e77… |
Consent is a data problem that never stops moving.
Proof, not just a boolean
A regulator asks what exactly did the user see, and when? That means an immutable record with the statement version, IP, timestamp — and a signature anyone can verify offline.
The framework keeps changing
GDPR, ePrivacy, LOPDGDD, CCPA, TCF revisions. Hard-coding any of it means a migration every time. Rules belong in data, evaluated at request time.
Cookies are their own project
Scanning a site, classifying every tracker, keeping the database current as trackers evolve. The classification problem alone took years to get right — and it never stops.
Append-only, with a signed receipt for every decision.
ConsentRecord rows are never updated — a change is a new row that supersedes the last. A materialized projection serves the hot read; the log is the truth.
- Ed25519 detached signatures, public JWKS, verify offline
- IP encrypted at rest, statement-hash in the proof
- Full timeline + one-click subject export
Versioned statements and a configurable preference center.
Publish a purpose version as DISPLAY_ONLY (notify) or RECONSENT_REQUIRED (treat prior consent as stale). Channels × topics, typed fields, JSON-logic dependency rules.
- Multi-locale legal text, frozen per version
- Your banner renders from
GET /v1/purposes— layout, theme and copy configurable in the console - Expiry windows, bulk reconsent campaigns, and A/B tests on banner copy and layout
Cascade classification: reference DB → heuristics → AI.
The first confident tier wins. Unknowns go to a per-site review queue; a confirmed classification promoted across tenants becomes a tier-1 hit for everyone.
- Human override is authoritative for that site
- Shared definition set grows with every review
GET /v1/cookiesfor the banner table
TCF v2.2, Consent Mode v2 and GPP — derived, not implemented.
Ask for a TC string, GPP usnat string, Google Additional Consent string, or a gtag('consent','update', …) object — all built from the subject's current state. The SDK's tag gate loads your scripts on grant and re-evaluates on change.
GET /v1/consent/tcstring·/google-consent-mode·/google-additional-consent·/gppGET /v1/tcf/vendor-list— serve the GVL to__tcfapiclients- Signed webhooks on every change, with retry + replay
Point Claude at your org. It only touches what a teammate could.
A remote MCP server backed by our own OAuth 2.1 authorization server — dynamic client registration, PKCE, a real consent screen. Every connection is bound to one organization and to the exact resources you approve: sites, purposes, webhooks, vault (read-only), cookies, banner, policies. No shared API key living in a bot's memory.
claude mcp add --transport http Croombit https://mcp.croombit.com/mcp- Ask it to add a purpose, check a subject's consent state, or queue a cookie scan — same API, same audit trail
- Per-route scopes, not a blanket grant — a new admin endpoint is unreachable by any token until it opts in
- Works with Claude.ai, Claude Desktop, and any MCP-compatible client
Everything a compliance suite does. None of the overhead.
| Traditional CMP | Croombit | |
|---|---|---|
| Model | A suite your team runs | An API you plug into |
| Proof of consent | A record in their system | Append-only vault + Ed25519 signed receipt |
| Regulatory framework | Template configuration | RuleSet in data (JSON-logic), no migrations |
| Cookies | Scanner + proprietary DB | Cascade DB → heuristics → AI + shared DB |
| TCF / Consent Mode | A separate module | Derived from the subject's state, one endpoint |
| Residency | Plan-dependent | Always EU |
| Integration | Tags + portal | npm i @croombit/sdk |
| AI-agent access | Not supported, or a manual export | MCP connector, OAuth 2.1 scoped like a teammate |
Indicative comparison against traditional consent management platforms.
Before you ask
Yes. It covers the same ground — cookie banner, IAB TCF v2.2, Google Consent Mode v2, cookie scanner — plus what those platforms don't offer natively: a real API-first design (not just a dashboard), an Ed25519 signed, offline-verifiable receipt for every consent event, and an MCP connector for AI agents.
No, and it's a common mix-up. Most of that content is about a human authorizing which tools an agent can use (the MCP connection's own OAuth permissions). Croombit solves the opposite problem: a real person's GDPR consent — cookies, marketing, etc. — exposed to an authorized agent, which acts with the exact same permissions as a teammate, never elevated access.
By consent events per month, pooled per organization — never by domain or site. Hobby is free up to 1,000 events/month. Growth adds a larger included quota and bills overage once on the monthly invoice, not as standalone charges per event block.
Always in the EU — database, compute and edge cache, no exceptions by plan.
Yes — native SDKs for iOS, Android and Flutter, and ready-made plugins for WordPress and Shopify, all talking to the same API and verifying the same signed receipt.
One tag. Or one API call. You decide.
<script data-tc-api-key="pk_…">— the banner in 30 seconds- Browser + Node SDK, or plain REST for full control
- Native SDKs for iOS, Android and Flutter — same contract, offline Ed25519 receipt verify
- Drop-in WordPress and Shopify plugins if you'd rather not touch code
- In-memory cache with ETag revalidation
- Idempotency-Key on every mutation
import { CroombitClient } from '@croombit/sdk';
const tc = new CroombitClient({ baseUrl: API_URL, apiKey: 'pk_live_…' });
await tc.recordConsent(
{ subject: 'email:user@example.com', purpose: 'marketing_email', state: 'GRANTED' },
{ idempotencyKey: crypto.randomUUID() },
);
// load analytics only after consent
await tc.gate('email:user@example.com', ['analytics'], () => loadAnalytics());Plug in the consent layer.
One vault, one source of truth, in the EU. One tag or one API call — your banner is live today.