Guía técnica de Widgets Embebibles: chatbot, formulario de contacto, catálogo de propiedades, webhook de leads y sincronización de propiedades.
Desde Configuración → Widgets Embebibles podés llevar la tecnología de Nexogar a tu propia página web: un chatbot con la misma configuración que tu Asistente Virtual, un formulario de contacto para una propiedad puntual, un catálogo de propiedades en formato grilla, un webhook que reenvía cada lead nuevo a tu CRM, y una sincronización de propiedades para que tu propio sistema empuje inventario hacia Nexogar.
Todo funciona con un único snippet de script (embed.js) identificado por tu clave pública, más una lista de dominios permitidos que controla desde dónde se puede usar. Ambos datos están en el panel.
Activalo en el panel y pegá este snippet donde quieras que aparezca el bot en tu sitio:
<script src="https://api.nexogar.com/embed.js" data-nexogar-id="TU_CLAVE_PUBLICA" async></script>
Pensado para capturar leads de una propiedad específica. Configurá el ID de la propiedad en el panel y pegá:
<div id="nexogar-contact-form"></div> <script src="https://api.nexogar.com/embed.js" data-nexogar-id="TU_CLAVE_PUBLICA" async></script>
Muestra tu inventario activo como una grilla. Definí cuántas propiedades mostrar (máx. 24) en el panel:
<div id="nexogar-property-catalog"></div> <script src="https://api.nexogar.com/embed.js" data-nexogar-id="TU_CLAVE_PUBLICA" async></script>
Cada lead nuevo que se genere por tus widgets (o por Nexogar en general) puede reenviarse automáticamente a tu CRM o sistema propio. Configurá la URL de destino en el panel — ahí también vas a ver tu secreto de firma.
Cada envío llega firmado con HMAC-SHA256 en el header X-Nexogar-Signature:
X-Nexogar-Signature: sha256=<hmac_hex>
Para verificarlo en tu servidor (Node.js de ejemplo):
const crypto = require('crypto');
function esFirmaValida(secreto, cuerpoCrudo, header) {
const [, recibida] = header.split('=');
const esperada = crypto.createHmac('sha256', secreto).update(cuerpoCrudo).digest('hex');
return crypto.timingSafeEqual(Buffer.from(esperada, 'hex'), Buffer.from(recibida, 'hex'));
}Importante: la firma se calcula sobre el string JSON crudo que se envía en el body — verificala antes de parsear el JSON, no sobre una versión re-serializada.
Hay dos formas de meter propiedades a Nexogar sin usar el asistente completo de publicación:
En Configuración → Widgets Embebibles, el botón "Subir propiedad" abre un formulario liviano (tipo, operación, título, descripción, ubicación con mapa, precio, medidas, imágenes) que publica la propiedad directamente en tu cuenta, igual que si la hubieras cargado desde el asistente normal.
Si tu web o CRM ya tiene su propio inventario, podés empujarlo hacia Nexogar llamando a este endpoint por cada propiedad nueva o actualizada:
POST https://api.nexogar.com/api/public/widget/TU_CLAVE_PUBLICA/properties
Se autentica exactamente igual que el webhook de leads: firmá el string JSON crudo del body con tu secreto de firma (el mismo que ves arriba, en la sección del webhook) y mandalo en el header:
X-Nexogar-Signature: sha256=<hmac_hex>
Cuerpo de ejemplo (JSON):
{
"externalRef": "mi-crm-12345",
"operacion": "comprar",
"tipo": "departamento",
"titulo": "Departamento moderno de 3 dormitorios en Miraflores",
"descripcion_corta": "Amplio departamento con vista al mar, acabados premium, cocina integrada y balcón...",
"ubicacion": "Av. Malecón de la Reserva 123, Miraflores, Lima",
"latitude": -12.1211,
"longitude": -77.0339,
"precio_soles": 850000,
"precio_dolares": 230000,
"area_total": 120,
"area_ocupada": 110,
"habitaciones": 3,
"banos": 2,
"estacionamiento": true,
"amoblado": false,
"imagenes": [
"https://tusitio.com/fotos/depa-1.jpg",
"https://tusitio.com/fotos/depa-2.jpg"
],
"videoUrl": "https://youtube.com/watch?v=xxxxxxx"
}Ejemplo completo con curl (firmando el body en bash):
BODY='{"externalRef":"mi-crm-12345","operacion":"comprar","tipo":"departamento", ... }'
SECRETO="tu_webhook_secret"
FIRMA=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SECRETO" | sed 's/^.* //')
curl -X POST "https://api.nexogar.com/api/public/widget/TU_CLAVE_PUBLICA/properties" \
-H "Content-Type: application/json" \
-H "X-Nexogar-Signature: sha256=$FIRMA" \
-d "$BODY"Campos del body:
externalRef (opcional, recomendado) — el ID de la propiedad en tu propio sistema. Si volvés a mandar el mismo externalRef, Nexogar actualiza esa propiedad en vez de crear un duplicado.operacion — "comprar" o "alquiler".tipo — casa, departamento, terreno, local, edificio, oficina, casaplaya, aires, habitacion, deposito o cochera.titulo, descripcion_corta (mínimo 50 caracteres), ubicacion, latitude, longitude — obligatorios.precio_soles/precio_dolares (venta) o precio_mensual/mantenimiento/precio_dolares (alquiler) según operacion.area_total — obligatorio. area_ocupada, habitaciones, banos — obligatorios salvo para terreno, habitacion, aires y cochera.imagenes — array de URLs públicas (no archivos). Se descargan del lado de Nexogar; al menos una tiene que poder descargarse.videoUrl (opcional) — link de YouTube o TikTok.Respuestas:
201 — propiedad creada.200 — propiedad actualizada (cuando el externalRef ya existía).400 — datos inválidos o ninguna imagen pudo descargarse (el mensaje de error indica cuál).401 — firma inválida o ausente.403 — tu plan actual no incluye Widgets Embebibles.Podés ver el historial de sincronizaciones (éxitos y errores) en la misma sección del panel, debajo del endpoint.
Nexogar maneja proyectos inmobiliarios como un tipo de publicación propio, no solo propiedades sueltas. Un proyecto tiene una ficha única (nexogar.com/proyecto/…) con galería, amenidades, ubicación y todas sus tipologías, cada una con su área, dormitorios, precio, disponibilidad y plano.
Si tu CRM de ventas (Sperant, Evolta, un sistema propio, etc.) gestiona proyectos, no lo envíes como propiedades (ni una publicación por proyecto ni una por tipología): usa este endpoint y manda el proyecto completo con sus tipologías en un solo request.
POST https://api.nexogar.com/api/public/widget/TU_CLAVE_PUBLICA/projects
La autenticación es idéntica a la de propiedades: firma el string JSON crudo del body con tu secreto de firma y mándalo en X-Nexogar-Signature: sha256=<hmac_hex>.
{
"externalRef": "proyecto-cipreses",
"nombre": "Cipreses del Chipe",
"descripcion": "Modernos y amplios departamentos de 1, 2 y 3 habitaciones con balcón y vista a un parque de 3,000 m², en la zona más exclusiva de Piura. Áreas comunes con piscina, gimnasio, coworking y zona de parrilla.",
"tipo_proyecto": "residencial",
"estado_proyecto": "lanzamiento",
"ubicacion": "Av. Los Tallanes S/N, El Chipe, Piura",
"direccion": "Av. Los Tallanes S/N (al costado de la UPAO), Piura 20009, Perú",
"latitude": -5.1678302,
"longitude": -80.6286933,
"entrega": { "mes": "Diciembre", "anio": "2027" },
"imagenes": [
"https://tusitio.com/cipreses/fachada.jpg",
"https://tusitio.com/cipreses/piscina.jpg"
],
"videoUrl": "https://youtu.be/xxxxxxxxxxx",
"tourVirtualUrl": "https://tusitio.com/cipreses/tour360/",
"amenidades": ["agua", "luz", "desague", "seguridad", "piscina", "gimnasio", "terraza", "parrilla", "infantil", "bike_zone", "ascensor"],
"lugares_cercanos": ["universidades", "colegios", "parques", "centros_comerciales"],
"caracteristicas": "Coworking, lobby de ingreso y cámaras de seguridad.",
"contacto": {
"telefono": "987654321",
"email": "ventas@tuconstructora.pe",
"horario": "Lun a Sáb 9:00 a 18:00",
"oficina": "Sala de ventas: Av. Los Tallanes S/N, Piura"
},
"financiamiento": { "bancos": ["BCP", "BBVA", "Interbank"], "detalles": "Aplica Bono Mivivienda" },
"tipologias": [
{
"nombre": "Tipo 08",
"dormitorios": 1,
"banos": 1,
"area_total": 42,
"precio_soles": 245000,
"cantidad": 6,
"planos": ["https://tusitio.com/cipreses/planos/tipo-08.jpg"]
},
{
"nombre": "Tipo 01",
"dormitorios": 3,
"banos": 2,
"area_total": 72,
"area_terraza": 4,
"precio_soles": 389000,
"disponibilidad": "ultimos",
"cantidad": 2,
"pisos": "Piso 2-10",
"vistas": ["Parque"],
"planos": ["https://tusitio.com/cipreses/planos/tipo-01.jpg"]
},
{
"nombre": "Tipo 05",
"dormitorios": 3,
"area_total": 72,
"disponibilidad": "agotado",
"planos": ["https://tusitio.com/cipreses/planos/tipo-05.jpg"]
}
]
}externalRef (recomendado) — ID del proyecto en tu sistema. Si vuelves a mandar el mismo externalRef, Nexogar actualiza el proyecto (tipologías, precios, stock, fotos) en vez de duplicarlo. Es único por cuenta entre propiedades y proyectos.nombre — obligatorio, máx. 60 caracteres.descripcion — obligatorio, entre 100 y 1500 caracteres.tipo_proyecto — residencial (por defecto), comercial, mixto o lote.estado_proyecto — obligatorio, uno de: planos, lanzamiento, Pre-Venta, Inicio de Obra, construccion, En Acabados, Próxima Entrega, Entrega Inmediata, terminado, Entregados, ¡Último Depa!, Proximamente..., Próximo inicio de obra (respetando mayúsculas y tildes).ubicacion (máx. 100), latitude, longitude — obligatorios. direccion (máx. 150) es la dirección completa para el mapa; si no la mandas se usa ubicacion.imagenes — obligatorio, array de URLs públicas de la galería (máx. 15, 5 MB c/u). La primera es la portada. Al menos una tiene que poder descargarse.entrega (opcional) — { "mes": "Enero"…"Diciembre", "anio": "2027" }.amenidades (opcional) — claves de: agua, luz, desague, internet, seguridad, porteria, aire_acondicionado, piscina, cocina_equipada, pet_friendly, infantil, gimnasio, terraza, lavanderia, parrilla, ascensor, bike_zone, bar_zone. Lo que no esté en la lista (coworking, lobby, etc.) va como texto en caracteristicas.lugares_cercanos (opcional) — universidades, colegios, hospitales, parques, centros_comerciales, restaurantes, transporte_publico.precio_desde (opcional) — si no lo mandas, se calcula como el menor precio_soles de las tipologías; si ninguna tiene precio, la ficha muestra "Consultar".videoUrl (YouTube/TikTok), tourVirtualUrl, caracteristicas, informacion_adicional, contacto (telefono, email, horario, oficina), financiamiento (bancos, detalles), seo_title, seo_description — opcionales.activo (opcional) — manda false para despublicar el proyecto sin borrarlo (por ejemplo, cuando se vende todo).tipologias[])nombre — obligatorio y único dentro del proyecto (ej. "Tipo 01", "Flat 3D").dormitorios — obligatorio (entero; 0 para estudios, oficinas o locales). Las tipologías se agrupan por dormitorios en la ficha.area_total — obligatorio, en m². Opcionales: area_techada, area_terraza, banos, estacionamientos, depositos, pisos (texto, ej. "Piso 2-10"), orientacion, vistas (array), caracteristicas (texto), tipo_unidad (simple o duplex).precio_soles / precio_dolares (opcionales) — si no los mandas, la tipología se muestra como "Consultar".cantidad (opcional) — unidades disponibles de esa tipología. Si no la mandas, se muestra como disponible sin número.disponibilidad (opcional) — disponible, ultimos o agotado. Manda también las tipologías agotadas con "agotado": se muestran marcadas como agotadas y así el comprador ve el proyecto completo. Si una tipología deja de venir en un envío posterior, se quita de la ficha.planos (opcional, recomendado) — array de URLs públicas de la imagen del plano (máx. 5). Un plano que no se pueda descargar se omite y se informa en advertencias, sin bloquear el resto.lote: en vez de dormitorios usa uso (Residencial, Comercial, Mixto, Industrial), y opcionalmente ancho, largo, area_construida, caracteristicas_lote (array) y detalles.const crypto = require('crypto');
const body = JSON.stringify(proyecto); // firma EXACTAMENTE este string
const firma = crypto.createHmac('sha256', process.env.NEXOGAR_SECRET).update(body).digest('hex');
const res = await fetch('https://api.nexogar.com/api/public/widget/TU_CLAVE_PUBLICA/projects', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-Nexogar-Signature': 'sha256=' + firma },
body
});
console.log(res.status, await res.json());201 — proyecto creado. 200 — proyecto actualizado (el externalRef ya existía).projectId, slug, url pública de la ficha, cantidad de tipologias e imagenes guardadas, y advertencias si algún plano no se pudo descargar.400 — datos inválidos; el campo error dice exactamente qué corregir (ej. tipologias[2].area_total debe ser mayor a 0).401 — firma inválida o ausente. 403 — tu plan no incluye Widgets Embebibles.409 — el externalRef ya se usó para una propiedad (no un proyecto).Recomendación: sincroniza el proyecto completo cada vez que cambie un precio o el stock (o una vez al día). Cada envío reemplaza las tipologías por las que mandas, así Nexogar siempre refleja tu CRM.
El chatbot, formulario y catálogo solo se cargan en los dominios permitidos que agregues en el panel — cualquier otro origen recibe un error de CORS. El webhook de leads y la sincronización de propiedades no dependen del dominio (los llama tu servidor, no un navegador): su seguridad está en la firma HMAC, así que tratá tu secreto de firma como una contraseña y regeneralo desde el panel si sospechás que se filtró.