Saltar al contenido

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.

Los textos que vienen de la propia API (títulos, descripciones, errores) están en inglés, como en su documento OpenAPI.

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

CabeceraValor
MercaMap-Event-IdEl identificador del mensaje: ignora un identificador que ya hayas tratado.
MercaMap-Event-TypeEl evento, como en el cuerpo.
MercaMap-SignatureLa firma, como se explica abajo.
webhook-idEl identificador del evento: el mismo para todas las direcciones y en cada reintento (Standard Webhooks).
webhook-timestampLa hora en segundos Unix, firmada con el identificador y el cuerpo.
webhook-signaturev1, y la firma en base64, una por secreto durante un cambio; solo con un secreto con la forma de Standard Webhooks.
User-AgentMercaMap-Webhooks/1.0: Quién lo envía.

Cuerpo

Cuerpo
CampoTipoNotas
idObligatoriouuid
typeObligatoriostringUno 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
dataObligatorioobject
event_idObligatoriostring
created_atObligatoriodate-time

Cómo configurar uno

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

  1. 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.
  2. 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.
  3. 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_.
  4. 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.
  5. 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

  1. Añade una fuente HTTP API en Segment (o en RudderStack) y copia su clave de escritura.
  2. 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.
  3. 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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
storesObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
storesmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
countObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
countmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
issueIdsObligatoriouuid[]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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
issue_idsmercamap_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

Datos del evento
CampoTipoNotas
orderIdObligatoriouuid
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
order_idmercamap_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

Datos del evento
CampoTipoNotas
deliveryIdObligatoriouuid
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
delivery_idmercamap_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

Datos del evento
CampoTipoNotas
campaignIdObligatoriouuid
storeIdObligatoriouuid
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
campaign_idmercamap_campaign_id
store_idmercamap_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

Datos del evento
CampoTipoNotas
importIdObligatoriouuid
kindObligatoriostringUno de: skus, store_codes, price_list, order_status, van_load, expectations, visits, sales, calendar, margins
appliedObligatoriointeger
refusedObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
import_idmercamap_import_id
kindmercamap_kind
appliedmercamap_applied
refusedmercamap_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

Datos del evento
CampoTipoNotas
jobIdObligatoriouuid
kindObligatoriostringUno de: skus, store_codes, price_list, order_status, van_load, expectations, visits, sales, calendar, margins
sourceObligatoriostringUno de: upload, pull, email, api
stateObligatoriostringUno de: uploading, mapping, queued, running, done, failed, cancelled, expired
rowsObligatoriointeger | null
addedObligatoriointeger | null
updatedObligatoriointeger | null
removedObligatoriointeger | null
refusedObligatoriointeger | null
errorObligatoriostring | nullUno de: fileGone, clash, closed, fault, tooLarge, tooManyRows, tooManyColumns, noHeader, unsupportedFormat, unreadable, archiveNoFile, archiveChoice, archiveNested, archivePassword, archivePasswordWrong, archiveUnsafe, archiveFormat
importIdObligatoriouuid | 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
job_idmercamap_job_id
kindmercamap_kind
sourcemercamap_source
statemercamap_state
rowsmercamap_rows
addedmercamap_added
updatedmercamap_updated
removedmercamap_removed
refusedmercamap_refused
errormercamap_error
import_idmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
unseenObligatoriointeger
priceChangesObligatoriointeger
newReferencesObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
unseenmercamap_unseen
price_changesmercamap_price_changes
new_referencesmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
kindObligatoriostringUno de: never, lost
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
referenceObligatorioobject
reference.idObligatoriouuid
reference.nameObligatoriostringDe 1 a 300 caracteres
reference.variantObligatoriostring | nullDe 1 a 200 caracteres
reference.brandObligatoriostring | nullDe 1 a 200 caracteres
reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
reference.categoryObligatoriostringDe 1 a 100 caracteres
reference.codeObligatoriostring | nullDe 1 a 40 caracteres
reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
looksMissedObligatoriointeger
lastSeenWeekObligatoriostring | nullUna semana ISO, como 2026-W41
peersObligatorioobject
peers.lookedObligatoriointeger
peers.carryingObligatoriointeger
peers.firstWeekObligatoriostringUna semana ISO, como 2026-W41
peers.lastWeekObligatoriostringUna 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
kindmercamap_kind
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
looks_missedmercamap_looks_missed
last_seen_weekmercamap_last_seen_week
peers_lookedmercamap_peers_looked
peers_carryingmercamap_peers_carrying
peers_first_weekmercamap_peers_first_week
peers_last_weekmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
kindObligatoriostringUno de: never, lost
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
referenceObligatorioobject
reference.idObligatoriouuid
reference.nameObligatoriostringDe 1 a 300 caracteres
reference.variantObligatoriostring | nullDe 1 a 200 caracteres
reference.brandObligatoriostring | nullDe 1 a 200 caracteres
reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
reference.categoryObligatoriostringDe 1 a 100 caracteres
reference.codeObligatoriostring | nullDe 1 a 40 caracteres
reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
howObligatoriostringUno de: seen, cleared
openedWeekObligatoriostringUna semana ISO, como 2026-W41
seenWeekObligatoriostring | nullUna semana ISO, como 2026-W41
weeksOpenObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
kindmercamap_kind
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
howmercamap_how
opened_weekmercamap_opened_week
seen_weekmercamap_seen_week
weeks_openmercamap_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

Datos del evento
CampoTipoNotas
issueIdObligatoriouuid
kindObligatoriostringUno de: gap, level, facings, price, promotion, planogram, listing, other
sourceObligatoriostringUno de: crowd, team, campaign, manual, csv, api
priorityObligatoriointegerDe 1 a 4
weekObligatoriostringUna semana ISO, como 2026-W41
reopenedObligatoriointeger
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
referenceObligatorioobject | null
reference.idObligatoriouuid
reference.nameObligatoriostringDe 1 a 300 caracteres
reference.variantObligatoriostring | nullDe 1 a 200 caracteres
reference.brandObligatoriostring | nullDe 1 a 200 caracteres
reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
reference.categoryObligatoriostringDe 1 a 100 caracteres
reference.codeObligatoriostring | nullDe 1 a 40 caracteres
reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
categoryObligatoriostring | nullDe 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
issue_idmercamap_issue_id
kindmercamap_kind
sourcemercamap_source
prioritymercamap_priority
weekmercamap_week
reopenedmercamap_reopened
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
categorymercamap_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

Datos del evento
CampoTipoNotas
issueIdObligatoriouuid
kindObligatoriostringUno de: gap, level, facings, price, promotion, planogram, listing, other
statusObligatoriostringUno de: verified, closed, declined, dismissed
resolutionObligatoriostring | nullUno de: confirmed, cleared, team_confirmed, unchecked, declined, dismissed, expired
openedWeekObligatoriostringUna semana ISO, como 2026-W41
weekObligatoriostringUna semana ISO, como 2026-W41
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
referenceObligatorioobject | null
reference.idObligatoriouuid
reference.nameObligatoriostringDe 1 a 300 caracteres
reference.variantObligatoriostring | nullDe 1 a 200 caracteres
reference.brandObligatoriostring | nullDe 1 a 200 caracteres
reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
reference.categoryObligatoriostringDe 1 a 100 caracteres
reference.codeObligatoriostring | nullDe 1 a 40 caracteres
reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
categoryObligatoriostring | nullDe 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
issue_idmercamap_issue_id
kindmercamap_kind
statusmercamap_status
resolutionmercamap_resolution
opened_weekmercamap_opened_week
weekmercamap_week
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
categorymercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
previousWeekObligatoriostringUna semana ISO, como 2026-W41
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
referenceObligatorioobject
reference.idObligatoriouuid
reference.nameObligatoriostringDe 1 a 300 caracteres
reference.variantObligatoriostring | nullDe 1 a 200 caracteres
reference.brandObligatoriostring | nullDe 1 a 200 caracteres
reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
reference.categoryObligatoriostringDe 1 a 100 caracteres
reference.codeObligatoriostring | nullDe 1 a 40 caracteres
reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
priceCentsObligatoriointeger
previousCentsObligatoriointeger
changePercentObligatoriointeger
promotionalObligatorioboolean | 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
previous_weekmercamap_previous_week
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
price_centsmercamap_price_cents
previous_centsmercamap_previous_cents
change_percentmercamap_change_percent
promotionalmercamap_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

Datos del evento
CampoTipoNotas
campaignIdObligatoriouuid
weekObligatoriostringUna semana ISO, como 2026-W41
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
referenceObligatorioobject | null
reference.idObligatoriouuid
reference.nameObligatoriostringDe 1 a 300 caracteres
reference.variantObligatoriostring | nullDe 1 a 200 caracteres
reference.brandObligatoriostring | nullDe 1 a 200 caracteres
reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
reference.categoryObligatoriostringDe 1 a 100 caracteres
reference.codeObligatoriostring | nullDe 1 a 40 caracteres
reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
resultObligatoriostringUno de: observed, not_observed, unchecked, no_walk
reasonObligatoriostring | nullUno de: elsewhere, not_seen, no_promo, no_frames, place_not_looked, level_not_measured, label_not_read, seen_no_frame
placeObligatoriostring | nullUno de: aisle, endcap, checkout, entrance, department, other
levelObligatoriostring | nullUno de: stoop, grab, eye, stretch
labelObligatorioobject | null
label.readObligatorioboolean
label.promotionObligatorioboolean
label.promotionBelowObligatorioboolean
sharedSpaceObligatorioobject | null
sharedSpace.locationKeyObligatoriostringDe 1 a 200 caracteres
sharedSpace.brandsObligatorioobject[]Hasta 200 elementos
sharedSpace.brands[].brandKeyObligatoriostringDe 1 a 200 caracteres
sharedSpace.brands[].brandNameObligatoriostringHasta 200 caracteres
sharedSpace.brands[].privateLabelObligatorioboolean
sharedSpace.brands[].referencesObligatoriointeger
sharedSpace.brands[].facingsObligatoriointeger
sharedSpace.brands[].facingsCountedObligatoriointeger
sharedSpace.brands[].eyeLevelObligatoriointeger
sharedSpace.brands[].medianPriceCentsObligatoriointeger | null
sharedSpace.totalsObligatorioobject
sharedSpace.totals.referencesObligatoriointeger
sharedSpace.totals.facingsObligatoriointeger
sharedSpace.totals.facingsCountedObligatoriointeger
sharedSpace.totals.eyeLevelObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
campaign_idmercamap_campaign_id
weekmercamap_week
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
resultmercamap_result
reasonmercamap_reason
placemercamap_place
levelmercamap_level
label_readmercamap_label_read
label_promotionmercamap_label_promotion
label_promotion_belowmercamap_label_promotion_below
shared_space_location_keymercamap_shared_space_location_key
shared_space_brand_keymercamap_shared_space_brand_key
shared_space_brand_namemercamap_shared_space_brand_name
shared_space_brand_private_labelmercamap_shared_space_brand_private_label
shared_space_brand_referencesmercamap_shared_space_brand_references
shared_space_brand_facingsmercamap_shared_space_brand_facings
shared_space_brand_facings_countedmercamap_shared_space_brand_facings_counted
shared_space_brand_eye_levelmercamap_shared_space_brand_eye_level
shared_space_brand_median_price_centsmercamap_shared_space_brand_median_price_cents
shared_space_totals_referencesmercamap_shared_space_totals_references
shared_space_totals_facingsmercamap_shared_space_totals_facings
shared_space_totals_facings_countedmercamap_shared_space_totals_facings_counted
shared_space_totals_eye_levelmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
storeObligatorioobject
store.idObligatoriouuid
store.nameObligatoriostringDe 1 a 300 caracteres
store.chainObligatoriostring | nullDe 1 a 100 caracteres
store.addressObligatoriostring | nullDe 1 a 300 caracteres
store.postcodeObligatoriostring | nullPatrón: ^\d{5}$
store.localityObligatoriostring | nullDe 1 a 120 caracteres
store.provinceObligatoriostring | nullPatrón: ^\d{2}$
store.latObligatorionumberDe -90 a 90
store.lngObligatorionumberDe -180 a 180
store.codeObligatoriostring | nullDe 1 a 40 caracteres
store.chainCodeObligatoriostring | nullDe 1 a 40 caracteres
store.glnObligatoriostring | nullPatrón: ^\d{13}$
partObligatoriointeger
partsObligatoriointeger
referencesObligatorioobject[]De 1 a 50 elementos
references[].referenceObligatorioobject
references[].reference.idObligatoriouuid
references[].reference.nameObligatoriostringDe 1 a 300 caracteres
references[].reference.variantObligatoriostring | nullDe 1 a 200 caracteres
references[].reference.brandObligatoriostring | nullDe 1 a 200 caracteres
references[].reference.sizeObligatoriostring | nullDe 1 a 100 caracteres
references[].reference.categoryObligatoriostringDe 1 a 100 caracteres
references[].reference.codeObligatoriostring | nullDe 1 a 40 caracteres
references[].reference.eanObligatoriostring | nullPatrón: ^(\d{8}|\d{12,14})$
references[].seenObligatorioboolean
references[].locationsObligatoriointeger | null
references[].facingsObligatoriointeger | null
references[].levelObligatoriostring | nullUno de: stoop, grab, eye, stretch
references[].sectionObligatoriostring | nullDe 1 a 200 caracteres
references[].priceCentsObligatoriointeger | null
references[].promotionalObligatorioboolean | 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
store_idmercamap_store_id
store_namemercamap_store_name
store_chainmercamap_store_chain
store_addressmercamap_store_address
store_postcodemercamap_store_postcode
store_localitymercamap_store_locality
store_provincemercamap_store_province
store_latmercamap_store_lat
store_lngmercamap_store_lng
store_codemercamap_store_code
store_chain_codemercamap_store_chain_code
store_glnmercamap_store_gln
partmercamap_part
partsmercamap_parts
reference_idmercamap_reference_id
reference_namemercamap_reference_name
reference_variantmercamap_reference_variant
reference_brandmercamap_reference_brand
reference_sizemercamap_reference_size
reference_categorymercamap_reference_category
reference_codemercamap_reference_code
reference_eanmercamap_reference_ean
reference_seenmercamap_reference_seen
reference_locationsmercamap_reference_locations
reference_facingsmercamap_reference_facings
reference_levelmercamap_reference_level
reference_sectionmercamap_reference_section
reference_price_centsmercamap_reference_price_cents
reference_promotionalmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
windowObligatorioobject
window.kindObligatoriostringUno de: recent, pilot
window.fromObligatoriostringUna semana ISO, como 2026-W41
window.toObligatoriostringUna semana ISO, como 2026-W41
window.weeksObligatoriointeger
gapsClosedObligatorioobject
gapsClosed.countObligatoriointeger
gapsClosed.storesObligatoriointeger
gapsClosed.nObligatoriointeger
gapsClosed.weeksObligatoriointeger
gapsClosed.valuedObligatoriointeger
gapsClosed.centsObligatoriointeger | null
gapsClosed.sourcesObligatorioobject
gapsClosed.sources.salesObligatoriointeger
gapsClosed.sources.referenceObligatoriointeger
gapsClosed.sources.defaultObligatoriointeger
gapsClosed.indicativeObligatorioboolean
gapsOpenObligatorioobject
gapsOpen.countObligatoriointeger
gapsOpen.storesObligatoriointeger
gapsOpen.nObligatoriointeger
gapsOpen.weeksObligatoriointeger
gapsOpen.valuedObligatoriointeger
gapsOpen.centsObligatoriointeger | null
gapsOpen.sourcesObligatorioobject
gapsOpen.sources.salesObligatoriointeger
gapsOpen.sources.referenceObligatoriointeger
gapsOpen.sources.defaultObligatoriointeger
gapsOpen.indicativeObligatorioboolean
campaignsObligatorioobject
campaigns.countObligatoriointeger
campaigns.costedObligatoriointeger
campaigns.observedObligatoriointeger
campaigns.notObservedObligatoriointeger
campaigns.uncheckedObligatoriointeger
campaigns.noWalkObligatoriointeger
campaigns.centsObligatoriointeger | null
campaigns.nObligatoriointeger
campaigns.indicativeObligatorioboolean
visitsObligatorioobject
visits.modeObligatoriostringUno de: counted, estimated
visits.countObligatoriointeger
visits.nObligatoriointeger
visits.centsObligatoriointeger | null
visits.indicativeObligatorioboolean
inputsObligatorioobject
inputs.visitCostCentsObligatorioobject | null
inputs.visitCostCents.valueObligatoriointeger
inputs.visitCostCents.setWeekObligatoriostringUna semana ISO, como 2026-W41
inputs.marginCentsObligatorioobject | null
inputs.marginCents.valueObligatoriointeger
inputs.marginCents.setWeekObligatoriostringUna semana ISO, como 2026-W41
inputs.marginRateBpObligatorioobject | null
inputs.marginRateBp.valueObligatoriointeger
inputs.marginRateBp.setWeekObligatoriostringUna semana ISO, como 2026-W41
inputs.referenceMarginsObligatorioobject | null
inputs.referenceMargins.countObligatoriointeger
inputs.referenceMargins.latestWeekObligatoriostringUna 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
window_kindmercamap_window_kind
window_frommercamap_window_from
window_tomercamap_window_to
window_weeksmercamap_window_weeks
gaps_closed_countmercamap_gaps_closed_count
gaps_closed_storesmercamap_gaps_closed_stores
gaps_closed_nmercamap_gaps_closed_n
gaps_closed_weeksmercamap_gaps_closed_weeks
gaps_closed_valuedmercamap_gaps_closed_valued
gaps_closed_centsmercamap_gaps_closed_cents
gaps_closed_sources_salesmercamap_gaps_closed_sources_sales
gaps_closed_sources_referencemercamap_gaps_closed_sources_reference
gaps_closed_sources_defaultmercamap_gaps_closed_sources_default
gaps_closed_indicativemercamap_gaps_closed_indicative
gaps_open_countmercamap_gaps_open_count
gaps_open_storesmercamap_gaps_open_stores
gaps_open_nmercamap_gaps_open_n
gaps_open_weeksmercamap_gaps_open_weeks
gaps_open_valuedmercamap_gaps_open_valued
gaps_open_centsmercamap_gaps_open_cents
gaps_open_sources_salesmercamap_gaps_open_sources_sales
gaps_open_sources_referencemercamap_gaps_open_sources_reference
gaps_open_sources_defaultmercamap_gaps_open_sources_default
gaps_open_indicativemercamap_gaps_open_indicative
campaigns_countmercamap_campaigns_count
campaigns_costedmercamap_campaigns_costed
campaigns_observedmercamap_campaigns_observed
campaigns_not_observedmercamap_campaigns_not_observed
campaigns_uncheckedmercamap_campaigns_unchecked
campaigns_no_walkmercamap_campaigns_no_walk
campaigns_centsmercamap_campaigns_cents
campaigns_nmercamap_campaigns_n
campaigns_indicativemercamap_campaigns_indicative
visits_modemercamap_visits_mode
visits_countmercamap_visits_count
visits_nmercamap_visits_n
visits_centsmercamap_visits_cents
visits_indicativemercamap_visits_indicative
inputs_visit_cost_cents_valuemercamap_inputs_visit_cost_cents_value
inputs_visit_cost_cents_set_weekmercamap_inputs_visit_cost_cents_set_week
inputs_margin_cents_valuemercamap_inputs_margin_cents_value
inputs_margin_cents_set_weekmercamap_inputs_margin_cents_set_week
inputs_margin_rate_bp_valuemercamap_inputs_margin_rate_bp_value
inputs_margin_rate_bp_set_weekmercamap_inputs_margin_rate_bp_set_week
inputs_reference_margins_countmercamap_inputs_reference_margins_count
inputs_reference_margins_latest_weekmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
kindsObligatorioobject[]De 1 a 10 elementos
kinds[].kindObligatoriostringUno de: gap_risk, promotion_risk, launch_reach, shelf_loss, order_quantity, chain_presence, label_expiry, store_change, spot_change, brand_trouble
kinds[].issuedObligatoriointeger
kinds[].shownObligatoriointeger
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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
kindmercamap_kind
kind_issuedmercamap_kind_issued
kind_shownmercamap_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

Datos del evento
CampoTipoNotas
weekObligatoriostringUna semana ISO, como 2026-W41
bandsObligatorioobject
bands.highObligatoriointeger
bands.mediumObligatoriointeger
bands.lowObligatoriointeger
storesObligatoriointeger
stakeCentsObligatoriointeger | null
firstObligatorioobject[]Hasta 10 elementos
first[].storeIdObligatoriouuid
first[].rankObligatoriointeger
first[].highObligatoriointeger
first[].mediumObligatoriointeger
first[].stakeCentsObligatoriointeger | 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
weekmercamap_week
bands_highmercamap_bands_high
bands_mediummercamap_bands_medium
bands_lowmercamap_bands_low
storesmercamap_stores
stake_centsmercamap_stake_cents
first_store_idmercamap_first_store_id
first_rankmercamap_first_rank
first_highmercamap_first_high
first_mediummercamap_first_medium
first_stake_centsmercamap_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

Datos del evento
CampoTipoNotas
campaignIdObligatoriouuid
storeIdObligatoriouuid
weekObligatoriostringUna semana ISO, como 2026-W41
fromWeekObligatoriostringUna semana ISO, como 2026-W41
bandObligatoriostringUno de: high, medium, low
previousBandObligatoriostring | nullUno 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
campaign_idmercamap_campaign_id
store_idmercamap_store_id
weekmercamap_week
from_weekmercamap_from_week
bandmercamap_band
previous_bandmercamap_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

Datos del evento
CampoTipoNotas
expectationIdObligatoriouuid
productIdObligatoriouuid
weekObligatoriostringUna semana ISO, como 2026-W41
observedObligatorioobject
observed.seenObligatoriointeger
observed.lookedObligatoriointeger
observed.shareObligatorionumber | nullDe 0 a 1
verdictObligatoriostring | nullUno de: behind, in_line, ahead, insufficient
forecastObligatorioobject | null
forecast.weekObligatoriostringUna semana ISO, como 2026-W41
forecast.shareObligatorionumberDe 0 a 1
forecast.lowObligatorionumberDe 0 a 1
forecast.highObligatorionumberDe 0 a 1
forecast.levelObligatorionumberDe 0 a 1
targetWeekObligatorioobject | null
targetWeek.weekObligatoriostring | nullUna semana ISO, como 2026-W41
targetWeek.earliestObligatoriostring | nullUna semana ISO, como 2026-W41
targetWeek.latestObligatoriostring | nullUna semana ISO, como 2026-W41
targetWeek.beyondObligatorioboolean
reachObligatorionumber | nullDe 0 a 1
methodObligatoriostringUno 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 planoTealium
event_idmercamap_event_id
event_typemercamap_event_type
event_versionmercamap_event_version
created_atmercamap_created_at
expectation_idmercamap_expectation_id
product_idmercamap_product_id
weekmercamap_week
observed_seenmercamap_observed_seen
observed_lookedmercamap_observed_looked
observed_sharemercamap_observed_share
verdictmercamap_verdict
forecast_weekmercamap_forecast_week
forecast_sharemercamap_forecast_share
forecast_lowmercamap_forecast_low
forecast_highmercamap_forecast_high
forecast_levelmercamap_forecast_level
target_week_weekmercamap_target_week_week
target_week_earliestmercamap_target_week_earliest
target_week_latestmercamap_target_week_latest
target_week_beyondmercamap_target_week_beyond
reachmercamap_reach
methodmercamap_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.