Ejemplos
La misma solicitud en curl, Node.js, PHP y Zapier.
Todos los ejemplos mandan el mismo lead, usan Idempotency-Key para que un reintento no duplique y reenvían los parámetros UTM de la página como atribucion. Cambia zvr_live_TU_LLAVE por tu llave (guardada en una variable de entorno, nunca en el código) y ZVR-0123 por el código de una propiedad de tu catálogo.
curl -X POST https://api.zevra.co/v1/leads \
-H "Authorization: Bearer $ZEVRA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: formulario-web-8f3c2a" \
-d '{
"nombre": "Ana Ruiz",
"telefono": "+52 55 0000 0001",
"email": "ana@ejemplo.com",
"mensaje": "Quiero agendar una visita este fin de semana.",
"propiedad": { "codigo": "ZVR-0123" },
"extras": { "origen_formulario": "landing-casas", "presupuesto": 3500000 },
"atribucion": { "campana": "preventa-torre-b-sep", "fuente": "facebook", "medio": "cpc", "pagina": "https://tusitio.com/torre-b" }
}'Agrega -i para ver las cabeceras (X-Request-Id, X-RateLimit-*) y -H "X-Zevra-Dry-Run: true" para probar sin escribir.
Sin propiedad
Si tu formulario es general (la página de contacto, por ejemplo), simplemente omite propiedad. El lead entra sin propiedad de interés y tu equipo la asigna después.
{
"nombre": "Ana Ruiz",
"telefono": "+52 55 0000 0001",
"mensaje": "Busco departamento en renta por la zona sur."
}Con tu código propio
Si en ZEVRA capturaste tus propios códigos de propiedad, úsalos en lugar del código ZVR:
{
"nombre": "Ana Ruiz",
"telefono": "+52 55 0000 0001",
"propiedad": { "external_code": "CASA-LOMAS-12" }
}Con calificación
Si tu formulario ya pregunta qué busca el prospecto, manda esas respuestas en calificacion para que caigan en los campos del lead (operación, presupuesto y Modelos de interés) y no solo en una nota. Lo típico es un <select> con rangos de presupuesto y otro con el tipo de unidad: en tu servidor conviertes la opción elegida en un rango numérico en MXN y en los nombres de los Modelos tal como están en ZEVRA. Una opción del formulario puede corresponder a varios Modelos ("Local comercial" cubre los locales de dos niveles) o a uno solo ("Consultorio"); por eso modelos es una lista.
curl -X POST https://api.zevra.co/v1/leads \
-H "Authorization: Bearer $ZEVRA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: formulario-web-8f3c2b" \
-d '{
"nombre": "Ana Ruiz",
"telefono": "+52 55 0000 0001",
"propiedad": { "codigo": "ZVR-0123" },
"calificacion": {
"operacion": "comprar",
"presupuesto": { "min": 1400000, "max": 2800000 },
"modelos": [{ "nombre": "Local nivel 1" }, { "nombre": "Local planta baja" }]
},
"extras": { "origen_formulario": "landing-locales", "tipo_unidad": "Local comercial", "rango_presupuesto": "1.4 a 2.8 millones" }
}'Cuatro reglas para no llevarte sorpresas:
modelosnecesitapropiedaden el mismo cuerpo, porque cada entrada se busca entre los Modelos de esa propiedad. Acepta de 1 a 10 entradas, cada una{ "id" }o{ "nombre" }(los repetidos se colapsan). Pornombrela coincidencia es exacta (sin distinguir mayúsculas, sin aproximaciones); porides el UUID del Modelo. Si alguna entrada no existe en esa propiedad, la API responde422 unit_type_not_foundconfieldapuntando a esa posición (calificacion.modelos[1]) y no guarda nada; si una opción de tu formulario no corresponde a Modelos concretos, omitemodelosy deja el dato enextras.- Para un solo Modelo puedes mandar
modelo: { "nombre": "Consultorio" }, la forma corta de una lista de uno; nunca mandesmodeloymodelosjuntos. - Si el teléfono ya existe, el presupuesto solo se rellena cuando estaba vacío, los Modelos se agregan a los Modelos de interés (nunca se quita ninguno) y la operación no cambia.
- Si
mines mayor quemax,maxse descarta.
Para encontrar el nombre o el id de cada Modelo, abre la propiedad en el dashboard y busca la tarjeta Modelos: cada Modelo muestra su nombre tal como debes mandarlo, y al abrirlo ves su id.