API reference

Integrations

API keys, webhooks and the integration catalogue.

  1. GET/v1/api-keys
  2. POST/v1/api-keys
  3. DELETE/v1/api-keys/{id}
  4. GET/v1/integrations
  5. DELETE/v1/integrations/{key}
  6. PUT/v1/integrations/{key}
  7. POST/v1/integrations/{key}/verify
  8. DELETE/v1/webhooks
  9. GET/v1/webhooks
  10. PUT/v1/webhooks
  11. POST/v1/webhooks/rotate
GET/v1/api-keys

API keys for this workspace

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Responses
StatusBodyWhen
200ApiKeyDto[]
200 body · ApiKeyDto[]
FieldTypeWhat it is
id requiredstring
name requiredstring
prefix requiredstringThe first few characters, to tell keys apart.
createdAt requiredstring
lastUsedAtstring | null
revokedAtstring | nullRevoked keys stop working instantly but stay listed — a key that read consent records is part of the answer to "who saw this".
POST/v1/api-keys

Create an API key

The key is returned here and is unrecoverable afterwards.

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Request body · CreateApiKeyDto
FieldTypeWhat it is
name requiredstringExample: "Data warehouse sync"
Responses
StatusBodyWhen
200CreatedApiKeyDto
200 body · CreatedApiKeyDto
FieldTypeWhat it is
id requiredstring
name requiredstring
prefix requiredstringThe first few characters, to tell keys apart.
createdAt requiredstring
lastUsedAtstring | null
revokedAtstring | nullRevoked keys stop working instantly but stay listed — a key that read consent records is part of the answer to "who saw this".
key requiredstringThe key. Shown once and unrecoverable afterwards.
DELETE/v1/api-keys/{id}

Revoke a key

Revoked, not deleted: a key that was used to read consent records is part of the answer to "who saw this".

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
id requiredpathstring
Responses
StatusBodyWhen
204—
GET/v1/integrations

Integrations, with whether each is connected and working

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
categoryquery"Install" | "Tag Management" | "Analytics" | "Advertising" | "Data / Tagging" | "Developer / API"
statusquery"ok" | "warn" | "off"
kindquery"signal" | "gated" | "platform" | "api"
qquerystring
Responses
StatusBodyWhen
200IntegrationsListDto
200 body · IntegrationsListDto
FieldTypeWhat it is
connected requirednumberConnected AND live — a card that does nothing is never counted as connected.
warnings requirednumber
total requirednumber
items requiredIntegrationStateDto[]
items[].key requiredstring
items[].name requiredstring
items[].category requiredstring
items[].kind required"platform" | "api" | "signal" | "gated"How this vendor is handled — signal (we speak its consent API), gated (its script is blocked until consent), platform (an install route) or api (one of our own outbound surfaces). The panel groups by this, because a Connect button means something different in each case.
items[].availability required"live" | "planned"live when code acts on it today; planned when nothing does yet.
items[].summary requiredstringOne line saying what actually happens.
items[].connectable requiredbooleanFalse for anything that cannot be connected — every platform and planned.
items[].enabled requiredboolean
items[].status requiredstringoff | ok | warn
items[].mode requiredstring | null
items[].config requiredobject
items[].connectedAt requiredstring | null
gatedVendors requiredGatedVendorDto[]Vendors covered by tag gating rather than by a card. Listed so the page can say "these are handled, here is how" instead of showing fifteen dead Connect buttons.
gatedVendors[].name requiredstring
gatedVendors[].category required"marketing" | "preferences" | "analytics"The consent category its script belongs to.
gatedVendors[].match requiredstringA substring of its script URL, offered as a starting blocking pattern.
DELETE/v1/integrations/{key}

Disconnect an integration

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
key requiredpathstring
Responses
StatusBodyWhen
204—
PUT/v1/integrations/{key}

Connect / configure an integration

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
key requiredpathstring
Request body · UpdateIntegrationDto
FieldTypeWhat it is
enabledboolean
modestring
configobject
Responses
StatusBodyWhen
200IntegrationStateDto
200 body · IntegrationStateDto
FieldTypeWhat it is
key requiredstring
name requiredstring
category requiredstring
kind required"platform" | "api" | "signal" | "gated"How this vendor is handled — signal (we speak its consent API), gated (its script is blocked until consent), platform (an install route) or api (one of our own outbound surfaces). The panel groups by this, because a Connect button means something different in each case.
availability required"live" | "planned"live when code acts on it today; planned when nothing does yet.
summary requiredstringOne line saying what actually happens.
connectable requiredbooleanFalse for anything that cannot be connected — every platform and planned.
enabled requiredboolean
status requiredstringoff | ok | warn
mode requiredstring | null
config requiredobject
connectedAt requiredstring | null
POST/v1/integrations/{key}/verify

Re-verify an integration

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Parameters
NameWhereTypeWhat it is
key requiredpathstring
Responses
StatusBodyWhen
200IntegrationStateDto
200 body · IntegrationStateDto
FieldTypeWhat it is
key requiredstring
name requiredstring
category requiredstring
kind required"platform" | "api" | "signal" | "gated"How this vendor is handled — signal (we speak its consent API), gated (its script is blocked until consent), platform (an install route) or api (one of our own outbound surfaces). The panel groups by this, because a Connect button means something different in each case.
availability required"live" | "planned"live when code acts on it today; planned when nothing does yet.
summary requiredstringOne line saying what actually happens.
connectable requiredbooleanFalse for anything that cannot be connected — every platform and planned.
enabled requiredboolean
status requiredstringoff | ok | warn
mode requiredstring | null
config requiredobject
connectedAt requiredstring | null
DELETE/v1/webhooks

Stop sending consent decisions anywhere

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Responses
StatusBodyWhen
204—
GET/v1/webhooks

The consent webhook for this workspace, if there is one

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Responses
StatusBodyWhen
200WebhookDto
200 body · WebhookDto
FieldTypeWhat it is
url requiredstring
mode required"all" | "granted-only" | "revoked-only"
enabled requiredboolean
lastStatusnumber | null
lastErrorstring | null
lastAttemptAtstring | null
lastSuccessAtstring | null
failures requirednumberConsecutive failures. Delivery stops once it hits the cap.
stopped requiredbooleanTrue when delivery has given up and needs attention.
PUT/v1/webhooks

Point the consent webhook somewhere

The signing secret comes back on the FIRST save only, and never again. HTTPS-only, and private addresses are refused — this value makes the server issue an outbound request to wherever it points.

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Request body · UpsertWebhookDto
FieldTypeWhat it is
url requiredstringExample: "https://example.com/hooks/cmpstack"
mode"all" | "granted-only" | "revoked-only"Which decisions are worth sending. granted-only and revoked-only exist so a customer syncing a suppression list is not woken by decisions that do not change it.
enabledboolean
Responses
StatusBodyWhen
200WebhookSecretDto
200 body · WebhookSecretDto
FieldTypeWhat it is
url requiredstring
mode required"all" | "granted-only" | "revoked-only"
enabled requiredboolean
lastStatusnumber | null
lastErrorstring | null
lastAttemptAtstring | null
lastSuccessAtstring | null
failures requirednumberConsecutive failures. Delivery stops once it hits the cap.
stopped requiredbooleanTrue when delivery has given up and needs attention.
secret requiredstringThe HMAC signing key. Shown once and never returned again — store it now.
POST/v1/webhooks/rotate

Issue a new signing secret; the old one stops immediately

Needs: A signed-in panel session, sent as Authorization: Bearer <access token>.

Responses
StatusBodyWhen
200WebhookSecretDto
200 body · WebhookSecretDto
FieldTypeWhat it is
url requiredstring
mode required"all" | "granted-only" | "revoked-only"
enabled requiredboolean
lastStatusnumber | null
lastErrorstring | null
lastAttemptAtstring | null
lastSuccessAtstring | null
failures requirednumberConsecutive failures. Delivery stops once it hits the cap.
stopped requiredbooleanTrue when delivery has given up and needs attention.
secret requiredstringThe HMAC signing key. Shown once and never returned again — store it now.

Next groupMembers