API reference

Banners

Read, save and publish a domain's banner, and list the languages we ship text for.

  1. GET/v1/banner
  2. GET/v1/banner/fonts
  3. GET/v1/banner/locales
  4. GET/v1/banner/templates
  5. GET/v1/banner/{domainId}
  6. PUT/v1/banner/{domainId}
  7. POST/v1/banner/{domainId}/brand
  8. POST/v1/banner/{domainId}/describe
  9. POST/v1/banner/{domainId}/publish
GET/v1/banner

List every domain and its banner status (filterable)

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

Parameters
NameWhereTypeWhat it is
statusquery"published" | "draft"Publish state.
layoutquery"bar" | "modal" | "popup"Banner layout.
qquerystringCase-insensitive search over name + hostname.
Responses
StatusBodyWhen
200BannerSummaryDto[]
200 body · BannerSummaryDto[]
FieldTypeWhat it is
domainId requiredstring
hostname requiredstring
name requiredstring
published requiredboolean
publishedAt requiredstring | null
updatedAt requiredstring | null
layout required"bar" | "modal" | "popup"Layout and colours for the list thumbnail and preview (from the config).
accent requiredstring
background requiredstring
foreground requiredstring
geoMode required"custom" | "eea" | "all"
impressions requirednumberBanners shown and the consent rate over the last 30 days, for this domain. consentRate is null when nothing has been shown yet.
consentRate requirednumber | null
score requirednumberLive compliance score (0–100) for this domain's banner: the same score the Compliance screen and the Domains list show.
overAllowance requiredbooleanTrue when the workspace's plan does not cover this domain. Its banner is held unpublished, and publishing is refused until the plan allows more domains or another domain is removed.
GET/v1/banner/fonts

Fonts a banner may be set in

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

Responses
StatusBodyWhen
200string[]
GET/v1/banner/locales

Languages with built-in starter text

What the builder offers when adding a language, and the wording it pre-fills. Not a whitelist: any well-formed BCP-47 tag can be saved as a translation, this is only the set we ship text for.

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

Responses
StatusBodyWhen
200BannerLocaleDto[]
200 body · BannerLocaleDto[]
FieldTypeWhat it is
code requiredstringBCP-47 tag, e.g. de.
englishName requiredstringFor an operator reading the list in English.
nativeName requiredstringFor a customer picking their own market's language.
content requiredBannerTranslatedContentDtoStarter wording — a beginning, not a legal opinion. Editable like any other.
content.title requiredstring
content.description requiredstring
content.acceptLabel requiredstring
content.rejectLabel requiredstring
content.settingsLabel requiredstring
content.saveLabel requiredstring
content.policyUrlstringThis language's own policy page. Omitted = use the default language's.
categories requiredBannerCategoryTextDto[]
categories[].id required"necessary" | "analytics" | "marketing" | "preferences"
categories[].label requiredstring
categories[].description requiredstring
optOut requiredBannerOptOutDtoStarter wording for the US opt-out notice in this language.
optOut.title requiredstring
optOut.description requiredstring
optOut.optOutLabel requiredstringThe prominent action. Denies every sale/share category at once.
optOut.dismissLabel requiredstringDismiss without changing anything — processing continues, lawfully.
optOut.linkLabel requiredstringThe persistent link, which is the part the law actually requires. It stays on the page after the notice is gone, which is why it is not a banner label.
notice requiredBannerNoticeDtoStarter label for the rest-of-world notice's one button.
notice.dismissLabel requiredstring
GET/v1/banner/templates

Ten banners to start from

Every one of them publishes with zero hard blocks and zero warnings, in every language it ships. Applying one is an ordinary config save.

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

Responses
StatusBodyWhen
200TemplateDto[]
200 body · TemplateDto[]
FieldTypeWhat it is
id requiredstring
name requiredstring
summary requiredstring
tone requiredstring
config requiredBannerConfigDto
config.content requiredBannerContentDto
config.style requiredBannerStyleDto
config.targeting requiredBannerTargetingDto
config.behavior requiredBannerBehaviorDto
config.categories requiredBannerCategoryDto[]
config.cookieDomainstringRoot domain for sharing the consent cookie across subdomains, e.g. .example.com. Must be a hostname.
config.hideBrandingbooleanHide the "Powered by CMPStack" mark. Requires a plan that includes it; saving it on another plan returns 409.
config.optOutBannerOptOutDtoThe US opt-out notice's wording, shown only to visitors under the US opt-out rules. When it is absent, default wording is used.
config.noticeBannerNoticeDtoThe rest-of-world notice's button. Optional; defaults to "OK".
config.customCssstringCustom CSS for the banner. Requires a plan that includes custom CSS. Its length and content are checked when it is saved and again when it is served.
config.blockingBlockingRuleDto[]Third-party scripts held back until their category is allowed. At most 60.
config.vitalsbooleanMeasure real-user performance on this site: LCP, INP and CLS per page view. Off unless switched on, because it loads one more small file on the visitor's page.
config.defaultLocalestringThe language content and categories are written in, and the one shown to any visitor whose language has no translation. Absent means en.
config.translationsBannerTranslationDto[]The same banner in other languages, at most 40. The default language is not repeated here: it is content, and a translation for it is refused.
review requiredConfigReviewDto
review.blocks requiredstring[]Rules that would refuse a publish.
review.warnings requiredstring[]Rules that would lower the score.
GET/v1/banner/{domainId}

Get a domain's banner config (defaults if unconfigured)

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

Parameters
NameWhereTypeWhat it is
domainId requiredpathstring
Responses
StatusBodyWhen
200BannerConfigResponseDto
200 body · BannerConfigResponseDto
FieldTypeWhat it is
domainId requiredstring
hostname requiredstring
name requiredstring
published requiredbooleanTrue once the draft has been published at least once.
publishedAt requiredstring | nullISO timestamp of the last publish, or null if never published.
updatedAt requiredstringISO timestamp of the last draft save.
config requiredBannerConfigDtoThe working draft the builder edits.
config.content requiredBannerContentDto
config.style requiredBannerStyleDto
config.targeting requiredBannerTargetingDto
config.behavior requiredBannerBehaviorDto
config.categories requiredBannerCategoryDto[]
config.cookieDomainstringRoot domain for sharing the consent cookie across subdomains, e.g. .example.com. Must be a hostname.
config.hideBrandingbooleanHide the "Powered by CMPStack" mark. Requires a plan that includes it; saving it on another plan returns 409.
config.optOutBannerOptOutDtoThe US opt-out notice's wording, shown only to visitors under the US opt-out rules. When it is absent, default wording is used.
config.noticeBannerNoticeDtoThe rest-of-world notice's button. Optional; defaults to "OK".
config.customCssstringCustom CSS for the banner. Requires a plan that includes custom CSS. Its length and content are checked when it is saved and again when it is served.
config.blockingBlockingRuleDto[]Third-party scripts held back until their category is allowed. At most 60.
config.vitalsbooleanMeasure real-user performance on this site: LCP, INP and CLS per page view. Off unless switched on, because it loads one more small file on the visitor's page.
config.defaultLocalestringThe language content and categories are written in, and the one shown to any visitor whose language has no translation. Absent means en.
config.translationsBannerTranslationDto[]The same banner in other languages, at most 40. The default language is not repeated here: it is content, and a translation for it is refused.
PUT/v1/banner/{domainId}

Save a domain's banner draft

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

Parameters
NameWhereTypeWhat it is
domainId requiredpathstring
Request body · UpdateBannerDto
FieldTypeWhat it is
namestring
config requiredBannerConfigDto
config.content requiredBannerContentDto
config.style requiredBannerStyleDto
config.targeting requiredBannerTargetingDto
config.behavior requiredBannerBehaviorDto
config.categories requiredBannerCategoryDto[]
config.cookieDomainstringRoot domain for sharing the consent cookie across subdomains, e.g. .example.com. Must be a hostname.
config.hideBrandingbooleanHide the "Powered by CMPStack" mark. Requires a plan that includes it; saving it on another plan returns 409.
config.optOutBannerOptOutDtoThe US opt-out notice's wording, shown only to visitors under the US opt-out rules. When it is absent, default wording is used.
config.noticeBannerNoticeDtoThe rest-of-world notice's button. Optional; defaults to "OK".
config.customCssstringCustom CSS for the banner. Requires a plan that includes custom CSS. Its length and content are checked when it is saved and again when it is served.
config.blockingBlockingRuleDto[]Third-party scripts held back until their category is allowed. At most 60.
config.vitalsbooleanMeasure real-user performance on this site: LCP, INP and CLS per page view. Off unless switched on, because it loads one more small file on the visitor's page.
config.defaultLocalestringThe language content and categories are written in, and the one shown to any visitor whose language has no translation. Absent means en.
config.translationsBannerTranslationDto[]The same banner in other languages, at most 40. The default language is not repeated here: it is content, and a translation for it is refused.
Responses
StatusBodyWhen
200BannerConfigResponseDto
200 body · BannerConfigResponseDto
FieldTypeWhat it is
domainId requiredstring
hostname requiredstring
name requiredstring
published requiredbooleanTrue once the draft has been published at least once.
publishedAt requiredstring | nullISO timestamp of the last publish, or null if never published.
updatedAt requiredstringISO timestamp of the last draft save.
config requiredBannerConfigDtoThe working draft the builder edits.
config.content requiredBannerContentDto
config.style requiredBannerStyleDto
config.targeting requiredBannerTargetingDto
config.behavior requiredBannerBehaviorDto
config.categories requiredBannerCategoryDto[]
config.cookieDomainstringRoot domain for sharing the consent cookie across subdomains, e.g. .example.com. Must be a hostname.
config.hideBrandingbooleanHide the "Powered by CMPStack" mark. Requires a plan that includes it; saving it on another plan returns 409.
config.optOutBannerOptOutDtoThe US opt-out notice's wording, shown only to visitors under the US opt-out rules. When it is absent, default wording is used.
config.noticeBannerNoticeDtoThe rest-of-world notice's button. Optional; defaults to "OK".
config.customCssstringCustom CSS for the banner. Requires a plan that includes custom CSS. Its length and content are checked when it is saved and again when it is served.
config.blockingBlockingRuleDto[]Third-party scripts held back until their category is allowed. At most 60.
config.vitalsbooleanMeasure real-user performance on this site: LCP, INP and CLS per page view. Off unless switched on, because it loads one more small file on the visitor's page.
config.defaultLocalestringThe language content and categories are written in, and the one shown to any visitor whose language has no translation. Absent means en.
config.translationsBannerTranslationDto[]The same banner in other languages, at most 40. The default language is not repeated here: it is content, and a translation for it is refused.
POST/v1/banner/{domainId}/brand

Read colours, a font and a logo off the domain's own home page

Fetched by our server with the same protections as domain verification, and only where robots.txt allows it. Only a suggestion: nothing is applied or published.

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

Parameters
NameWhereTypeWhat it is
domainId requiredpathstring
Responses
StatusBodyWhen
200BrandSuggestionDto
200 body · BrandSuggestionDto
FieldTypeWhat it is
accentstring | null
backgroundstring | null
foregroundstring | null
fontstring | null
logostring | nullFor the preview only. Never rendered into a published banner.
sources requiredobjectWhere each value came from, so a customer can disagree with a reason.
reasonstring | nullWhy nothing could be read, when nothing could.
POST/v1/banner/{domainId}/describe

Describe how the banner should look, and get a previewable change

Style only — never wording, which is the part with legal consequences. The answer is checked against the banner rules and the publish checks before it is returned, and it is labelled as generated.

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

Parameters
NameWhereTypeWhat it is
domainId requiredpathstring
Request body · DescribeBannerDto
FieldTypeWhat it is
description requiredstringHow the banner should look, in your own words. Style only — the wording is never changed, because that is the part with legal consequences. Example: "warm and minimal, matching our navy brand, not too shouty"
Responses
StatusBodyWhen
200StyleProposalDto
503—No provider is configured, or it declined
200 body · StyleProposalDto
FieldTypeWhat it is
style requiredobjectThe style fields to change.
rationale requiredstringOne sentence on what was read from the description.
generated requiredbooleanAlways true. Shown as generated wherever it appears.
review requiredConfigReviewDtoWhat the change would mean at publish.
review.blocks requiredstring[]Rules that would refuse a publish.
review.warnings requiredstring[]Rules that would lower the score.
POST/v1/banner/{domainId}/publish

Publish the current draft, so visitors are shown it

Refused with 422 when the draft fails a hard-block compliance rule — no Reject button, pre-selected optional categories, no granular choice, scroll-as-consent. The body carries rule, field, fix and every blocked rule so the builder can take the customer to what needs changing. The draft is untouched.

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

Parameters
NameWhereTypeWhat it is
domainId requiredpathstring
Responses
StatusBodyWhen
201BannerConfigResponseDto
422—The draft fails a hard-block compliance rule
201 body · BannerConfigResponseDto
FieldTypeWhat it is
domainId requiredstring
hostname requiredstring
name requiredstring
published requiredbooleanTrue once the draft has been published at least once.
publishedAt requiredstring | nullISO timestamp of the last publish, or null if never published.
updatedAt requiredstringISO timestamp of the last draft save.
config requiredBannerConfigDtoThe working draft the builder edits.
config.content requiredBannerContentDto
config.style requiredBannerStyleDto
config.targeting requiredBannerTargetingDto
config.behavior requiredBannerBehaviorDto
config.categories requiredBannerCategoryDto[]
config.cookieDomainstringRoot domain for sharing the consent cookie across subdomains, e.g. .example.com. Must be a hostname.
config.hideBrandingbooleanHide the "Powered by CMPStack" mark. Requires a plan that includes it; saving it on another plan returns 409.
config.optOutBannerOptOutDtoThe US opt-out notice's wording, shown only to visitors under the US opt-out rules. When it is absent, default wording is used.
config.noticeBannerNoticeDtoThe rest-of-world notice's button. Optional; defaults to "OK".
config.customCssstringCustom CSS for the banner. Requires a plan that includes custom CSS. Its length and content are checked when it is saved and again when it is served.
config.blockingBlockingRuleDto[]Third-party scripts held back until their category is allowed. At most 60.
config.vitalsbooleanMeasure real-user performance on this site: LCP, INP and CLS per page view. Off unless switched on, because it loads one more small file on the visitor's page.
config.defaultLocalestringThe language content and categories are written in, and the one shown to any visitor whose language has no translation. Absent means en.
config.translationsBannerTranslationDto[]The same banner in other languages, at most 40. The default language is not repeated here: it is content, and a translation for it is refused.

Next groupConsent records