Webhooks

Multilistado avisa a tu CRM o a tu sitio en cuanto llega un lead o cambia el estado de una propiedad, con un POST JSON firmado.

Read in English · Markdown · Actualizado

Configurar

  1. Entra a Portal → Más → Webhooks.
  2. Escribe la URL de tu receptor: debe ser https:// y de un servidor público (no se aceptan IPs privadas ni localhost).
  3. Marca los Eventos que quieres recibir y pulsa Crear.
  4. Copia el secreto que aparece («Webhook creado. Secreto (guárdalo): …»): se muestra una sola vez y sirve para verificar la firma.
  5. Pulsa Probar para enviar un lead.created de prueba. La columna Último estado muestra ok, http 4xx/http 5xx o error: delivery failed con la hora.

Los webhooks son por agente: recibes los eventos de tus propiedades y de los leads asignados a ti.

Gratis para agentes e inmobiliarias con licencia. Crea tu cuenta, verifica tu licencia y genera tu API key o tu widget en minutos.

Crear cuenta gratis Ya tengo cuenta

Eventos

EventoCuándo se envíadata
lead.createdAl notificarte un lead nuevo: formularios de multilistado.mx, de tu sitio de Multilistado, del widget y colecciones. Las solicitudes de visita se envían cuando el comprador termina de verificar su identificaciónid, name, email, phone, message, kind (info/tour), id_status, listing {id, slug, title}, source
lead.updatedCuando cambias la etapa de un lead en el portalid, status
listing.publishedAl publicar una propiedad (portal o API) o reconfirmarlaid, slug, title, status
listing.unpublishedAl despublicarla, retirarla, marcarla vendida/rentada o cuando el sistema la oculta (p. ej. sin reconfirmar)id, slug, status (a veces title)
listing.updatedEl agente editó una propiedad publicada en el portal (no se envía por ediciones hechas vía API)id, slug, title, status

No se envían webhooks por los leads que tú creas con POST /leads ni por tus PUT de la API (evita bucles con CRMs que sincronizan en ambos sentidos).

Formato

POST /hooks/multilistado HTTP/1.1
Content-Type: application/json
X-PBM-Event: lead.created
X-PBM-Signature: sha256=5d41402abc4b2a76b9719d911017c592…

{"event":"lead.created","created_at":"2026-09-30T18:04:11.482Z","data":{"id":"6f1c…","name":"Ana López","email":"ana@example.com","phone":"+52 664 123 4567","message":"¿Sigue disponible?","kind":"info","id_status":null,"listing":{"id":"07e2…","slug":"casa-en-venta-playas-de-tijuana","title":"Casa en venta en Playas de Tijuana"},"source":"widget:3f9a0c1e2b4d5a6c7e8f9012"}}

X-PBM-Signature = sha256= + HMAC-SHA256 en hexadecimal del cuerpo exacto (los bytes crudos) con tu secreto como clave. Verifícala antes de interpretar el JSON y compárala en tiempo constante.

Verificar la firma

// Node.js 18+ sin dependencias. MULTILISTADO_WEBHOOK_SECRET = el secreto del portal.
import http from 'node:http';
import crypto from 'node:crypto';

const SECRET = process.env.MULTILISTADO_WEBHOOK_SECRET;

function validSignature(rawBody, header) {
  const expected = 'sha256=' + crypto.createHmac('sha256', SECRET).update(rawBody).digest('hex');
  const a = Buffer.from(String(header || '')), b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

http.createServer((req, res) => {
  const chunks = [];
  req.on('data', c => chunks.push(c));
  req.on('end', () => {
    const raw = Buffer.concat(chunks);                       // bytes crudos: no uses JSON.stringify(req.body)
    if (!validSignature(raw, req.headers['x-pbm-signature'])) { res.writeHead(401).end('bad signature'); return; }
    const evt = JSON.parse(raw.toString('utf8'));
    console.log(evt.event, evt.data.id);                     // guarda en tu CRM (en segundo plano)
    res.writeHead(200).end('ok');                            // responde rápido (menos de 10 s)
  });
}).listen(process.env.PORT || 3000);

Entrega y reintentos