{
  "info": {
    "_postman_id": "4a69d75a-44eb-42da-89d2-b34ebf2697b6",
    "name": "Muda Webhook Hub - Integracao publica",
    "description": "Colecao oficial do contrato publico de webhooks do Muda.\n\nDocumentacao: https://web.muda.chat/developers/webhooks\n\nAntes de executar:\n1. Importe e selecione o ambiente local fornecido junto com esta colecao.\n2. Use apenas tenant, conexao e telefone de homologacao.\n3. Guarde os segredos no Postman Vault. Os fallbacks vazios do ambiente servem apenas para Newman/local.\n4. Defina muda_confirm_pilot=YES somente depois de revisar URL e dados.\n\nHTTP 202 confirma autenticacao, validacao e persistencia duravel; o efeito no CRM ocorre de forma assincrona.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "01 - Entrada JSON com HMAC-SHA256",
      "description": "Modo recomendado. A assinatura cobre timestamp + ponto + corpo bruto exato. Reexecute o primeiro request para validar duplicata.",
      "item": [
        {
          "name": "Enviar ou reenviar lead.added",
          "description": "Primeira execucao: HTTP 202 e duplicates=0. Sem limpar as variaveis do evento, a segunda execucao deve retornar HTTP 202 e duplicates=1.",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.environment.get('muda_confirm_pilot') !== 'YES') {",
                  "  throw new Error('Selecione o ambiente local, use dados sinteticos e defina muda_confirm_pilot=YES');",
                  "}",
                  "const webhookUrl = pm.environment.get('muda_json_webhook_url');",
                  "const testPhone = pm.environment.get('muda_test_phone');",
                  "if (!webhookUrl) throw new Error('Defina muda_json_webhook_url com a URL completa exibida pelo Muda');",
                  "if (!testPhone) throw new Error('Defina muda_test_phone com um numero exclusivo de homologacao');",
                  "let secret = null;",
                  "try {",
                  "  secret = await pm.vault.get('muda-inbound-webhook-secret');",
                  "} catch (_error) {",
                  "  // O fallback vazio existe apenas para Newman ou ambiente local nao compartilhado.",
                  "}",
                  "secret = secret || pm.environment.get('muda_hmac_secret');",
                  "if (!secret) throw new Error('Adicione muda-inbound-webhook-secret ao Postman Vault');",
                  "let eventId = pm.environment.get('muda_event_id');",
                  "if (!eventId) {",
                  "  eventId = 'postman_' + Date.now();",
                  "  pm.environment.set('muda_event_id', eventId);",
                  "}",
                  "let occurredAt = pm.environment.get('muda_occurred_at');",
                  "if (!occurredAt) {",
                  "  occurredAt = new Date().toISOString();",
                  "  pm.environment.set('muda_occurred_at', occurredAt);",
                  "}",
                  "let externalId = pm.environment.get('muda_external_id');",
                  "if (!externalId) {",
                  "  externalId = 'lead_' + eventId.replace(/[^a-zA-Z0-9_-]/g, '_');",
                  "  pm.environment.set('muda_external_id', externalId);",
                  "}",
                  "const timestamp = String(Math.floor(Date.now() / 1000));",
                  "pm.variables.set('muda_timestamp', timestamp);",
                  "const rawBody = pm.variables.replaceIn(pm.request.body.raw);",
                  "const encoder = new TextEncoder();",
                  "const key = await crypto.subtle.importKey(",
                  "  'raw',",
                  "  encoder.encode(secret),",
                  "  { name: 'HMAC', hash: 'SHA-256' },",
                  "  false,",
                  "  ['sign']",
                  ");",
                  "const bytes = await crypto.subtle.sign(",
                  "  'HMAC',",
                  "  key,",
                  "  encoder.encode(timestamp + '.' + rawBody),",
                  ");",
                  "const signature = Array.from(",
                  "  new Uint8Array(bytes),",
                  "  (byte) => byte.toString(16).padStart(2, '0'),",
                  ").join('');",
                  "pm.variables.set('muda_signature', 't=' + timestamp + ',v1=' + signature);"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 202: evento persistido', function () {",
                  "  pm.response.to.have.status(202);",
                  "});",
                  "pm.test('Resposta contem recibo e request_id', function () {",
                  "  const body = pm.response.json();",
                  "  pm.expect(body.received).to.eql(true);",
                  "  pm.expect(body.accepted).to.be.a('number');",
                  "  pm.expect(body.duplicates).to.be.a('number');",
                  "  pm.expect(body.request_id).to.be.a('string');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "X-Muda-Signature",
                "value": "{{muda_signature}}",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"id\": \"{{muda_event_id}}\",\n  \"type\": \"lead.added\",\n  \"version\": \"2026-07-01\",\n  \"occurred_at\": \"{{muda_occurred_at}}\",\n  \"source\": \"postman\",\n  \"data\": {\n    \"external_id\": \"{{muda_external_id}}\",\n    \"name\": \"Contato sintetico Postman\",\n    \"phone\": \"{{muda_test_phone}}\"\n  },\n  \"previous\": null,\n  \"metadata\": {\n    \"scenario\": \"lead_hmac\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{muda_json_webhook_url}}",
              "host": [
                "{{muda_json_webhook_url}}"
              ]
            },
            "description": "Primeira execucao: HTTP 202 e duplicates=0. Sem limpar as variaveis do evento, a segunda execucao deve retornar HTTP 202 e duplicates=1."
          },
          "response": []
        },
        {
          "name": "Conflito do mesmo id com payload diferente",
          "description": "Execute depois do request anterior. Mantem body.id e altera o payload; o resultado esperado e HTTP 409.",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.environment.get('muda_confirm_pilot') !== 'YES') {",
                  "  throw new Error('Selecione o ambiente local, use dados sinteticos e defina muda_confirm_pilot=YES');",
                  "}",
                  "const webhookUrl = pm.environment.get('muda_json_webhook_url');",
                  "const testPhone = pm.environment.get('muda_test_phone');",
                  "if (!webhookUrl) throw new Error('Defina muda_json_webhook_url com a URL completa exibida pelo Muda');",
                  "if (!testPhone) throw new Error('Defina muda_test_phone com um numero exclusivo de homologacao');",
                  "let secret = null;",
                  "try {",
                  "  secret = await pm.vault.get('muda-inbound-webhook-secret');",
                  "} catch (_error) {",
                  "  // O fallback vazio existe apenas para Newman ou ambiente local nao compartilhado.",
                  "}",
                  "secret = secret || pm.environment.get('muda_hmac_secret');",
                  "if (!secret) throw new Error('Adicione muda-inbound-webhook-secret ao Postman Vault');",
                  "let eventId = pm.environment.get('muda_event_id');",
                  "if (!eventId) throw new Error('Execute primeiro o envio HMAC para preencher muda_event_id');",
                  "let occurredAt = pm.environment.get('muda_occurred_at');",
                  "if (!occurredAt) {",
                  "  occurredAt = new Date().toISOString();",
                  "  pm.environment.set('muda_occurred_at', occurredAt);",
                  "}",
                  "let externalId = pm.environment.get('muda_external_id');",
                  "if (!externalId) {",
                  "  externalId = 'lead_' + eventId.replace(/[^a-zA-Z0-9_-]/g, '_');",
                  "  pm.environment.set('muda_external_id', externalId);",
                  "}",
                  "const timestamp = String(Math.floor(Date.now() / 1000));",
                  "pm.variables.set('muda_timestamp', timestamp);",
                  "const rawBody = pm.variables.replaceIn(pm.request.body.raw);",
                  "const encoder = new TextEncoder();",
                  "const key = await crypto.subtle.importKey(",
                  "  'raw',",
                  "  encoder.encode(secret),",
                  "  { name: 'HMAC', hash: 'SHA-256' },",
                  "  false,",
                  "  ['sign']",
                  ");",
                  "const bytes = await crypto.subtle.sign(",
                  "  'HMAC',",
                  "  key,",
                  "  encoder.encode(timestamp + '.' + rawBody),",
                  ");",
                  "const signature = Array.from(",
                  "  new Uint8Array(bytes),",
                  "  (byte) => byte.toString(16).padStart(2, '0'),",
                  ").join('');",
                  "pm.variables.set('muda_signature', 't=' + timestamp + ',v1=' + signature);"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 409: id reutilizado com payload diferente', function () {",
                  "  pm.response.to.have.status(409);",
                  "});",
                  "pm.test('Erro explicito de conflito', function () {",
                  "  pm.expect(pm.response.json().error).to.eql('event_id_payload_conflict');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "X-Muda-Signature",
                "value": "{{muda_signature}}",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"id\": \"{{muda_event_id}}\",\n  \"type\": \"lead.added\",\n  \"version\": \"2026-07-01\",\n  \"occurred_at\": \"{{muda_occurred_at}}\",\n  \"source\": \"postman\",\n  \"data\": {\n    \"external_id\": \"{{muda_external_id}}\",\n    \"name\": \"Contato sintetico Postman\",\n    \"phone\": \"{{muda_test_phone}}\"\n  },\n  \"previous\": null,\n  \"metadata\": {\n    \"scenario\": \"same_id_changed_payload\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{muda_json_webhook_url}}",
              "host": [
                "{{muda_json_webhook_url}}"
              ]
            },
            "description": "Execute depois do request anterior. Mantem body.id e altera o payload; o resultado esperado e HTTP 409."
          },
          "response": []
        }
      ]
    },
    {
      "name": "02 - Lead de formulario com HMAC-SHA256",
      "description": "Modelo generico para formularios de geracao de leads. As respostas estruturadas ficam em custom_fields e o resumo legivel segue em description para o CRM.",
      "item": [
        {
          "name": "Enviar lead.added com respostas do formulario",
          "description": "Substitua as variaveis sinteticas pelos campos do formulario na plataforma de automacao antes da homologacao.",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.environment.get('muda_confirm_pilot') !== 'YES') {",
                  "  throw new Error('Selecione o ambiente local, use dados sinteticos e defina muda_confirm_pilot=YES');",
                  "}",
                  "const webhookUrl = pm.environment.get('muda_json_webhook_url');",
                  "const testPhone = pm.environment.get('muda_test_phone');",
                  "if (!webhookUrl) throw new Error('Defina muda_json_webhook_url com a URL completa exibida pelo Muda');",
                  "if (!testPhone) throw new Error('Defina muda_test_phone com um numero exclusivo de homologacao');",
                  "let secret = null;",
                  "try {",
                  "  secret = await pm.vault.get('muda-inbound-webhook-secret');",
                  "} catch (_error) {",
                  "  // O fallback vazio existe apenas para Newman ou ambiente local nao compartilhado.",
                  "}",
                  "secret = secret || pm.environment.get('muda_hmac_secret');",
                  "if (!secret) throw new Error('Adicione muda-inbound-webhook-secret ao Postman Vault');",
                  "let eventId = pm.environment.get('muda_form_event_id');",
                  "if (!eventId) {",
                  "  eventId = 'postman_' + Date.now();",
                  "  pm.environment.set('muda_form_event_id', eventId);",
                  "}",
                  "let occurredAt = pm.environment.get('muda_form_occurred_at');",
                  "if (!occurredAt) {",
                  "  occurredAt = new Date().toISOString();",
                  "  pm.environment.set('muda_form_occurred_at', occurredAt);",
                  "}",
                  "let externalId = pm.environment.get('muda_form_external_id');",
                  "if (!externalId) {",
                  "  externalId = 'lead_' + eventId.replace(/[^a-zA-Z0-9_-]/g, '_');",
                  "  pm.environment.set('muda_form_external_id', externalId);",
                  "}",
                  "const timestamp = String(Math.floor(Date.now() / 1000));",
                  "pm.variables.set('muda_timestamp', timestamp);",
                  "const rawBody = pm.variables.replaceIn(pm.request.body.raw);",
                  "const encoder = new TextEncoder();",
                  "const key = await crypto.subtle.importKey(",
                  "  'raw',",
                  "  encoder.encode(secret),",
                  "  { name: 'HMAC', hash: 'SHA-256' },",
                  "  false,",
                  "  ['sign']",
                  ");",
                  "const bytes = await crypto.subtle.sign(",
                  "  'HMAC',",
                  "  key,",
                  "  encoder.encode(timestamp + '.' + rawBody),",
                  ");",
                  "const signature = Array.from(",
                  "  new Uint8Array(bytes),",
                  "  (byte) => byte.toString(16).padStart(2, '0'),",
                  ").join('');",
                  "pm.variables.set('muda_signature', 't=' + timestamp + ',v1=' + signature);"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 202: evento persistido', function () {",
                  "  pm.response.to.have.status(202);",
                  "});",
                  "pm.test('Resposta contem recibo e request_id', function () {",
                  "  const body = pm.response.json();",
                  "  pm.expect(body.received).to.eql(true);",
                  "  pm.expect(body.accepted).to.be.a('number');",
                  "  pm.expect(body.duplicates).to.be.a('number');",
                  "  pm.expect(body.request_id).to.be.a('string');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "X-Muda-Signature",
                "value": "{{muda_signature}}",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"id\": \"{{muda_form_event_id}}\",\n  \"type\": \"lead.added\",\n  \"version\": \"2026-07-01\",\n  \"occurred_at\": \"{{muda_form_occurred_at}}\",\n  \"source\": \"lead_form\",\n  \"data\": {\n    \"external_id\": \"{{muda_form_external_id}}\",\n    \"name\": \"Contato sintetico de formulario\",\n    \"email\": \"contato@example.invalid\",\n    \"phone\": \"{{muda_test_phone}}\",\n    \"description\": \"Cargo: {{muda_form_cargo}}\\nUnidades: {{muda_form_unidades}}\\nPrazo: {{muda_form_prazo}}\\nOrganizacao atual: {{muda_form_organizacao}}\",\n    \"custom_fields\": {\n      \"cargo\": \"{{muda_form_cargo}}\",\n      \"unidades\": \"{{muda_form_unidades}}\",\n      \"prazo\": \"{{muda_form_prazo}}\",\n      \"organizacao_atual\": \"{{muda_form_organizacao}}\"\n    }\n  },\n  \"previous\": null,\n  \"metadata\": {\n    \"scenario\": \"lead_form\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{muda_json_webhook_url}}",
              "host": [
                "{{muda_json_webhook_url}}"
              ]
            },
            "description": "Substitua as variaveis sinteticas pelos campos do formulario na plataforma de automacao antes da homologacao."
          },
          "response": []
        }
      ]
    },
    {
      "name": "03 - Lote JSON com HMAC-SHA256",
      "description": "Demonstra um lote de dois eventos. O limite por requisicao e 100.",
      "item": [
        {
          "name": "Enviar lote com dois eventos",
          "description": "Requer que lead.added e contact.added estejam habilitados no endpoint piloto.",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.environment.get('muda_confirm_pilot') !== 'YES') {",
                  "  throw new Error('Selecione o ambiente local, use dados sinteticos e defina muda_confirm_pilot=YES');",
                  "}",
                  "const webhookUrl = pm.environment.get('muda_json_webhook_url');",
                  "const testPhone = pm.environment.get('muda_test_phone');",
                  "if (!webhookUrl) throw new Error('Defina muda_json_webhook_url com a URL completa exibida pelo Muda');",
                  "if (!testPhone) throw new Error('Defina muda_test_phone com um numero exclusivo de homologacao');",
                  "let secret = null;",
                  "try {",
                  "  secret = await pm.vault.get('muda-inbound-webhook-secret');",
                  "} catch (_error) {",
                  "  // O fallback vazio existe apenas para Newman ou ambiente local nao compartilhado.",
                  "}",
                  "secret = secret || pm.environment.get('muda_hmac_secret');",
                  "if (!secret) throw new Error('Adicione muda-inbound-webhook-secret ao Postman Vault');",
                  "let eventId = pm.environment.get('muda_batch_event_id');",
                  "if (!eventId) {",
                  "  eventId = 'postman_' + Date.now();",
                  "  pm.environment.set('muda_batch_event_id', eventId);",
                  "}",
                  "let occurredAt = pm.environment.get('muda_batch_occurred_at');",
                  "if (!occurredAt) {",
                  "  occurredAt = new Date().toISOString();",
                  "  pm.environment.set('muda_batch_occurred_at', occurredAt);",
                  "}",
                  "let externalId = pm.environment.get('muda_batch_external_id');",
                  "if (!externalId) {",
                  "  externalId = 'lead_' + eventId.replace(/[^a-zA-Z0-9_-]/g, '_');",
                  "  pm.environment.set('muda_batch_external_id', externalId);",
                  "}",
                  "const timestamp = String(Math.floor(Date.now() / 1000));",
                  "pm.variables.set('muda_timestamp', timestamp);",
                  "const rawBody = pm.variables.replaceIn(pm.request.body.raw);",
                  "const encoder = new TextEncoder();",
                  "const key = await crypto.subtle.importKey(",
                  "  'raw',",
                  "  encoder.encode(secret),",
                  "  { name: 'HMAC', hash: 'SHA-256' },",
                  "  false,",
                  "  ['sign']",
                  ");",
                  "const bytes = await crypto.subtle.sign(",
                  "  'HMAC',",
                  "  key,",
                  "  encoder.encode(timestamp + '.' + rawBody),",
                  ");",
                  "const signature = Array.from(",
                  "  new Uint8Array(bytes),",
                  "  (byte) => byte.toString(16).padStart(2, '0'),",
                  ").join('');",
                  "pm.variables.set('muda_signature', 't=' + timestamp + ',v1=' + signature);"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 202: evento persistido', function () {",
                  "  pm.response.to.have.status(202);",
                  "});",
                  "pm.test('Resposta contem recibo e request_id', function () {",
                  "  const body = pm.response.json();",
                  "  pm.expect(body.received).to.eql(true);",
                  "  pm.expect(body.accepted).to.be.a('number');",
                  "  pm.expect(body.duplicates).to.be.a('number');",
                  "  pm.expect(body.request_id).to.be.a('string');",
                  "});",
                  "pm.test('Dois eventos aceitos', function () {",
                  "  pm.expect(pm.response.json().accepted).to.eql(2);",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "X-Muda-Signature",
                "value": "{{muda_signature}}",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"id\": \"{{muda_batch_event_id}}_lead\",\n    \"type\": \"lead.added\",\n    \"version\": \"2026-07-01\",\n    \"occurred_at\": \"{{muda_batch_occurred_at}}\",\n    \"source\": \"postman\",\n    \"data\": {\n      \"external_id\": \"{{muda_batch_external_id}}_lead\",\n      \"name\": \"Lead sintetico em lote\",\n      \"phone\": \"{{muda_test_phone}}\"\n    },\n    \"metadata\": {\n      \"scenario\": \"batch\"\n    }\n  },\n  {\n    \"id\": \"{{muda_batch_event_id}}_contact\",\n    \"type\": \"contact.added\",\n    \"version\": \"2026-07-01\",\n    \"occurred_at\": \"{{muda_batch_occurred_at}}\",\n    \"source\": \"postman\",\n    \"data\": {\n      \"external_id\": \"{{muda_batch_external_id}}_contact\",\n      \"name\": \"Contato sintetico em lote\",\n      \"phone\": \"{{muda_test_phone}}\"\n    },\n    \"metadata\": {\n      \"scenario\": \"batch\"\n    }\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{muda_json_webhook_url}}",
              "host": [
                "{{muda_json_webhook_url}}"
              ]
            },
            "description": "Requer que lead.added e contact.added estejam habilitados no endpoint piloto."
          },
          "response": []
        }
      ]
    },
    {
      "name": "04 - Entrada JSON com Bearer",
      "description": "Fallback para plataformas que nao conseguem calcular HMAC.",
      "item": [
        {
          "name": "Enviar lead.added com Bearer",
          "description": "O endpoint precisa ter sido criado no modo Bearer. Prefira HMAC quando a plataforma permitir.",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.environment.get('muda_confirm_pilot') !== 'YES') {",
                  "  throw new Error('Selecione o ambiente local, use dados sinteticos e defina muda_confirm_pilot=YES');",
                  "}",
                  "const webhookUrl = pm.environment.get('muda_json_webhook_url');",
                  "const testPhone = pm.environment.get('muda_test_phone');",
                  "if (!webhookUrl) throw new Error('Defina muda_json_webhook_url com a URL completa exibida pelo Muda');",
                  "if (!testPhone) throw new Error('Defina muda_test_phone com um numero exclusivo de homologacao');",
                  "let token = null;",
                  "try {",
                  "  token = await pm.vault.get('muda-inbound-bearer-token');",
                  "} catch (_error) {",
                  "  // O fallback vazio existe apenas para Newman ou ambiente local nao compartilhado.",
                  "}",
                  "token = token || pm.environment.get('muda_bearer_token');",
                  "if (!token) throw new Error('Adicione muda-inbound-bearer-token ao Postman Vault');",
                  "pm.variables.set('muda_authorization', 'Bearer ' + token);",
                  "let eventId = pm.environment.get('muda_bearer_event_id');",
                  "if (!eventId) {",
                  "  eventId = 'postman_bearer_' + Date.now();",
                  "  pm.environment.set('muda_bearer_event_id', eventId);",
                  "}",
                  "if (!pm.environment.get('muda_bearer_occurred_at')) {",
                  "  pm.environment.set('muda_bearer_occurred_at', new Date().toISOString());",
                  "}",
                  "if (!pm.environment.get('muda_bearer_external_id')) {",
                  "  pm.environment.set('muda_bearer_external_id', 'lead_' + eventId.replace(/[^a-zA-Z0-9_-]/g, '_'));",
                  "}"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 202: evento persistido', function () {",
                  "  pm.response.to.have.status(202);",
                  "});",
                  "pm.test('Resposta contem recibo e request_id', function () {",
                  "  const body = pm.response.json();",
                  "  pm.expect(body.received).to.eql(true);",
                  "  pm.expect(body.accepted).to.be.a('number');",
                  "  pm.expect(body.duplicates).to.be.a('number');",
                  "  pm.expect(body.request_id).to.be.a('string');",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              },
              {
                "key": "Authorization",
                "value": "{{muda_authorization}}",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"id\": \"{{muda_bearer_event_id}}\",\n  \"type\": \"lead.added\",\n  \"version\": \"2026-07-01\",\n  \"occurred_at\": \"{{muda_bearer_occurred_at}}\",\n  \"source\": \"postman\",\n  \"data\": {\n    \"external_id\": \"{{muda_bearer_external_id}}\",\n    \"name\": \"Contato sintetico Postman Bearer\",\n    \"phone\": \"{{muda_test_phone}}\"\n  },\n  \"previous\": null,\n  \"metadata\": {\n    \"scenario\": \"lead_bearer\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{muda_json_webhook_url}}",
              "host": [
                "{{muda_json_webhook_url}}"
              ]
            },
            "description": "Cole a URL completa do endpoint. O token e lido do Vault e mantido apenas como variavel local da execucao."
          },
          "response": []
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "muda_contract_version",
      "value": "2026-07-01",
      "type": "string"
    }
  ]
}
