Desarrolladores
Referencia de webhooks
Cada evento que puede escuchar un webhook, con los datos que lleva, cómo comprobar la firma y cuándo se reintenta un mensaje.
En esta página
Generada a partir del código que ejecuta este sitio: describe lo que la API sirve hoy.
Resumen
Cada mensaje es un POST de un cuerpo JSON a la dirección https que registraste (puerto 443, un nombre público; no se sigue ninguna redirección), con las cabeceras de abajo. Responde con un estado 2xx: el remitente no espera más de 5 segundos de silencio ni más de 10 segundos en total, y cualquier otra cosa cuenta como un fallo.
Cabeceras
| Cabecera | Valor |
|---|---|
| MercaMap-Event-Id | El identificador del mensaje: ignora un identificador que ya hayas tratado. |
| MercaMap-Event-Type | El evento, como en el cuerpo. |
| MercaMap-Signature | La firma, como se explica abajo. |
| webhook-id | El identificador del evento: el mismo para todas las direcciones y en cada reintento (Standard Webhooks). |
| webhook-timestamp | La hora en segundos Unix, firmada con el identificador y el cuerpo. |
| webhook-signature | v1, y la firma en base64, una por secreto durante un cambio; solo con un secreto con la forma de Standard Webhooks. |
| User-Agent | MercaMap-Webhooks/1.0: Quién lo envía. |
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
idObligatorio | uuid | |
typeObligatorio | string | Uno de: release.published, issues.opened, issue.verified, order.confirmed, delivery.recorded, campaign.response, import.applied, import.ended, summary.ready, gap.opened, gap.closed, issue.opened, issue.closed, price.changed, promotion.result, shelf.snapshot, ledger.updated, forecast.issued, priorities.ready, promotion.risk, launch.curve, ping |
dataObligatorio | object | |
event_idObligatorio | string | |
created_atObligatorio | date-time |
Formatos
Cada dirección elige cómo se escriben sus mensajes en la página de su conector, en «Conectores»; los datos son los mismos en todos, y todos llevan nuestras firmas menos los de un bus de eventos, que se firman para el bus. Cada muestra de abajo es un mensaje gap.opened, con una tienda y una referencia inventadas.
MercaMap, JSON firmado (standard)
El cuerpo de arriba: id, type y data, con el identificador del evento (event_id) y cuándo se escribió el mensaje (created_at). Un mensaje por petición.
Content-Type: application/json
{
"id": "0c1b7a52-5d4e-4b3f-8a9c-1e2d3f4a5b6c",
"type": "gap.opened",
"data": {
"week": "2026-W42",
"kind": "lost",
"store": {
"id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"name": "Supermercado Ejemplo Centro",
"chain": "Ejemplo",
"address": "Calle Mayor 5, 28013 Madrid",
"postcode": "28013",
"locality": "Madrid",
"province": "28",
"lat": 40.4168,
"lng": -3.7038,
"code": "T-0042",
"chainCode": null,
"gln": null
},
"reference": {
"id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"name": "Agua mineral natural",
"variant": null,
"brand": "Marca Ejemplo",
"size": "1,5 l",
"category": "water",
"code": "ME-001",
"ean": "8410000000017"
},
"looksMissed": 2,
"lastSeenWeek": "2026-W38",
"peers": {
"looked": 5,
"carrying": 4,
"firstWeek": "2026-W40",
"lastWeek": "2026-W42"
}
},
"event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"created_at": "2026-10-26T06:12:30.000Z"
}JSON plano (flat)
Un solo nivel de claves en snake_case: primero event_id, event_type, event_version y created_at, y después los datos; una clave anidada se une con un guion bajo (store_id, reference_ean) y una lista de objetos se convierte en listas paralelas de la misma longitud (reference_seen, reference_ean). Un mensaje por petición.
Content-Type: application/json
{
"event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"event_type": "gap.opened",
"event_version": 1,
"created_at": "2026-10-26T06:12:30.000Z",
"week": "2026-W42",
"kind": "lost",
"store_id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"store_name": "Supermercado Ejemplo Centro",
"store_chain": "Ejemplo",
"store_address": "Calle Mayor 5, 28013 Madrid",
"store_postcode": "28013",
"store_locality": "Madrid",
"store_province": "28",
"store_lat": 40.4168,
"store_lng": -3.7038,
"store_code": "T-0042",
"store_chain_code": null,
"store_gln": null,
"reference_id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"reference_name": "Agua mineral natural",
"reference_variant": null,
"reference_brand": "Marca Ejemplo",
"reference_size": "1,5 l",
"reference_category": "water",
"reference_code": "ME-001",
"reference_ean": "8410000000017",
"looks_missed": 2,
"last_seen_week": "2026-W38",
"peers_looked": 5,
"peers_carrying": 4,
"peers_first_week": "2026-W40",
"peers_last_week": "2026-W42"
}CloudEvents 1.0 (cloudevents)
Un evento CloudEvents 1.0 en modo estructurado, enviado como application/cloudevents+json: su id es el del evento, su source https://mercamap.com/portal, su type com.mercamap. y el evento, y su subject la tienda cuando la hay. Un mensaje por petición.
Content-Type: application/cloudevents+json
{
"specversion": "1.0",
"id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"source": "https://mercamap.com/portal",
"type": "com.mercamap.gap.opened",
"time": "2026-10-26T06:12:30.000Z",
"subject": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"datacontenttype": "application/json",
"data": {
"week": "2026-W42",
"kind": "lost",
"store": {
"id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"name": "Supermercado Ejemplo Centro",
"chain": "Ejemplo",
"address": "Calle Mayor 5, 28013 Madrid",
"postcode": "28013",
"locality": "Madrid",
"province": "28",
"lat": 40.4168,
"lng": -3.7038,
"code": "T-0042",
"chainCode": null,
"gln": null
},
"reference": {
"id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"name": "Agua mineral natural",
"variant": null,
"brand": "Marca Ejemplo",
"size": "1,5 l",
"category": "water",
"code": "ME-001",
"ean": "8410000000017"
},
"looksMissed": 2,
"lastSeenWeek": "2026-W38",
"peers": {
"looked": 5,
"carrying": 4,
"firstWeek": "2026-W40",
"lastWeek": "2026-W42"
}
}
}Tealium (tealium)
Para la fuente de datos HTTP API – Advanced de Tealium: el cuerpo plano con cada atributo precedido de mercamap_, el evento como tealium_event (mercamap_gap_opened, o el nombre que le da la dirección), la cuenta y el perfil, tealium_visitor_id cuando la dirección pide un visitante por tienda (la misma tienda tiene otro en cada perfil de Tealium) y, al final, los parámetros propios de la dirección, hasta 20, en su orden mientras el evento lleve menos de 100 atributos. Hasta 10 eventos por petición, como un array JSON, a la dirección que forman su cuenta, su perfil y su clave en el servidor global de Tealium o en el de la región del perfil (collect-eu-central-1.tealiumiq.com), nunca más de 50 eventos por segundo.
Content-Type: application/json
[
{
"tealium_event": "mercamap_gap_opened",
"tealium_account": "acme-foods",
"tealium_profile": "main",
"tealium_visitor_id": "mercamap_store_51ae81ff3731ff18789732ceb9f03005",
"mercamap_event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"mercamap_event_type": "gap.opened",
"mercamap_event_version": 1,
"mercamap_created_at": "2026-10-26T06:12:30.000Z",
"mercamap_week": "2026-W42",
"mercamap_kind": "lost",
"mercamap_store_id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"mercamap_store_name": "Supermercado Ejemplo Centro",
"mercamap_store_chain": "Ejemplo",
"mercamap_store_address": "Calle Mayor 5, 28013 Madrid",
"mercamap_store_postcode": "28013",
"mercamap_store_locality": "Madrid",
"mercamap_store_province": "28",
"mercamap_store_lat": 40.4168,
"mercamap_store_lng": -3.7038,
"mercamap_store_code": "T-0042",
"mercamap_store_chain_code": null,
"mercamap_store_gln": null,
"mercamap_reference_id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"mercamap_reference_name": "Agua mineral natural",
"mercamap_reference_variant": null,
"mercamap_reference_brand": "Marca Ejemplo",
"mercamap_reference_size": "1,5 l",
"mercamap_reference_category": "water",
"mercamap_reference_code": "ME-001",
"mercamap_reference_ean": "8410000000017",
"mercamap_looks_missed": 2,
"mercamap_last_seen_week": "2026-W38",
"mercamap_peers_looked": 5,
"mercamap_peers_carrying": 4,
"mercamap_peers_first_week": "2026-W40",
"mercamap_peers_last_week": "2026-W42"
}
]Segment o RudderStack (segment)
Para la API HTTP de seguimiento de Segment, o la de RudderStack, que acepta las mismas llamadas: un lote de hasta 100 llamadas track, cada una con el nombre del evento en Title Case (Gap Opened), el cuerpo plano como properties, el identificador del evento como messageId, mm_store_ y el identificador de la tienda como anonymousId (mm_account_ y el de la cuenta para un evento sin tienda) y created_at como timestamp. La clave de escritura va en la autenticación Basic.
Content-Type: application/json
{
"batch": [
{
"type": "track",
"event": "Gap Opened",
"anonymousId": "mm_store_3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"messageId": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"timestamp": "2026-10-26T06:12:30.000Z",
"properties": {
"event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"event_type": "gap.opened",
"event_version": 1,
"created_at": "2026-10-26T06:12:30.000Z",
"week": "2026-W42",
"kind": "lost",
"store_id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"store_name": "Supermercado Ejemplo Centro",
"store_chain": "Ejemplo",
"store_address": "Calle Mayor 5, 28013 Madrid",
"store_postcode": "28013",
"store_locality": "Madrid",
"store_province": "28",
"store_lat": 40.4168,
"store_lng": -3.7038,
"store_code": "T-0042",
"store_chain_code": null,
"store_gln": null,
"reference_id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"reference_name": "Agua mineral natural",
"reference_variant": null,
"reference_brand": "Marca Ejemplo",
"reference_size": "1,5 l",
"reference_category": "water",
"reference_code": "ME-001",
"reference_ean": "8410000000017",
"looks_missed": 2,
"last_seen_week": "2026-W38",
"peers_looked": 5,
"peers_carrying": 4,
"peers_first_week": "2026-W40",
"peers_last_week": "2026-W42"
}
}
]
}Slack (slack)
Para un webhook entrante de Slack, cuya dirección es su clave y se guarda cifrada: un mensaje por evento y semana, en el idioma que elige la dirección, con el título y su recuento, la semana, hasta 10 filas (referencia y tienda), cuántas más hay y un enlace a la página del portal de lo que anuncia, en bloques de Block Kit (como mucho 50) y con los caracteres de control de Slack escritos como entidades, para que ningún nombre mencione un canal. Nunca la instantánea semanal. Como mucho 1 mensaje por segundo a cada dirección, más tarde si Slack pide esperar.
Content-Type: application/json; charset=utf-8
{
"text": "1 hueco de distribución abierto · Semana 42 de 2026",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "1 hueco de distribución abierto",
"emoji": false
}
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "Semana 42 de 2026"
}
]
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Agua mineral natural 1,5 l · Supermercado Ejemplo Centro (Madrid)"
}
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "<https://mercamap.com/portal/gaps|Abrir en MercaMap>"
}
]
}
]
}Microsoft Teams, Workflows (teams)
Para el desencadenador «When a Teams webhook request is received» de Workflows, cuya dirección, en environment.api.powerplatform.com, es su clave y se guarda cifrada: el mismo resumen como una tarjeta adaptable (Adaptive Card 1.4) dentro de un mensaje, que el flujo publica en su chat o su canal, en menos de 28 KB.
Content-Type: application/json; charset=utf-8
{
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"contentUrl": null,
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"text": "1 hueco de distribución abierto",
"wrap": true,
"weight": "Bolder",
"size": "Medium"
},
{
"type": "TextBlock",
"text": "Semana 42 de 2026",
"wrap": true,
"isSubtle": true,
"spacing": "None"
},
{
"type": "TextBlock",
"text": "• Agua mineral natural 1,5 l · Supermercado Ejemplo Centro (Madrid)",
"wrap": true,
"spacing": "Small"
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "Abrir en MercaMap",
"url": "https://mercamap.com/portal/gaps"
}
]
}
}
]
}Google Chat (googlechat)
Para el webhook entrante de un espacio de Google Chat, cuya dirección es su clave y se guarda cifrada: el mismo resumen como texto con el formato de Chat, en menos de 32.000 bytes, con los ángulos de un nombre cambiados por ‹ y ›, para que ningún nombre mencione a todo el espacio.
Content-Type: application/json; charset=utf-8
{
"text": "*1 hueco de distribución abierto*\nSemana 42 de 2026\n• Agua mineral natural 1,5 l · Supermercado Ejemplo Centro (Madrid)\n<https://mercamap.com/portal/gaps|Abrir en MercaMap>"
}Adobe Experience Platform (adobe_aep)
Para una conexión de streaming HTTP API de Adobe Experience Platform: el cuerpo plano, un evento por petición (como mucho 1 MB), a la dirección que forma el ID de su entrada, con el ID de su flujo de datos en x-adobe-flow-id para que se asignen los campos del JSON; si la entrada pide autenticación, un token de acceso en Authorization, obtenido con su acceso OAuth Server-to-Server y renovado antes de que caduque.
Content-Type: application/json
{
"event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"event_type": "gap.opened",
"event_version": 1,
"created_at": "2026-10-26T06:12:30.000Z",
"week": "2026-W42",
"kind": "lost",
"store_id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"store_name": "Supermercado Ejemplo Centro",
"store_chain": "Ejemplo",
"store_address": "Calle Mayor 5, 28013 Madrid",
"store_postcode": "28013",
"store_locality": "Madrid",
"store_province": "28",
"store_lat": 40.4168,
"store_lng": -3.7038,
"store_code": "T-0042",
"store_chain_code": null,
"store_gln": null,
"reference_id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"reference_name": "Agua mineral natural",
"reference_variant": null,
"reference_brand": "Marca Ejemplo",
"reference_size": "1,5 l",
"reference_category": "water",
"reference_code": "ME-001",
"reference_ean": "8410000000017",
"looks_missed": 2,
"last_seen_week": "2026-W38",
"peers_looked": 5,
"peers_carrying": 4,
"peers_first_week": "2026-W40",
"peers_last_week": "2026-W42"
}Azure Event Grid (eventgrid)
Para un tema personalizado de Azure Event Grid creado con el esquema CloudEvents 1.0: el evento CloudEvents de arriba en modo estructurado (application/cloudevents+json), uno por petición, con la clave del tema en aeg-sas-key.
Content-Type: application/cloudevents+json
{
"specversion": "1.0",
"id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"source": "https://mercamap.com/portal",
"type": "com.mercamap.gap.opened",
"time": "2026-10-26T06:12:30.000Z",
"subject": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"datacontenttype": "application/json",
"data": {
"week": "2026-W42",
"kind": "lost",
"store": {
"id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"name": "Supermercado Ejemplo Centro",
"chain": "Ejemplo",
"address": "Calle Mayor 5, 28013 Madrid",
"postcode": "28013",
"locality": "Madrid",
"province": "28",
"lat": 40.4168,
"lng": -3.7038,
"code": "T-0042",
"chainCode": null,
"gln": null
},
"reference": {
"id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"name": "Agua mineral natural",
"variant": null,
"brand": "Marca Ejemplo",
"size": "1,5 l",
"category": "water",
"code": "ME-001",
"ean": "8410000000017"
},
"looksMissed": 2,
"lastSeenWeek": "2026-W38",
"peers": {
"looked": 5,
"carrying": 4,
"firstWeek": "2026-W40",
"lastWeek": "2026-W42"
}
}
}Confluent Cloud (confluent)
Para la API REST de Kafka de Confluent Cloud (v3): un registro por petición a los registros del tema del clúster, con la clave y el secreto de API en la autenticación Basic; su clave es el identificador de la tienda (o el del evento), para que los eventos de una tienda guarden su orden en una partición, y su valor, nuestro cuerpo como JSON.
Content-Type: application/json
{
"key": {
"type": "STRING",
"data": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21"
},
"value": {
"type": "JSON",
"data": {
"id": "0c1b7a52-5d4e-4b3f-8a9c-1e2d3f4a5b6c",
"type": "gap.opened",
"data": {
"week": "2026-W42",
"kind": "lost",
"store": {
"id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"name": "Supermercado Ejemplo Centro",
"chain": "Ejemplo",
"address": "Calle Mayor 5, 28013 Madrid",
"postcode": "28013",
"locality": "Madrid",
"province": "28",
"lat": 40.4168,
"lng": -3.7038,
"code": "T-0042",
"chainCode": null,
"gln": null
},
"reference": {
"id": "7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57",
"name": "Agua mineral natural",
"variant": null,
"brand": "Marca Ejemplo",
"size": "1,5 l",
"category": "water",
"code": "ME-001",
"ean": "8410000000017"
},
"looksMissed": 2,
"lastSeenWeek": "2026-W38",
"peers": {
"looked": 5,
"carrying": 4,
"firstWeek": "2026-W40",
"lastWeek": "2026-W42"
}
},
"event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"created_at": "2026-10-26T06:12:30.000Z"
}
}
}Amazon EventBridge (eventbridge)
Para un bus de Amazon EventBridge: un PutEvents por mensaje, con una entrada al bus por su ARN, com.mercamap como origen (Source), el evento como tipo de detalle (DetailType) y nuestro cuerpo como detalle (Detail), al punto de conexión de EventBridge en la región del bus. Lo firma con Signature Version 4 el rol que creas para nosotros, que asumimos con el ExternalId de la dirección, y no lleva nuestras firmas. Una entrada rechazada dentro de un 200 termina el mensaje, salvo si EventBridge lo frena o falla: entonces se reintenta.
Webhooks hacia un bus de eventos (EventBridge, Kinesis, Pub/Sub)
Content-Type: application/x-amz-json-1.1
{
"Entries": [
{
"EventBusName": "arn:aws:events:eu-west-1:123456789012:event-bus/mercamap",
"Source": "com.mercamap",
"DetailType": "gap.opened",
"Detail": "{\"id\":\"0c1b7a52-5d4e-4b3f-8a9c-1e2d3f4a5b6c\",\"type\":\"gap.opened\",\"data\":{\"week\":\"2026-W42\",\"kind\":\"lost\",\"store\":{\"id\":\"3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21\",\"name\":\"Supermercado Ejemplo Centro\",\"chain\":\"Ejemplo\",\"address\":\"Calle Mayor 5, 28013 Madrid\",\"postcode\":\"28013\",\"locality\":\"Madrid\",\"province\":\"28\",\"lat\":40.4168,\"lng\":-3.7038,\"code\":\"T-0042\",\"chainCode\":null,\"gln\":null},\"reference\":{\"id\":\"7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57\",\"name\":\"Agua mineral natural\",\"variant\":null,\"brand\":\"Marca Ejemplo\",\"size\":\"1,5 l\",\"category\":\"water\",\"code\":\"ME-001\",\"ean\":\"8410000000017\"},\"looksMissed\":2,\"lastSeenWeek\":\"2026-W38\",\"peers\":{\"looked\":5,\"carrying\":4,\"firstWeek\":\"2026-W40\",\"lastWeek\":\"2026-W42\"}},\"event_id\":\"gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42\",\"created_at\":\"2026-10-26T06:12:30.000Z\"}",
"Time": 1792995150
}
]
}Amazon Kinesis Data Streams (kinesis)
Para un flujo de datos de Amazon Kinesis: un PutRecord por mensaje, al flujo por su ARN, con el cuerpo plano en base64 como datos del registro y, como clave de partición, el identificador de la tienda (el de la cuenta para un evento sin tienda), para que los eventos de una tienda guarden su orden en un fragmento (shard). Lo firma el rol que creas para nosotros, con el ExternalId de la dirección.
Webhooks hacia un bus de eventos (EventBridge, Kinesis, Pub/Sub)
Content-Type: application/x-amz-json-1.1
{
"StreamARN": "arn:aws:kinesis:eu-west-1:123456789012:stream/mercamap",
"PartitionKey": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21",
"Data": "eyJldmVudF9pZCI6ImdhcC5vcGVuZWQ6M2Y2YzJhMTAtOGIxZS00YzU1LTlkMmEtNmUwZjFiN2M0YTIxOjdkMmU5YjQ0LTFhM2MtNGY4ZS1iNmQ1LTJjOWEwZTFmM2I1NzoyMDI2LVc0MiIsImV2ZW50X3R5cGUiOiJnYXAub3BlbmVkIiwiZXZlbnRfdmVyc2lvbiI6MSwiY3JlYXRlZF9hdCI6IjIwMjYtMTAtMjZUMDY6MTI6MzAuMDAwWiIsIndlZWsiOiIyMDI2LVc0MiIsImtpbmQiOiJsb3N0Iiwic3RvcmVfaWQiOiIzZjZjMmExMC04YjFlLTRjNTUtOWQyYS02ZTBmMWI3YzRhMjEiLCJzdG9yZV9uYW1lIjoiU3VwZXJtZXJjYWRvIEVqZW1wbG8gQ2VudHJvIiwic3RvcmVfY2hhaW4iOiJFamVtcGxvIiwic3RvcmVfYWRkcmVzcyI6IkNhbGxlIE1heW9yIDUsIDI4MDEzIE1hZHJpZCIsInN0b3JlX3Bvc3Rjb2RlIjoiMjgwMTMiLCJzdG9yZV9sb2NhbGl0eSI6Ik1hZHJpZCIsInN0b3JlX3Byb3ZpbmNlIjoiMjgiLCJzdG9yZV9sYXQiOjQwLjQxNjgsInN0b3JlX2xuZyI6LTMuNzAzOCwic3RvcmVfY29kZSI6IlQtMDA0MiIsInN0b3JlX2NoYWluX2NvZGUiOm51bGwsInN0b3JlX2dsbiI6bnVsbCwicmVmZXJlbmNlX2lkIjoiN2QyZTliNDQtMWEzYy00ZjhlLWI2ZDUtMmM5YTBlMWYzYjU3IiwicmVmZXJlbmNlX25hbWUiOiJBZ3VhIG1pbmVyYWwgbmF0dXJhbCIsInJlZmVyZW5jZV92YXJpYW50IjpudWxsLCJyZWZlcmVuY2VfYnJhbmQiOiJNYXJjYSBFamVtcGxvIiwicmVmZXJlbmNlX3NpemUiOiIxLDUgbCIsInJlZmVyZW5jZV9jYXRlZ29yeSI6IndhdGVyIiwicmVmZXJlbmNlX2NvZGUiOiJNRS0wMDEiLCJyZWZlcmVuY2VfZWFuIjoiODQxMDAwMDAwMDAxNyIsImxvb2tzX21pc3NlZCI6MiwibGFzdF9zZWVuX3dlZWsiOiIyMDI2LVczOCIsInBlZXJzX2xvb2tlZCI6NSwicGVlcnNfY2FycnlpbmciOjQsInBlZXJzX2ZpcnN0X3dlZWsiOiIyMDI2LVc0MCIsInBlZXJzX2xhc3Rfd2VlayI6IjIwMjYtVzQyIn0="
}Google Pub/Sub (pubsub)
Para un tema de Google Pub/Sub: un mensaje por publicación, con nuestro cuerpo en base64 como datos y, como atributos, event_type, event_id, event_version y, si el evento nombra una tienda, store_id. Lo publica la cuenta de servicio de MercaMap, a la que el tema da acceso, y solo mientras la etiqueta mercamap-account del tema nombra tu cuenta.
Webhooks hacia un bus de eventos (EventBridge, Kinesis, Pub/Sub)
Content-Type: application/json
{
"messages": [
{
"data": "eyJpZCI6IjBjMWI3YTUyLTVkNGUtNGIzZi04YTljLTFlMmQzZjRhNWI2YyIsInR5cGUiOiJnYXAub3BlbmVkIiwiZGF0YSI6eyJ3ZWVrIjoiMjAyNi1XNDIiLCJraW5kIjoibG9zdCIsInN0b3JlIjp7ImlkIjoiM2Y2YzJhMTAtOGIxZS00YzU1LTlkMmEtNmUwZjFiN2M0YTIxIiwibmFtZSI6IlN1cGVybWVyY2FkbyBFamVtcGxvIENlbnRybyIsImNoYWluIjoiRWplbXBsbyIsImFkZHJlc3MiOiJDYWxsZSBNYXlvciA1LCAyODAxMyBNYWRyaWQiLCJwb3N0Y29kZSI6IjI4MDEzIiwibG9jYWxpdHkiOiJNYWRyaWQiLCJwcm92aW5jZSI6IjI4IiwibGF0Ijo0MC40MTY4LCJsbmciOi0zLjcwMzgsImNvZGUiOiJULTAwNDIiLCJjaGFpbkNvZGUiOm51bGwsImdsbiI6bnVsbH0sInJlZmVyZW5jZSI6eyJpZCI6IjdkMmU5YjQ0LTFhM2MtNGY4ZS1iNmQ1LTJjOWEwZTFmM2I1NyIsIm5hbWUiOiJBZ3VhIG1pbmVyYWwgbmF0dXJhbCIsInZhcmlhbnQiOm51bGwsImJyYW5kIjoiTWFyY2EgRWplbXBsbyIsInNpemUiOiIxLDUgbCIsImNhdGVnb3J5Ijoid2F0ZXIiLCJjb2RlIjoiTUUtMDAxIiwiZWFuIjoiODQxMDAwMDAwMDAxNyJ9LCJsb29rc01pc3NlZCI6MiwibGFzdFNlZW5XZWVrIjoiMjAyNi1XMzgiLCJwZWVycyI6eyJsb29rZWQiOjUsImNhcnJ5aW5nIjo0LCJmaXJzdFdlZWsiOiIyMDI2LVc0MCIsImxhc3RXZWVrIjoiMjAyNi1XNDIifX0sImV2ZW50X2lkIjoiZ2FwLm9wZW5lZDozZjZjMmExMC04YjFlLTRjNTUtOWQyYS02ZTBmMWI3YzRhMjE6N2QyZTliNDQtMWEzYy00ZjhlLWI2ZDUtMmM5YTBlMWYzYjU3OjIwMjYtVzQyIiwiY3JlYXRlZF9hdCI6IjIwMjYtMTAtMjZUMDY6MTI6MzAuMDAwWiJ9",
"attributes": {
"event_type": "gap.opened",
"event_id": "gap.opened:3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21:7d2e9b44-1a3c-4f8e-b6d5-2c9a0e1f3b57:2026-W42",
"event_version": "1",
"store_id": "3f6c2a10-8b1e-4c55-9d2a-6e0f1b7c4a21"
}
}
]
}Comprobar la firma
La cabecera de firma dice t=…,v1=…: t es la hora en segundos Unix y v1 el HMAC-SHA-256, en hexadecimal, de t, un punto y el cuerpo tal cual llega, hecho con el secreto de la dirección (empieza por whsec_). Vuelve a calcularlo, compáralo en tiempo constante y acepta el mensaje solo dentro de 5 minutos desde t: así se evita una repetición.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody: the request body exactly as received (a Buffer or a string), never re-serialised.
export function verify(secret, rawBody, header, now = Date.now()) {
if (typeof header !== 'string') return false;
const parts = header.split(',').map((part) => part.trim().split('='));
const t = Number(parts.find(([key]) => key === 't')?.[1]);
if (!Number.isInteger(t) || Math.abs(now / 1000 - t) > 300) return false;
const expected = createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest();
// While a secret is being changed the header carries one v1 per secret: any may match.
return parts.some(([key, value]) => {
if (key !== 'v1' || !/^[0-9a-f]{64}$/.test(value ?? '')) return false;
const given = Buffer.from(value, 'hex');
return given.length === expected.length && timingSafeEqual(given, expected);
});
}Standard Webhooks
Un secreto con la forma de Standard Webhooks (whsec_ y el base64 estándar de 32 bytes aleatorios: todo secreto creado o cambiado desde que llegaron estas cabeceras) firma además webhook-id, webhook-timestamp y webhook-signature, para que las bibliotecas de la especificación comprueben el mensaje: la clave es el base64 del secreto descodificado tras whsec_, el texto firmado es el identificador, la hora y el cuerpo tal cual llega unidos por puntos, y webhook-signature lleva v1, y el HMAC-SHA-256 en base64, uno por secreto durante un cambio. Un secreto anterior firma solo la nuestra: la ficha de la dirección, en «Conectores», dice cuál, y cambiar el secreto las añade. La comprobación, sin biblioteca:
import { createHmac, timingSafeEqual } from 'node:crypto';
// headers: the request's headers, their names in lower case; rawBody exactly as received.
export function verifyStandard(secret, headers, rawBody, now = Date.now()) {
const id = headers['webhook-id'];
const t = Number(headers['webhook-timestamp']);
const signatures = headers['webhook-signature'];
if (typeof id !== 'string' || typeof signatures !== 'string') return false;
if (!Number.isInteger(t) || Math.abs(now / 1000 - t) > 300) return false;
const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
const expected = createHmac('sha256', key).update(`${id}.${t}.`).update(rawBody).digest();
return signatures.split(' ').some((signature) => {
const [version, value] = signature.split(',');
if (version !== 'v1' || !value) return false;
const given = Buffer.from(value, 'base64');
return given.length === expected.length && timingSafeEqual(given, expected);
});
}Reintentos
Cualquier 2xx es una entrega. Un 410 desactiva la dirección al momento. Un 400, 401, 403, 404, 413 o 422 termina el mensaje al momento y cuenta como un fallo, porque el mismo mensaje se volvería a rechazar. Todo lo demás (un 408, un 429, un 5xx, ninguna respuesta a tiempo) se reintenta según el calendario de abajo, más tarde si tu Retry-After lo pide, nunca después de su último paso; los demás mensajes de esa dirección esperan entonces a la siguiente ejecución.
Un mensaje que falla se reintenta al cabo de 5 minutos, 5 minutos, 30 minutos, 2 horas, 12 horas y 24 horas: 7 intentos en total, y después se descarta. 20 intentos fallidos seguidos desactivan la dirección hasta que un administrador la vuelve a activar en su ficha, en «Conectores».
Configurar Tealium
- En Tealium («Connect» › «Data Sources»), añade una fuente de datos «HTTP API – Advanced» y publica el perfil: su clave está en la página de la fuente, en «Data Source Key». MercaMap no crea ninguna fuente de datos ni lee ninguna de Tealium: tú escribes la cuenta, el perfil y la clave.
- En «Conectores» › «Tealium EventStream», añade una dirección con la cuenta, el perfil y la clave, o la dirección que Tealium generó para la fuente, que lleva la región del perfil (si no, escríbela en «Región»; sin ella, el servidor global reenvía los eventos a esa región). ID de visitante: ninguno para EventStream, que no lo necesita; con AudienceStream activo en el perfil, uno por tienda, o pide al soporte de Tealium que deje estos eventos fuera con su filtro de eventos, porque AudienceStream guarda un visitante por cada evento que no nombra ninguno.
- En «Nombres de los eventos en Tealium», da a cualquier evento el tealium_event que usen tus especificaciones (letras minúsculas, cifras y guiones bajos); si lo dejas vacío, es el nuestro (mercamap_gap_opened…). Crea en Tealium una especificación por cada evento que escuches, con ese nombre y los atributos que cada evento lista abajo, precedidos de mercamap_.
- En «Tus parámetros», añade hasta 20, cada uno un texto fijo o la copia de un atributo del evento con tu nombre. Los nombres que empiezan por tealium_ o mercamap_ son de Tealium y nuestros, y tealium_trace_id no es un parámetro: Tealium pide no poner un ID de traza en eventos agrupados ni en datos de producción.
- Cada evento cuenta como un evento entrante en la facturación de Tealium: prefiere la instantánea semanal y los eventos de cambio, y lee el resto con la API.
Configurar Segment o RudderStack
- Añade una fuente HTTP API en Segment (o en RudderStack) y copia su clave de escritura.
- En «Conectores» › «Segment», o «RudderStack», añade una dirección: la región de tu espacio de Segment (Segment rechaza los datos enviados a la otra región), o RudderStack y la dirección https de su data plane, y la clave de escritura.
- Asigna las llamadas track (Gap Opened, Shelf Snapshot…) a tus destinos; messageId permite a Segment descartar un repetido.
Eventos
release.published
Una semana nueva en el portal
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso releases:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
storesObligatorio | integer |
Sus atributos en forma plana (6)
En Tealium el evento es mercamap_release_published si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Release Published.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| stores | mercamap_stores |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
issues.opened
Incidencias abiertas por las observaciones
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso issues:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
countObligatorio | integer |
Sus atributos en forma plana (6)
En Tealium el evento es mercamap_issues_opened si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Issues Opened.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| count | mercamap_count |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
issue.verified
Incidencias comprobadas en el siguiente recorrido
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso issues:read y el de los webhooks.
Como mucho 200 identificadores de incidencias por mensaje; el resto van en mensajes siguientes.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
issueIdsObligatorio | uuid[] | De 1 a 200 elementos |
Sus atributos en forma plana (6)
En Tealium el evento es mercamap_issue_verified si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Issue Verified.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| issue_ids | mercamap_issue_ids |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
order.confirmed
Un pedido confirmado por la tienda
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso orders:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
orderIdObligatorio | uuid |
Sus atributos en forma plana (5)
En Tealium el evento es mercamap_order_confirmed si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Order Confirmed.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| order_id | mercamap_order_id |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
delivery.recorded
Un albarán registrado
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso deliveries:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
deliveryIdObligatorio | uuid |
Sus atributos en forma plana (5)
En Tealium el evento es mercamap_delivery_recorded si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Delivery Recorded.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| delivery_id | mercamap_delivery_id |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
campaign.response
La respuesta de una tienda a una campaña
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso campaigns:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
campaignIdObligatorio | uuid | |
storeIdObligatorio | uuid |
Sus atributos en forma plana (6)
En Tealium el evento es mercamap_campaign_response si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Campaign Response.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| campaign_id | mercamap_campaign_id |
| store_id | mercamap_store_id |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
import.applied
Una importación aplicada
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso catalogue:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
importIdObligatorio | uuid | |
kindObligatorio | string | Uno de: skus, store_codes, price_list, order_status, van_load, expectations, visits, sales, calendar, margins |
appliedObligatorio | integer | |
refusedObligatorio | integer |
Sus atributos en forma plana (8)
En Tealium el evento es mercamap_import_applied si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Import Applied.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| import_id | mercamap_import_id |
| kind | mercamap_kind |
| applied | mercamap_applied |
| refused | mercamap_refused |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
import.ended
Una importación terminada, con su estado y sus recuentos
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso catalogue:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
jobIdObligatorio | uuid | |
kindObligatorio | string | Uno de: skus, store_codes, price_list, order_status, van_load, expectations, visits, sales, calendar, margins |
sourceObligatorio | string | Uno de: upload, pull, email, api |
stateObligatorio | string | Uno de: uploading, mapping, queued, running, done, failed, cancelled, expired |
rowsObligatorio | integer | null | |
addedObligatorio | integer | null | |
updatedObligatorio | integer | null | |
removedObligatorio | integer | null | |
refusedObligatorio | integer | null | |
errorObligatorio | string | null | Uno de: fileGone, clash, closed, fault, tooLarge, tooManyRows, tooManyColumns, noHeader, unsupportedFormat, unreadable, archiveNoFile, archiveChoice, archiveNested, archivePassword, archivePasswordWrong, archiveUnsafe, archiveFormat |
importIdObligatorio | uuid | null |
Sus atributos en forma plana (15)
En Tealium el evento es mercamap_import_ended si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Import Ended.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| job_id | mercamap_job_id |
| kind | mercamap_kind |
| source | mercamap_source |
| state | mercamap_state |
| rows | mercamap_rows |
| added | mercamap_added |
| updated | mercamap_updated |
| removed | mercamap_removed |
| refused | mercamap_refused |
| error | mercamap_error |
| import_id | mercamap_import_id |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
summary.ready
El resumen de una semana nueva, con los recuentos de sus alertas
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso data:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
unseenObligatorio | integer | |
priceChangesObligatorio | integer | |
newReferencesObligatorio | integer |
Sus atributos en forma plana (8)
En Tealium el evento es mercamap_summary_ready si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Summary Ready.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| unseen | mercamap_unseen |
| price_changes | mercamap_price_changes |
| new_references | mercamap_new_references |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
gap.opened
Un hueco de distribución abierto en una tienda, con la tienda y la referencia
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso data:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
kindObligatorio | string | Uno de: never, lost |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
referenceObligatorio | object | |
reference.idObligatorio | uuid | |
reference.nameObligatorio | string | De 1 a 300 caracteres |
reference.variantObligatorio | string | null | De 1 a 200 caracteres |
reference.brandObligatorio | string | null | De 1 a 200 caracteres |
reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
reference.categoryObligatorio | string | De 1 a 100 caracteres |
reference.codeObligatorio | string | null | De 1 a 40 caracteres |
reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
looksMissedObligatorio | integer | |
lastSeenWeekObligatorio | string | null | Una semana ISO, como 2026-W41 |
peersObligatorio | object | |
peers.lookedObligatorio | integer | |
peers.carryingObligatorio | integer | |
peers.firstWeekObligatorio | string | Una semana ISO, como 2026-W41 |
peers.lastWeekObligatorio | string | Una semana ISO, como 2026-W41 |
Sus atributos en forma plana (32)
En Tealium el evento es mercamap_gap_opened si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Gap Opened.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| kind | mercamap_kind |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| looks_missed | mercamap_looks_missed |
| last_seen_week | mercamap_last_seen_week |
| peers_looked | mercamap_peers_looked |
| peers_carrying | mercamap_peers_carrying |
| peers_first_week | mercamap_peers_first_week |
| peers_last_week | mercamap_peers_last_week |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
gap.closed
Un hueco de distribución cerrado, y cómo se cerró
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso data:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
kindObligatorio | string | Uno de: never, lost |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
referenceObligatorio | object | |
reference.idObligatorio | uuid | |
reference.nameObligatorio | string | De 1 a 300 caracteres |
reference.variantObligatorio | string | null | De 1 a 200 caracteres |
reference.brandObligatorio | string | null | De 1 a 200 caracteres |
reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
reference.categoryObligatorio | string | De 1 a 100 caracteres |
reference.codeObligatorio | string | null | De 1 a 40 caracteres |
reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
howObligatorio | string | Uno de: seen, cleared |
openedWeekObligatorio | string | Una semana ISO, como 2026-W41 |
seenWeekObligatorio | string | null | Una semana ISO, como 2026-W41 |
weeksOpenObligatorio | integer |
Sus atributos en forma plana (30)
En Tealium el evento es mercamap_gap_closed si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Gap Closed.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| kind | mercamap_kind |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| how | mercamap_how |
| opened_week | mercamap_opened_week |
| seen_week | mercamap_seen_week |
| weeks_open | mercamap_weeks_open |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
issue.opened
Una incidencia de lineal abierta, con la tienda y la referencia
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso issues:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
issueIdObligatorio | uuid | |
kindObligatorio | string | Uno de: gap, level, facings, price, promotion, planogram, listing, other |
sourceObligatorio | string | Uno de: crowd, team, campaign, manual, csv, api |
priorityObligatorio | integer | De 1 a 4 |
weekObligatorio | string | Una semana ISO, como 2026-W41 |
reopenedObligatorio | integer | |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
referenceObligatorio | object | null | |
reference.idObligatorio | uuid | |
reference.nameObligatorio | string | De 1 a 300 caracteres |
reference.variantObligatorio | string | null | De 1 a 200 caracteres |
reference.brandObligatorio | string | null | De 1 a 200 caracteres |
reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
reference.categoryObligatorio | string | De 1 a 100 caracteres |
reference.codeObligatorio | string | null | De 1 a 40 caracteres |
reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
categoryObligatorio | string | null | De 1 a 100 caracteres |
Sus atributos en forma plana (31)
En Tealium el evento es mercamap_issue_opened si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Issue Opened.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| issue_id | mercamap_issue_id |
| kind | mercamap_kind |
| source | mercamap_source |
| priority | mercamap_priority |
| week | mercamap_week |
| reopened | mercamap_reopened |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| category | mercamap_category |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
issue.closed
Una incidencia de lineal cerrada, y cómo se cerró
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso issues:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
issueIdObligatorio | uuid | |
kindObligatorio | string | Uno de: gap, level, facings, price, promotion, planogram, listing, other |
statusObligatorio | string | Uno de: verified, closed, declined, dismissed |
resolutionObligatorio | string | null | Uno de: confirmed, cleared, team_confirmed, unchecked, declined, dismissed, expired |
openedWeekObligatorio | string | Una semana ISO, como 2026-W41 |
weekObligatorio | string | Una semana ISO, como 2026-W41 |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
referenceObligatorio | object | null | |
reference.idObligatorio | uuid | |
reference.nameObligatorio | string | De 1 a 300 caracteres |
reference.variantObligatorio | string | null | De 1 a 200 caracteres |
reference.brandObligatorio | string | null | De 1 a 200 caracteres |
reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
reference.categoryObligatorio | string | De 1 a 100 caracteres |
reference.codeObligatorio | string | null | De 1 a 40 caracteres |
reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
categoryObligatorio | string | null | De 1 a 100 caracteres |
Sus atributos en forma plana (31)
En Tealium el evento es mercamap_issue_closed si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Issue Closed.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| issue_id | mercamap_issue_id |
| kind | mercamap_kind |
| status | mercamap_status |
| resolution | mercamap_resolution |
| opened_week | mercamap_opened_week |
| week | mercamap_week |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| category | mercamap_category |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
price.changed
Un precio observado que ha cambiado un 5 % o más
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso data:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
previousWeekObligatorio | string | Una semana ISO, como 2026-W41 |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
referenceObligatorio | object | |
reference.idObligatorio | uuid | |
reference.nameObligatorio | string | De 1 a 300 caracteres |
reference.variantObligatorio | string | null | De 1 a 200 caracteres |
reference.brandObligatorio | string | null | De 1 a 200 caracteres |
reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
reference.categoryObligatorio | string | De 1 a 100 caracteres |
reference.codeObligatorio | string | null | De 1 a 40 caracteres |
reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
priceCentsObligatorio | integer | |
previousCentsObligatorio | integer | |
changePercentObligatorio | integer | |
promotionalObligatorio | boolean | null |
Sus atributos en forma plana (30)
En Tealium el evento es mercamap_price_changed si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Price Changed.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| previous_week | mercamap_previous_week |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| price_cents | mercamap_price_cents |
| previous_cents | mercamap_previous_cents |
| change_percent | mercamap_change_percent |
| promotional | mercamap_promotional |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
promotion.result
Una promoción seguida en el lineal: su resultado por tienda y semana
Módulo de campo: solo se escucha mientras el módulo está abierto para la cuenta.
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso campaigns:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
campaignIdObligatorio | uuid | |
weekObligatorio | string | Una semana ISO, como 2026-W41 |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
referenceObligatorio | object | null | |
reference.idObligatorio | uuid | |
reference.nameObligatorio | string | De 1 a 300 caracteres |
reference.variantObligatorio | string | null | De 1 a 200 caracteres |
reference.brandObligatorio | string | null | De 1 a 200 caracteres |
reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
reference.categoryObligatorio | string | De 1 a 100 caracteres |
reference.codeObligatorio | string | null | De 1 a 40 caracteres |
reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
resultObligatorio | string | Uno de: observed, not_observed, unchecked, no_walk |
reasonObligatorio | string | null | Uno de: elsewhere, not_seen, no_promo, no_frames, place_not_looked, level_not_measured, label_not_read, seen_no_frame |
placeObligatorio | string | null | Uno de: aisle, endcap, checkout, entrance, department, other |
levelObligatorio | string | null | Uno de: stoop, grab, eye, stretch |
labelObligatorio | object | null | |
label.readObligatorio | boolean | |
label.promotionObligatorio | boolean | |
label.promotionBelowObligatorio | boolean | |
sharedSpaceObligatorio | object | null | |
sharedSpace.locationKeyObligatorio | string | De 1 a 200 caracteres |
sharedSpace.brandsObligatorio | object[] | Hasta 200 elementos |
sharedSpace.brands[].brandKeyObligatorio | string | De 1 a 200 caracteres |
sharedSpace.brands[].brandNameObligatorio | string | Hasta 200 caracteres |
sharedSpace.brands[].privateLabelObligatorio | boolean | |
sharedSpace.brands[].referencesObligatorio | integer | |
sharedSpace.brands[].facingsObligatorio | integer | |
sharedSpace.brands[].facingsCountedObligatorio | integer | |
sharedSpace.brands[].eyeLevelObligatorio | integer | |
sharedSpace.brands[].medianPriceCentsObligatorio | integer | null | |
sharedSpace.totalsObligatorio | object | |
sharedSpace.totals.referencesObligatorio | integer | |
sharedSpace.totals.facingsObligatorio | integer | |
sharedSpace.totals.facingsCountedObligatorio | integer | |
sharedSpace.totals.eyeLevelObligatorio | integer |
Sus atributos en forma plana (46)
En Tealium el evento es mercamap_promotion_result si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Promotion Result.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| campaign_id | mercamap_campaign_id |
| week | mercamap_week |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| result | mercamap_result |
| reason | mercamap_reason |
| place | mercamap_place |
| level | mercamap_level |
| label_read | mercamap_label_read |
| label_promotion | mercamap_label_promotion |
| label_promotion_below | mercamap_label_promotion_below |
| shared_space_location_key | mercamap_shared_space_location_key |
| shared_space_brand_key | mercamap_shared_space_brand_key |
| shared_space_brand_name | mercamap_shared_space_brand_name |
| shared_space_brand_private_label | mercamap_shared_space_brand_private_label |
| shared_space_brand_references | mercamap_shared_space_brand_references |
| shared_space_brand_facings | mercamap_shared_space_brand_facings |
| shared_space_brand_facings_counted | mercamap_shared_space_brand_facings_counted |
| shared_space_brand_eye_level | mercamap_shared_space_brand_eye_level |
| shared_space_brand_median_price_cents | mercamap_shared_space_brand_median_price_cents |
| shared_space_totals_references | mercamap_shared_space_totals_references |
| shared_space_totals_facings | mercamap_shared_space_totals_facings |
| shared_space_totals_facings_counted | mercamap_shared_space_totals_facings_counted |
| shared_space_totals_eye_level | mercamap_shared_space_totals_eye_level |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
shelf.snapshot
Cada tienda y semana publicadas: tus referencias, si se vieron, dónde y a qué precio
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso data:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
storeObligatorio | object | |
store.idObligatorio | uuid | |
store.nameObligatorio | string | De 1 a 300 caracteres |
store.chainObligatorio | string | null | De 1 a 100 caracteres |
store.addressObligatorio | string | null | De 1 a 300 caracteres |
store.postcodeObligatorio | string | null | Patrón: ^\d{5}$ |
store.localityObligatorio | string | null | De 1 a 120 caracteres |
store.provinceObligatorio | string | null | Patrón: ^\d{2}$ |
store.latObligatorio | number | De -90 a 90 |
store.lngObligatorio | number | De -180 a 180 |
store.codeObligatorio | string | null | De 1 a 40 caracteres |
store.chainCodeObligatorio | string | null | De 1 a 40 caracteres |
store.glnObligatorio | string | null | Patrón: ^\d{13}$ |
partObligatorio | integer | |
partsObligatorio | integer | |
referencesObligatorio | object[] | De 1 a 50 elementos |
references[].referenceObligatorio | object | |
references[].reference.idObligatorio | uuid | |
references[].reference.nameObligatorio | string | De 1 a 300 caracteres |
references[].reference.variantObligatorio | string | null | De 1 a 200 caracteres |
references[].reference.brandObligatorio | string | null | De 1 a 200 caracteres |
references[].reference.sizeObligatorio | string | null | De 1 a 100 caracteres |
references[].reference.categoryObligatorio | string | De 1 a 100 caracteres |
references[].reference.codeObligatorio | string | null | De 1 a 40 caracteres |
references[].reference.eanObligatorio | string | null | Patrón: ^(\d{8}|\d{12,14})$ |
references[].seenObligatorio | boolean | |
references[].locationsObligatorio | integer | null | |
references[].facingsObligatorio | integer | null | |
references[].levelObligatorio | string | null | Uno de: stoop, grab, eye, stretch |
references[].sectionObligatorio | string | null | De 1 a 200 caracteres |
references[].priceCentsObligatorio | integer | null | |
references[].promotionalObligatorio | boolean | null |
Sus atributos en forma plana (34)
En Tealium el evento es mercamap_shelf_snapshot si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile, tealium_visitor_id); en Segment, Shelf Snapshot.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| store_id | mercamap_store_id |
| store_name | mercamap_store_name |
| store_chain | mercamap_store_chain |
| store_address | mercamap_store_address |
| store_postcode | mercamap_store_postcode |
| store_locality | mercamap_store_locality |
| store_province | mercamap_store_province |
| store_lat | mercamap_store_lat |
| store_lng | mercamap_store_lng |
| store_code | mercamap_store_code |
| store_chain_code | mercamap_store_chain_code |
| store_gln | mercamap_store_gln |
| part | mercamap_part |
| parts | mercamap_parts |
| reference_id | mercamap_reference_id |
| reference_name | mercamap_reference_name |
| reference_variant | mercamap_reference_variant |
| reference_brand | mercamap_reference_brand |
| reference_size | mercamap_reference_size |
| reference_category | mercamap_reference_category |
| reference_code | mercamap_reference_code |
| reference_ean | mercamap_reference_ean |
| reference_seen | mercamap_reference_seen |
| reference_locations | mercamap_reference_locations |
| reference_facings | mercamap_reference_facings |
| reference_level | mercamap_reference_level |
| reference_section | mercamap_reference_section |
| reference_price_cents | mercamap_reference_price_cents |
| reference_promotional | mercamap_reference_promotional |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
ledger.updated
Tu registro de valor ha cambiado: sus cuatro líneas, con sus recuentos y sus euros estimados con tus cifras
Un evento de datos: lleva los bloques de la tienda y de la referencia de abajo, con los códigos que les dio tu catálogo, y solo semanas, nunca fechas ni horas.
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso data:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
windowObligatorio | object | |
window.kindObligatorio | string | Uno de: recent, pilot |
window.fromObligatorio | string | Una semana ISO, como 2026-W41 |
window.toObligatorio | string | Una semana ISO, como 2026-W41 |
window.weeksObligatorio | integer | |
gapsClosedObligatorio | object | |
gapsClosed.countObligatorio | integer | |
gapsClosed.storesObligatorio | integer | |
gapsClosed.nObligatorio | integer | |
gapsClosed.weeksObligatorio | integer | |
gapsClosed.valuedObligatorio | integer | |
gapsClosed.centsObligatorio | integer | null | |
gapsClosed.sourcesObligatorio | object | |
gapsClosed.sources.salesObligatorio | integer | |
gapsClosed.sources.referenceObligatorio | integer | |
gapsClosed.sources.defaultObligatorio | integer | |
gapsClosed.indicativeObligatorio | boolean | |
gapsOpenObligatorio | object | |
gapsOpen.countObligatorio | integer | |
gapsOpen.storesObligatorio | integer | |
gapsOpen.nObligatorio | integer | |
gapsOpen.weeksObligatorio | integer | |
gapsOpen.valuedObligatorio | integer | |
gapsOpen.centsObligatorio | integer | null | |
gapsOpen.sourcesObligatorio | object | |
gapsOpen.sources.salesObligatorio | integer | |
gapsOpen.sources.referenceObligatorio | integer | |
gapsOpen.sources.defaultObligatorio | integer | |
gapsOpen.indicativeObligatorio | boolean | |
campaignsObligatorio | object | |
campaigns.countObligatorio | integer | |
campaigns.costedObligatorio | integer | |
campaigns.observedObligatorio | integer | |
campaigns.notObservedObligatorio | integer | |
campaigns.uncheckedObligatorio | integer | |
campaigns.noWalkObligatorio | integer | |
campaigns.centsObligatorio | integer | null | |
campaigns.nObligatorio | integer | |
campaigns.indicativeObligatorio | boolean | |
visitsObligatorio | object | |
visits.modeObligatorio | string | Uno de: counted, estimated |
visits.countObligatorio | integer | |
visits.nObligatorio | integer | |
visits.centsObligatorio | integer | null | |
visits.indicativeObligatorio | boolean | |
inputsObligatorio | object | |
inputs.visitCostCentsObligatorio | object | null | |
inputs.visitCostCents.valueObligatorio | integer | |
inputs.visitCostCents.setWeekObligatorio | string | Una semana ISO, como 2026-W41 |
inputs.marginCentsObligatorio | object | null | |
inputs.marginCents.valueObligatorio | integer | |
inputs.marginCents.setWeekObligatorio | string | Una semana ISO, como 2026-W41 |
inputs.marginRateBpObligatorio | object | null | |
inputs.marginRateBp.valueObligatorio | integer | |
inputs.marginRateBp.setWeekObligatorio | string | Una semana ISO, como 2026-W41 |
inputs.referenceMarginsObligatorio | object | null | |
inputs.referenceMargins.countObligatorio | integer | |
inputs.referenceMargins.latestWeekObligatorio | string | Una semana ISO, como 2026-W41 |
Sus atributos en forma plana (51)
En Tealium el evento es mercamap_ledger_updated si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Ledger Updated.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| window_kind | mercamap_window_kind |
| window_from | mercamap_window_from |
| window_to | mercamap_window_to |
| window_weeks | mercamap_window_weeks |
| gaps_closed_count | mercamap_gaps_closed_count |
| gaps_closed_stores | mercamap_gaps_closed_stores |
| gaps_closed_n | mercamap_gaps_closed_n |
| gaps_closed_weeks | mercamap_gaps_closed_weeks |
| gaps_closed_valued | mercamap_gaps_closed_valued |
| gaps_closed_cents | mercamap_gaps_closed_cents |
| gaps_closed_sources_sales | mercamap_gaps_closed_sources_sales |
| gaps_closed_sources_reference | mercamap_gaps_closed_sources_reference |
| gaps_closed_sources_default | mercamap_gaps_closed_sources_default |
| gaps_closed_indicative | mercamap_gaps_closed_indicative |
| gaps_open_count | mercamap_gaps_open_count |
| gaps_open_stores | mercamap_gaps_open_stores |
| gaps_open_n | mercamap_gaps_open_n |
| gaps_open_weeks | mercamap_gaps_open_weeks |
| gaps_open_valued | mercamap_gaps_open_valued |
| gaps_open_cents | mercamap_gaps_open_cents |
| gaps_open_sources_sales | mercamap_gaps_open_sources_sales |
| gaps_open_sources_reference | mercamap_gaps_open_sources_reference |
| gaps_open_sources_default | mercamap_gaps_open_sources_default |
| gaps_open_indicative | mercamap_gaps_open_indicative |
| campaigns_count | mercamap_campaigns_count |
| campaigns_costed | mercamap_campaigns_costed |
| campaigns_observed | mercamap_campaigns_observed |
| campaigns_not_observed | mercamap_campaigns_not_observed |
| campaigns_unchecked | mercamap_campaigns_unchecked |
| campaigns_no_walk | mercamap_campaigns_no_walk |
| campaigns_cents | mercamap_campaigns_cents |
| campaigns_n | mercamap_campaigns_n |
| campaigns_indicative | mercamap_campaigns_indicative |
| visits_mode | mercamap_visits_mode |
| visits_count | mercamap_visits_count |
| visits_n | mercamap_visits_n |
| visits_cents | mercamap_visits_cents |
| visits_indicative | mercamap_visits_indicative |
| inputs_visit_cost_cents_value | mercamap_inputs_visit_cost_cents_value |
| inputs_visit_cost_cents_set_week | mercamap_inputs_visit_cost_cents_set_week |
| inputs_margin_cents_value | mercamap_inputs_margin_cents_value |
| inputs_margin_cents_set_week | mercamap_inputs_margin_cents_set_week |
| inputs_margin_rate_bp_value | mercamap_inputs_margin_rate_bp_value |
| inputs_margin_rate_bp_set_week | mercamap_inputs_margin_rate_bp_set_week |
| inputs_reference_margins_count | mercamap_inputs_reference_margins_count |
| inputs_reference_margins_latest_week | mercamap_inputs_reference_margins_latest_week |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
forecast.issued
Las previsiones de una semana nueva: cuántas de cada tipo y cuántas te destacamos
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso forecasts:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
kindsObligatorio | object[] | De 1 a 10 elementos |
kinds[].kindObligatorio | string | Uno de: gap_risk, promotion_risk, launch_reach, shelf_loss, order_quantity, chain_presence, label_expiry, store_change, spot_change, brand_trouble |
kinds[].issuedObligatorio | integer | |
kinds[].shownObligatorio | integer |
Sus atributos en forma plana (8)
En Tealium el evento es mercamap_forecast_issued si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Forecast Issued.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| kind | mercamap_kind |
| kind_issued | mercamap_kind_issued |
| kind_shown | mercamap_kind_shown |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
priorities.ready
Tus prioridades de la semana: cuántas referencias por riesgo, lo que hay en juego estimado con tus cifras y las primeras tiendas
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso forecasts:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
weekObligatorio | string | Una semana ISO, como 2026-W41 |
bandsObligatorio | object | |
bands.highObligatorio | integer | |
bands.mediumObligatorio | integer | |
bands.lowObligatorio | integer | |
storesObligatorio | integer | |
stakeCentsObligatorio | integer | null | |
firstObligatorio | object[] | Hasta 10 elementos |
first[].storeIdObligatorio | uuid | |
first[].rankObligatorio | integer | |
first[].highObligatorio | integer | |
first[].mediumObligatorio | integer | |
first[].stakeCentsObligatorio | integer | null |
Sus atributos en forma plana (15)
En Tealium el evento es mercamap_priorities_ready si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Priorities Ready.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| week | mercamap_week |
| bands_high | mercamap_bands_high |
| bands_medium | mercamap_bands_medium |
| bands_low | mercamap_bands_low |
| stores | mercamap_stores |
| stake_cents | mercamap_stake_cents |
| first_store_id | mercamap_first_store_id |
| first_rank | mercamap_first_rank |
| first_high | mercamap_first_high |
| first_medium | mercamap_first_medium |
| first_stake_cents | mercamap_first_stake_cents |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
promotion.risk
La previsión de una tienda antes de que empiece una promoción que sigues, cuando se emite o cambia de nivel
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso forecasts:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
campaignIdObligatorio | uuid | |
storeIdObligatorio | uuid | |
weekObligatorio | string | Una semana ISO, como 2026-W41 |
fromWeekObligatorio | string | Una semana ISO, como 2026-W41 |
bandObligatorio | string | Uno de: high, medium, low |
previousBandObligatorio | string | null | Uno de: high, medium, low |
Sus atributos en forma plana (10)
En Tealium el evento es mercamap_promotion_risk si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Promotion Risk.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| campaign_id | mercamap_campaign_id |
| store_id | mercamap_store_id |
| week | mercamap_week |
| from_week | mercamap_from_week |
| band | mercamap_band |
| previous_band | mercamap_previous_band |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.
launch.curve
La previsión de un lanzamiento tras cada semana publicada: lo visto frente a tu objetivo, el alcance previsto con su intervalo y la semana prevista para tu objetivo
Por la API, la clave que se suscribe a él o lee sus avisos necesita el permiso forecasts:read y el de los webhooks.
Datos del evento
| Campo | Tipo | Notas |
|---|---|---|
expectationIdObligatorio | uuid | |
productIdObligatorio | uuid | |
weekObligatorio | string | Una semana ISO, como 2026-W41 |
observedObligatorio | object | |
observed.seenObligatorio | integer | |
observed.lookedObligatorio | integer | |
observed.shareObligatorio | number | null | De 0 a 1 |
verdictObligatorio | string | null | Uno de: behind, in_line, ahead, insufficient |
forecastObligatorio | object | null | |
forecast.weekObligatorio | string | Una semana ISO, como 2026-W41 |
forecast.shareObligatorio | number | De 0 a 1 |
forecast.lowObligatorio | number | De 0 a 1 |
forecast.highObligatorio | number | De 0 a 1 |
forecast.levelObligatorio | number | De 0 a 1 |
targetWeekObligatorio | object | null | |
targetWeek.weekObligatorio | string | null | Una semana ISO, como 2026-W41 |
targetWeek.earliestObligatorio | string | null | Una semana ISO, como 2026-W41 |
targetWeek.latestObligatorio | string | null | Una semana ISO, como 2026-W41 |
targetWeek.beyondObligatorio | boolean | |
reachObligatorio | number | null | De 0 a 1 |
methodObligatorio | string | Uno de: rule, model |
Sus atributos en forma plana (22)
En Tealium el evento es mercamap_launch_curve si la dirección no lo renombra, junto a los propios de Tealium (tealium_event, tealium_account, tealium_profile); en Segment, Launch Curve.
| JSON plano | Tealium |
|---|---|
| event_id | mercamap_event_id |
| event_type | mercamap_event_type |
| event_version | mercamap_event_version |
| created_at | mercamap_created_at |
| expectation_id | mercamap_expectation_id |
| product_id | mercamap_product_id |
| week | mercamap_week |
| observed_seen | mercamap_observed_seen |
| observed_looked | mercamap_observed_looked |
| observed_share | mercamap_observed_share |
| verdict | mercamap_verdict |
| forecast_week | mercamap_forecast_week |
| forecast_share | mercamap_forecast_share |
| forecast_low | mercamap_forecast_low |
| forecast_high | mercamap_forecast_high |
| forecast_level | mercamap_forecast_level |
| target_week_week | mercamap_target_week_week |
| target_week_earliest | mercamap_target_week_earliest |
| target_week_latest | mercamap_target_week_latest |
| target_week_beyond | mercamap_target_week_beyond |
| reach | mercamap_reach |
| method | mercamap_method |
El JSON plano, Adobe Experience Platform y las properties de Segment llevan los nombres de la izquierda; tealium_visitor_id solo va si la dirección envía un visitante por tienda. Un campo nulo en un mensaje va como un solo atributo con su propio nombre, y una lista sin elementos no lleva ninguno de los atributos de su elemento.