Ir al contenido

Integración del SDK de JavaScript (cliente)

El SDK de HashEntry CMP es un script sin dependencias que muestra el banner de cookies, bloquea los scripts que usted etiqueta hasta que el visitante los permite y registra cada decisión en el servidor de HashEntry. También puede registrar aprobaciones de documentos (términos, contratos, políticas); consulte Aprobación y firma de documentos.

Esta página describe lo que el SDK hace actualmente. Cuando un comportamiento depende de un ajuste del panel o de su propio marcado, se indica expresamente.


<head>
<script
src="https://tool.hashentry.com/cmp.js"
data-site="YOUR_SITE_API_KEY"
async
></script>
</head>

El SDK carga desde el servidor la configuración vinculada a su clave API (diseño del banner, textos, categorías, documentos, ajustes de comportamiento) y decide si este visitante necesita ver un banner.

Deben cumplirse dos condiciones para que una decisión sobre cookies pueda registrarse en el servidor:

  1. El sitio está verificado en el panel. Las solicitudes de un sitio no verificado se rechazan con 403 SITE_NOT_VERIFIED.
  2. El sitio tiene asociado un documento de política de cookies. Consulte la sección siguiente.

Se requiere un documento de política de cookies

Sección titulada «Se requiere un documento de política de cookies»

Un consentimiento de cookies solo se registra si hace referencia a la versión activa exacta de un documento de tipo cookie_policy asociado al sitio. La versión de la política aceptada forma parte de la evidencia, por lo que el SDK no flexibiliza esta regla.

  • Si no hay ninguna política de cookies publicada asociada, el SDK no muestra el banner (ni el widget ni el enlace «Do Not Sell») y mantiene bloqueados, en todas las regiones, todos los scripts no esenciales etiquetados: no se recoge una elección que no puede registrarse como prueba. Los eventos consent:error y error se emiten con code: "COOKIE_POLICY_MISSING" y el error se escribe en la consola del navegador. CMP.accept() / CMP.reject() se resuelven con success: false, error.code = "COOKIE_POLICY_MISSING" y pending_sync: false; no se almacena, aplica ni pone en cola nada. Una vez asociada una política, el banner aparece en la siguiente carga de página y el visitante decide sobre esa versión. Un consentimiento registrado mientras había una política asociada sigue siendo válido.
  • Una decisión nunca se retiene para enviarla más tarde con una versión de la política que el visitante no ha visto. Si una versión anterior del SDK dejó una decisión así en la cola local, se descarta (consent:error con final: true, reprompt: true) y se vuelve a preguntar al visitante.
  • La única excepción es el modo local sin data-site: no se envía nada al servidor, por lo que el banner se muestra y las decisiones permanecen en el navegador (local_only: true).
  • Si el consentimiento hace referencia a una versión que no es la activa, el servidor responde 409 CONFIG_OUTDATED. Consulte Renovación del consentimiento y cambios de versión de los documentos.

Qué debe hacer: cree un documento de política de cookies en el panel, publique una versión en cada idioma que utilice su banner y asócielo al sitio.


Solo se bloquean los scripts que usted etiqueta. El SDK no analiza la página en busca de rastreadores ni intercepta los scripts que usted deja sin modificar: una etiqueta <script> normal se ejecuta de inmediato, con o sin consentimiento.

Para retener un script, cambie su type a text/plain e indique su categoría:

<!-- Script en línea: solo se ejecuta después de permitir "analytics" -->
<script type="text/plain" data-cookie-category="analytics">
/* fragmento de analítica */
</script>
<!-- Script externo: use data-src en lugar de src -->
<script type="text/plain" data-cookie-category="marketing"
data-src="https://connect.facebook.net/en_US/fbevents.js"></script>
  • Los nombres de categoría deben coincidir con las claves de categoría de su banner (analytics, marketing, preferences o sus propias claves). Los scripts etiquetados como necessary se activan de inmediato, antes de que se cargue la configuración.
  • También se gestionan los scripts etiquetados que se añaden a la página más tarde (navegación en una SPA, inyección de etiquetas).
  • Un script que ya se ha ejecutado no puede detenerse. Cuando un visitante revoca una categoría cuyos scripts se ejecutaron en la página actual, el SDK elimina las cookies conocidas de esa categoría y, de forma predeterminada, recarga la página (véase reload_on_revoke).
  • Cuando se revoca una categoría, el SDK elimina las cookies y entradas de almacenamiento enumeradas para esa categoría en la configuración de su banner, además de una pequeña lista integrada de nombres muy conocidos. Las cookies que no conoce no se eliminan, y las cookies de terceros de otros dominios no pueden eliminarse desde su página.

AtributoPredeterminadoDescripción
data-site—Clave API del sitio. Obligatoria en el modo remote; también es necesaria en los demás modos para que las decisiones se registren en el servidor.
data-modelocal-fallbackOrigen de la configuración: remote, local, local-fallback. Consulte Modos de funcionamiento.
data-languageautoIdioma del banner. auto utiliza <html lang> y, después, el idioma del navegador.
data-regionautoFuerza una región o un marco normativo (DE, US, gdpr, ccpa, none, …) en lugar de la detección. Es la región de cumplimiento (qué normas sigue el banner); no determina dónde se almacenan los datos ni a qué host de la API se llama.
data-config—Configuración JSON en línea (para local / local-fallback).
data-debugfalsetrue imprime registros de depuración. Los errores y las advertencias siempre se imprimen en la consola.
data-headlessfalsetrue no renderiza ninguna interfaz (banner, widget, enlace “No vender”). Consulte Modo headless.
data-consent-modeajuste del paneltrue / false fuerza la activación o desactivación de Google Consent Mode v2. Consulte Google Consent Mode v2.
data-reload-on-revokeajuste del paneltrue / false anula el indicador de comportamiento reload_on_revoke.
data-modules—Módulos que se cargan por adelantado, p. ej. documents, preferences. Consulte Paquetes y módulos bajo demanda.
data-module-basecarpeta del propio scriptURL base desde la que se cargan los archivos de módulo. Solo es necesaria cuando no se sirven junto a cmp.js.
data-api-urlAPI de HashEntryURL base de la API para un proxy de origen propio o un dominio personalizado. Si la región de datos de su cuenta tiene su propio host de API, la respuesta de configuración lo anuncia (api_base_url) y el SDK lo usa en todas las llamadas posteriores; el código de inserción generado en el panel ya incluye el data-api-url correspondiente. Un valor que usted indique aquí siempre tiene prioridad.

window.CMP existe en cuanto el script se ha ejecutado. Los métodos que registran algo devuelven una promesa con un objeto de resultado; no lanzan excepciones.

CMP.ready(() => { /* configuración cargada, estado del consentimiento evaluado */ });
// Banner
CMP.show(); // abre el banner (p. ej. desde un enlace del pie de página)
CMP.hide();
// Decisiones: cada una devuelve Promise<ConsentResult>
CMP.accept(); // permite todas las categorías
CMP.accept({ marketing: false }); // permite todas excepto marketing
CMP.reject(); // solo las necesarias
CMP.withdraw(); // retira el consentimiento almacenado
// Estado
CMP.getConsent(); // ConsentState o null
CMP.hasConsent('analytics'); // booleano ("necessary" siempre es true)
// Idioma
CMP.setLanguage('de');
CMP.getLanguage();
CMP.setLocale('de', { ccpa: { optOut: 'Widersprechen' } }); // textos para un idioma
// Metadatos: se añaden a cada consentimiento y aprobación registrados posteriormente
CMP.setMetadata({ order_id: 'ORD-54321' });
CMP.setMetadata('customer_id', 'CUST-999');
CMP.getMetadata();
// Anulación de región, tema, URL de la API, configuración local
CMP.setRegion('DE');
CMP.setTheme({ primaryColor: '#0F766E' });
CMP.setApiUrl('/hashentry-api');
CMP.getApiUrl();
CMP.setConfig({ banner_config: { /* … */ } });
// Eventos
CMP.on('consent:given', (payload) => {});
CMP.off('consent:given', handler);
// Documentos (se cargan bajo demanda; véase "Aprobación y firma de documentos")
CMP.showDocumentApproval('terms-of-service', { language: 'en' });
CMP.approveDocument('terms-of-service', { /* … */ });

La retirada desactiva todas las categorías no esenciales, elimina las cookies conocidas de esas categorías, establece Google Consent Mode en denied, envía al servidor una decisión withdrawn (si se había almacenado un consentimiento), elimina del navegador el consentimiento almacenado y, en las regiones opt-in, vuelve a mostrar el banner. Si en la página ya se ejecutaron scripts de una categoría revocada, la página se recarga, salvo que reload_on_revoke esté desactivado.

Cambia el idioma del banner abierto y vuelve a cargar la configuración para ese idioma, porque las versiones de los documentos son específicas de cada idioma: los consentimientos posteriores hacen referencia a la versión de la política de cookies del nuevo idioma. Si el banner no tiene traducción para ese idioma, recurre al idioma predeterminado del banner.

Los valores se combinan y se envían como metadata con cada decisión sobre cookies y cada aprobación de documento posteriores. El servidor acepta como máximo 30 claves y unos 16 KB de metadatos por registro.

Llamar a la API antes de que el script se haya cargado

Sección titulada «Llamar a la API antes de que el script se haya cargado»
<script>
window.__CMP_QUEUE = window.__CMP_QUEUE || [];
window.__CMP_QUEUE.push(['setLanguage', 'de']);
window.__CMP_QUEUE.push(['setMetadata', { order_id: 'ORD-12345' }]);
window.__CMP_QUEUE.push(['on', 'consent:given', (p) => console.log(p)]);
</script>

Las llamadas en cola se ejecutan en orden cuando el SDK se inicia. Un idioma establecido de este modo no es sustituido por la detección automática.


{
success: true,
consent_token: 'ct_…',
proof_hash: '…', // 64 caracteres hexadecimales
created_at: '2026-10-10T10:00:00+00:00',
idempotency_key: '…' // un UUID por acción del usuario, reutilizado en cada reintento
}

success es true únicamente cuando el servidor ha aceptado el registro. En caso contrario:

{
success: false,
consent_token: '',
proof_hash: '',
created_at: '…',
error: { code: 'NETWORK_ERROR', status: 0, message: '…' },
pending_sync: true, // se conserva en la cola local y se reintentará
idempotency_key: '…'
}
  • error.code es el código de máquina del servidor o uno de los códigos del SDK indicados más abajo; error.status es el estado HTTP (0 cuando no se recibió ninguna respuesta).
  • pending_sync: true significa que la decisión se ha aplicado en el navegador y espera en una cola local (localStorage). Se reintenta en la siguiente carga de página, cuando la pestaña vuelve a estar visible y cuando el navegador recupera la conexión, siempre con la misma idempotency_key, durante un máximo de 7 días o 12 intentos.
  • local_only: true aparece cuando no hay nada que enviar (por ejemplo, el modo local sin data-site).

La elección del visitante se aplica en el navegador de inmediato en todos los casos; el resultado le indica si el servidor tiene un registro de ella. La excepción es COOKIE_POLICY_MISSING: la decisión no se almacena ni se aplica.

{ success: true, decision: 'accepted', consent_token: 'ct_…', proof_hash: '…', slug: 'terms-of-service', version: '2.0.0' }
{ success: false, slug: 'terms-of-service', version: '2.0.0', error: { code: 'DOCUMENT_VERSION_CHANGED', status: 409, message: '…' } }

Las aprobaciones de documentos nunca se ponen en cola para más tarde: si success no es true, la aprobación no se ha registrado.


EventoCarga útilCuándo
ready{}El inicio ha finalizado (también cuando no se pudo cargar la configuración).
banner:shown{ type } o { headless: true, reason, config }El banner se ha mostrado o, en el modo headless, debe mostrarlo usted.
banner:hidden{ reason } o { headless: true }El banner se ha cerrado.
consent:given{ decision, categories, source }Se ha almacenado localmente una decisión distinta de “rechazar todo”.
consent:rejected{ decision, categories, source }Se ha almacenado localmente “rechazar todo”.
consent:changed{ oldCategories, newCategories }Una decisión ha sustituido a otra anterior.
consent:withdrawn{ categories, cleanedCookies }Se ha llamado a CMP.withdraw().
consent:synced{ consent_token, idempotency_key }El servidor ha aceptado un registro (de inmediato o desde la cola).
consent:error{ code, status, message, idempotency_key, pending_sync, final?, reprompt? }No se ha podido entregar un registro. final: true significa que se ha descartado.
document:approved{ slug, version, consentId }Se ha registrado la aprobación de un documento.
document:rejected{ slug, version }El visitante ha rechazado un documento.
document:error{ slug, version, code, status, message }No se ha podido cargar un documento o la aprobación no se ha registrado.
scripts:activated{ category, count }Se han activado los scripts etiquetados de una categoría.
config:updated{ content_hash }Una configuración más reciente ha sustituido a la almacenada en caché.
language:changed{ from, to }El idioma ha cambiado.
error{ scope, code, status, message, … }Cualquiera de los errores anteriores; scope es config, consent, module o document.

consent:given / consent:rejected se emiten cuando la decisión se almacena en el navegador. Utilice consent:synced (o el resultado de la promesa) cuando necesite saber que el servidor la tiene.


Códigos generados por el propio SDK:

CódigoSignificado
NOT_READYSe ha llamado a un método de decisión antes de que se cargara la configuración. Llámelo dentro de CMP.ready().
COOKIE_POLICY_MISSINGEl sitio no tiene asociado ningún documento de política de cookies publicado. El banner no se muestra, los scripts no esenciales siguen bloqueados y la decisión no se almacena ni se pone en cola.
NETWORK_ERROR, TIMEOUTSin respuesta de la API (tiempo de espera: 5 s por intento).
HTTP_<status>El servidor ha respondido con un error que no incluye código de máquina.
DOCUMENT_VERSION_CHANGEDLa versión del documento referenciada ya no es la activa; el registro se ha descartado.
PENDING_EXPIREDUna decisión en cola no pudo entregarse en un plazo de 7 días y se ha descartado.
MODULE_LOAD_FAILEDNo se ha podido cargar un archivo de módulo (documents o preferences). También se notifica mediante el evento error con scope: "module".
APPROVAL_TOKEN_REQUIREDEl documento requiere un token de aprobación de un solo uso y no se ha pasado ninguno (también lo devuelve el servidor).
CONFIG_UNAVAILABLENo se ha podido cargar la configuración (se notifica mediante el evento error).
UNEXPECTED_ERRORCualquier otro caso.

Los códigos devueltos por el servidor se transmiten sin cambios. Los más relevantes figuran en la página de la API REST; por ejemplo, CONFIG_OUTDATED, SITE_NOT_VERIFIED, ORIGIN_NOT_ALLOWED, RATE_LIMIT_EXCEEDED, CONSENT_LIMIT_EXCEEDED, APPROVAL_TOKEN_INVALID.

Respuestas temporales del servidor. 503 (API_KEY_LOOKUP_UNAVAILABLE, ADMISSION_UNAVAILABLE, QUEUE_OVERLOADED) y 429 RATE_LIMIT_EXCEEDED se reintentan automáticamente con la misma idempotency_key; el SDK espera el tiempo indicado en la cabecera Retry-After. Si ese tiempo supera los 5 segundos, el SDK no espera dentro de la página: la decisión permanece en la cola local (pending_sync: true) y se envía más tarde. Tras 429 TOO_MANY_INVALID_API_KEYS, el SDK no envía más solicitudes durante esa visualización de página y las decisiones en cola se conservan; compruebe el valor de data-site. Ninguna de estas respuestas afecta a su página: se emite el evento error y los callbacks de CMP.ready() se siguen ejecutando.

Sección titulada «Respuestas temporales del servidor. 503 (API_KEY_LOOKUP_UNAVAILABLE, ADMISSION_UNAVAILABLE, QUEUE_OVERLOADED) y 429 RATE_LIMIT_EXCEEDED se reintentan automáticamente con la misma idempotency_key; el SDK espera el tiempo indicado en la cabecera Retry-After. Si ese tiempo supera los 5 segundos, el SDK no espera dentro de la página: la decisión permanece en la cola local (pending_sync: true) y se envía más tarde. Tras 429 TOO_MANY_INVALID_API_KEYS, el SDK no envía más solicitudes durante esa visualización de página y las decisiones en cola se conservan; compruebe el valor de data-site. Ninguna de estas respuestas afecta a su página: se emite el evento error y los callbacks de CMP.ready() se siguen ejecutando.»

Renovación del consentimiento y cambios de versión de los documentos

Sección titulada «Renovación del consentimiento y cambios de versión de los documentos»

Cuándo se vuelve a mostrar el banner. El consentimiento almacenado recuerda el hash de contenido de la configuración del banner para la que se otorgó. El banner se vuelve a mostrar cuando:

  • el consentimiento ha caducado (el periodo de validez se establece en el panel),
  • la estructura de categorías / cookies del banner ha cambiado, o
  • se ha publicado una nueva versión de un documento asociado, salvo que el ajuste reconsent_on_doc_change del banner esté desactivado, en cuyo caso solo los cambios de estructura provocan la renovación del consentimiento.

Mientras la renovación del consentimiento está pendiente en una región opt-in, la elección anterior del visitante sigue vigente hasta que este decida de nuevo.

Decisiones pendientes y una versión de documento modificada. Si una decisión no pudo entregarse (sin conexión, página cerrada, error del servidor) y, al reintentarla, la versión del documento a la que hace referencia ya no es la activa, el SDK:

  1. solicita al servidor la configuración actual, omitiendo la caché;
  2. si la versión no ha cambiado (el 409 se debió a una caché fría del servidor), envía el mismo registro una vez más;
  3. si la versión ha cambiado, descarta el registro, elimina el consentimiento almacenado localmente y vuelve a mostrar el banner (consent:error con code: "DOCUMENT_VERSION_CHANGED", final: true, reprompt: true).

Un registro pendiente nunca se reenvía con una versión de documento distinta: el visitante no vio esa versión.


Regiones, perfiles normativos e indicadores de comportamiento

Sección titulada «Regiones, perfiles normativos e indicadores de comportamiento»

La región del visitante se resuelve en este orden: CMP.setRegion() → data-region → el resultado GeoIP del servidor en la respuesta de configuración (detected_region) → una estimación a partir de la zona horaria del navegador → el modo normativo fijo del banner → las reglas más estrictas (RGPD). El SDK nunca llama a un servicio de geolocalización de terceros.

RegiónMarco normativoModeloComportamiento
UE / EEE, Suizagdpropt-inBanner; los scripts etiquetados se bloquean hasta que se permiten.
Turquíakvkkopt-inIgual que el RGPD.
Reino Unidouk_gdpropt-inIgual que el RGPD (véase uk_analytics_exemption).
Brasillgpdopt-inIgual que el RGPD.
Sudáfrica, Canadá, China, Corea del Surpopia, pipeda, pipl, pipaopt-inSe aplican las reglas de banner del RGPD.
EE. UU.ccpa — solo si está habilitado; en caso contrario, gdpropt-out / opt-inVéase ccpa_opt_out_enabled.
Desconocidagdpropt-inLas reglas más estrictas.
none (explícito)none—Sin banner; todos los scripts se ejecutan.

En todos los perfiles opt-in, el banner tiene siempre un botón “Rechazar” con el mismo peso visual que “Aceptar”, y ninguna categoría opcional está preseleccionada, independientemente de lo que indique el diseño del banner.

Tres indicadores de comportamiento (banner → ajustes de comportamiento en el panel, banner_config.behavior en una configuración local) modifican lo anterior:

IndicadorPredeterminadoEfecto
uk_analytics_exemptiondesactivadoSolo para visitantes del Reino Unido: los scripts etiquetados como analytics pueden ejecutarse antes de una decisión. Todas las demás categorías siguen necesitando consentimiento y, una vez que el visitante ha decidido, se aplica su decisión.
ccpa_opt_out_enableddesactivadoLos visitantes detectados en EE. UU. reciben el modelo opt-out: los scripts se ejecutan de forma predeterminada, se muestra un enlace “No vender ni compartir mi información personal” (“Do Not Sell or Share My Personal Information”) y una señal de Global Privacy Control se aplica una vez como opt-out (consent_type: do_not_sell_opt_out). Cuando está desactivado, los visitantes de EE. UU. reciben el banner opt-in.
reload_on_revokeactivadoRecarga la página cuando un visitante revoca una categoría cuyos scripts ya se ejecutaron en esta página. Desactívelo únicamente si sus etiquetas reaccionan por sí mismas a los cambios de consentimiento.

Cuando Consent Mode está activado, el SDK crea window.dataLayer y una función gtag si no existen y envía:

  1. gtag('consent', 'default', { …all denied…, wait_for_update: 500 }) durante el inicio,
  2. gtag('consent', 'update', { … }) después de cada decisión y en cada carga de página con un consentimiento almacenado.
SeñalSe concede cuando se permite esta categoría
ad_storage, ad_user_data, ad_personalizationmarketing
analytics_storageanalytics
functionality_storage, personalization_storagepreferences
security_storagesiempre

El SDK también envía a la capa de datos los eventos hashentry_consent_default y hashentry_consent_update.

Configuración:

  1. Active Google Consent Mode para el banner en el panel, o bien añada data-consent-mode="true" a la etiqueta de script.
  2. Coloque la etiqueta de script de HashEntry por encima de su etiqueta de Google / fragmento de GTM.
  3. Si el comando default debe preceder a las etiquetas de Google en la primera página vista de un visitante, utilice data-consent-mode="true" y cargue cmp.js sin async. El ajuste del panel llega con la configuración, que en una primera visita se carga de forma asíncrona; en visitas posteriores se lee de la configuración almacenada en caché durante el inicio.

Consent Mode solo envía señales. Las etiquetas que no están controladas por Consent Mode siguen teniendo que etiquetarse para su bloqueo tal como se describe más arriba.


Con data-headless="true" el SDK no renderiza nada. Sigue cargando la configuración, bloqueando los scripts etiquetados, actualizando Consent Mode y registrando las decisiones.

CMP.on('banner:shown', ({ headless, reason, config }) => {
if (headless) openMyBanner(config); // reason: no_consent | expired | reconsent | withdrawn | api | opt_out
});
myAcceptButton.onclick = async () => {
const result = await CMP.accept({ analytics: true, marketing: false });
if (!result.success && !result.pending_sync) showError(result.error);
};

ModoOrigen de la configuración
remoteSolo el servidor. data-site es obligatorio.
localSolo la página (CMP.setConfig, data-config o <script type="application/json" id="cmp-config">).
local-fallback (predeterminado)El servidor; si no se puede acceder a él, la configuración de la página.

El modo solo selecciona de dónde procede la configuración. Las decisiones se envían al servidor en todos los modos siempre que data-site esté establecido. En el modo local sin data-site, las decisiones se conservan únicamente en el navegador (local_only: true).

Una configuración local utiliza la misma estructura que la respuesta del servidor:

<script type="application/json" id="cmp-config">
{
"banner_config": {
"layout": "bottom_bar",
"theme": { "primary_color": "#2563EB", "font_family": "system", "theme_mode": "auto" },
"behavior": { "show_widget": true, "show_reject_button": true, "show_settings_button": true },
"categories": [
{ "key": "necessary", "required": true, "default": true },
{ "key": "analytics", "required": false, "default": false,
"cookies": [{ "name": "_ga", "provider": "Google", "type": "cookie", "duration": "2 years" }] }
],
"languages": {
"default": "en",
"translations": {
"en": {
"title": "Cookie preferences",
"description": "We use cookies to measure how the site is used.",
"accept_button_text": "Accept all",
"reject_button_text": "Reject all",
"settings_button_text": "Manage preferences",
"save_selected_text": "Save selection",
"modal_title": "Cookie settings",
"always_active_text": "Always active",
"categories": {
"necessary": { "label": "Necessary", "description": "Required for the site to work." },
"analytics": { "label": "Analytics", "description": "Visitor statistics." }
}
}
}
}
}
}
</script>
<script src="https://tool.hashentry.com/cmp.js" data-site="YOUR_SITE_API_KEY" data-mode="local" async></script>

Con data-site definido, el SDK solicita al servidor una vez, al iniciarse, el documento de política de cookies, porque un consentimiento debe hacer referencia a su versión. Si no hay ninguna asociada, el banner no se muestra (COOKIE_POLICY_MISSING). Para mostrar el banner incluso cuando no se puede acceder al servidor, incluya documents (la política de cookies y su versión) en la configuración de la página.


Todos los textos del banner (título, descripción, botones, nombres de categoría) proceden de la configuración del banner; no forman parte del script.

El SDK incluye un pequeño diccionario integrado, solo en inglés y turco, para los textos que pertenecen a su propia interfaz: el diálogo “No vender”, los botones y la línea de error de la aprobación de documentos, los encabezados de la tabla de cookies y el botón de cierre. En cualquier otro idioma estos textos recurren al inglés, salvo que usted los proporcione:

CMP.setLocale('de', {
document: { approve: 'Ich stimme zu', reject: 'Ablehnen', saving: 'Wird gespeichert…', error: 'Ihre Zustimmung konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.' },
ccpa: { link: '…', description: '…', cancel: 'Abbrechen', optOut: 'Widersprechen' },
cookies: { name: 'Name', provider: 'Anbieter', type: 'Typ', duration: 'Dauer', purpose: 'Zweck', category: 'Kategorie', count: '{n} Cookies', empty: 'Keine Cookies registriert.' }
});

Una configuración puede incluir las mismas claves por idioma en languages.translations.<lang>.sdk_texts.


ArchivoContenidoCarga
cmp.jsNúcleo y consentimiento de cookiesMediante su etiqueta de script.
cmp-documents.<hash>.jsAprobación de documentos (showDocumentApproval, approveDocument)Mediante cmp.js, la primera vez que se llama a uno de estos métodos.
cmp-preferences.<hash>.jsCentro de preferencias, tabla de detalles de cookies, cuadro de confirmación «Do Not Sell»Mediante cmp.js, la primera vez que el visitante abre uno de ellos.

Nunca se añade una segunda etiqueta de script. Un sitio que solo utiliza el banner de cookies nunca descarga el módulo de documentos.

  • El archivo del módulo se solicita en la misma ubicación que cmp.js (derivada del src del script).
  • Para evitar el breve retraso de la primera llamada, cárguelo por adelantado: data-modules="documents".
  • Las llamadas realizadas antes de que el módulo haya llegado simplemente lo esperan. Si no puede cargarse, el método se resuelve con success: false y error.code = "MODULE_LOAD_FAILED"; la siguiente llamada lo intenta de nuevo.
  • Si el módulo preferences no puede cargarse, el banner permanece en pantalla con sus botones de aceptar y rechazar, el evento error se emite con scope: "module" y code: "MODULE_LOAD_FAILED", y el siguiente clic lo intenta de nuevo. Para abrir el centro de preferencias sin demora, cárguelo por adelantado: data-modules="preferences".
  • El nombre del archivo contiene un hash de contenido que se incrusta en cmp.js en el momento de la compilación, de modo que cmp.js siempre solicita el módulo compilado junto con él.

Content Security Policy. El módulo se carga con un elemento <script> desde el mismo origen que cmp.js; el SDK no utiliza eval ni scripts en línea. Para los scripts, basta con el origen del SDK:

script-src https://tool.hashentry.com;
connect-src https://system.hashentry.com;
  • El SDK aplica estilos a su interfaz con elementos <style> dentro de su propio shadow root. Si su política restringe style-src, permita 'unsafe-inline' para los estilos o utilice un nonce: coloque el nonce en la etiqueta de cmp.js (<script nonce="…" …>) y el SDK lo copia a los elementos de estilo y a la etiqueta de script del módulo que crea.
  • Con script-src 'strict-dynamic' y un nonce en la etiqueta de cmp.js, el script del módulo se permite sin necesidad de indicar el origen.
  • El diálogo de aprobación de documentos renderiza el documento en un iframe en sandbox sin src; los scripts contenidos en el documento no se ejecutan.

Subresource Integrity. https://tool.hashentry.com/cmp.js se actualiza en la misma URL cuando se publica una nueva versión del SDK, por lo que un atributo integrity sobre esa URL dejaría de funcionar en la siguiente publicación. Si necesita SRI, aloje en su propio origen una copia revisada de cmp.js junto con los archivos cmp-documents.*.js / cmp-preferences.*.js de la misma compilación y establezca integrity en su propia etiqueta.

Alojamiento propio. Copie cmp.js, cmp-documents.<hash>.js, cmp-preferences.<hash>.js, cmp-preferences.js y cmp-documents.js de la misma compilación en una sola carpeta. Si los archivos de módulo se encuentran en otro lugar, establezca data-module-base.


Para enviar las solicitudes de la API a través de su propio dominio, establezca data-api-url (o CMP.setApiUrl) en una ruta o URL de su lado y reenvíela a la API de HashEntry sin modificar la ruta situada por debajo del prefijo:

<script src="https://tool.hashentry.com/cmp.js"
data-site="YOUR_SITE_API_KEY"
data-api-url="/hashentry-api" async></script>
# /hashentry-api/tool/v1/consents → https://system.hashentry.com/tool/v1/consents
location /hashentry-api/ {
proxy_pass https://system.hashentry.com/;
proxy_set_header Host system.hashentry.com;
proxy_ssl_server_name on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

La firma de la solicitud cubre la ruta /tool/v1/..., por lo que la solicitud ascendente debe llegar exactamente con esa ruta. La dirección IP registrada es la que ve HashEntry; que la dirección del visitante se tome de X-Forwarded-For depende de que el proxy sea de confianza en el lado de HashEntry: consulte con el soporte antes de basarse en ello.


NombreDóndeFinalidad
_he_consentcookie de origen propioLa decisión del visitante (categorías, marcas de tiempo, token del servidor).
he_consent_tokenlocalStorageCopia de la misma decisión.
he_config_cachelocalStorageConfiguración almacenada en caché (hasta 7 días, revalidada en segundo plano en cada carga).
he_pending_consentslocalStorageDecisiones que el servidor aún no ha aceptado (se eliminan al entregarse; se descartan a los 7 días).
he_gpc_appliedlocalStorageMarca que se aplicó una vez un opt-out de GPC.
he_sdk_reloadsessionStorageProtege la autoactualización del SDK frente a bucles de recarga.

El SDK no carga fuentes tipográficas ni ningún otro recurso de terceros.