Inicio rápido
La API usa JSON sobre HTTPS. Primero intercambia tus credenciales por un JWT y úsalo como Bearer token en las peticiones posteriores.
client_secret en frontend, URLs, repositorios o mensajes. La integración debe ejecutarse desde un servidor seguro.Cada credencial está vinculada a una inmobiliaria. InmoCMS selecciona automáticamente su base de datos; nunca debes enviar identificadores de base de datos.
Autenticación
curl -X POST "https://api-public.inmocms.com/api/v1/auth/token" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"client_id": "inm_xxxxxxxxxxxxxxxxxxxxxxxx",
"client_secret": "sec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "Bearer",
"expires_in": 3600
}Alta de clientes
Crea el cliente y sus datos específicos en una sola transacción.
Cabeceras
| Cabecera | Obligatoria | Valor / notas |
|---|---|---|
| Authorization | Sí | Bearer <JWT> |
| Content-Type | Sí | application/json |
| Accept | Recomendada | application/json |
| Idempotency-Key | No | Clave única de 8–100 caracteres. Muy recomendada para evitar duplicados en reintentos. |
Campos comunes
Se aplican tanto a demandantes como a ofertantes. Debes enviar al menos uno de telefono o email; puedes enviar ambos.
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
| tipo_cliente | string | Sí | demandante u ofertante. |
| nombre | string | Sí | Máximo 100 caracteres. |
| telefono | string | Si falta email | Máximo 32 caracteres. Enviar como texto, conservando el prefijo internacional si procede. |
| string | Si falta telefono | Email válido (RFC), máximo 100 caracteres. Se eliminan espacios de los extremos y se convierte a minúsculas. | |
| origen | string | Sí | Máximo 200 caracteres. Ejemplos: WhatsApp, Idealista, Email. |
| notas | string | No | Información libre, máximo 10.000 caracteres. |
| referencia_piso | string | No | Referencia del anuncio concreto, máximo 100 caracteres. En ofertantes se guarda como referencia del inmueble. |
Los campos obligatorios no pueden omitirse ni enviarse como null o texto vacío. Los campos opcionales pueden omitirse o enviarse como null. Si se envía un valor, debe cumplir el tipo y los límites indicados. Los números se muestran con punto decimal en JSON.
Demandante
Envía los campos comunes con tipo_cliente: "demandante" y los siguientes campos específicos en la raíz del JSON.
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
| zonas_interes | array de string | Sí | Entre 1 y 20 zonas. Cada elemento debe ser un texto no vacío de hasta 100 caracteres. No admite null ni un array vacío. |
| presupuesto_orientativo | number | No | Desde 0 hasta 999999999999.99, ambos incluidos. Admite decimales. |
Ejemplo de petición
curl -X POST "https://api-public.inmocms.com/api/v1/clientes" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: whatsapp-982371" \
-d '{
"tipo_cliente": "demandante",
"nombre": "Ana García",
"telefono": "+34600111222",
"email": "ana@example.com",
"zonas_interes": ["Centro", "Chamberí"],
"presupuesto_orientativo": 350000,
"referencia_piso": "REF-2026-104",
"origen": "WhatsApp"
}'Ofertante
Envía los campos comunes con tipo_cliente: "ofertante" y el objeto inmueble. Los campos con prefijo inmueble. van dentro de ese objeto.
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
| inmueble | object | Sí | Objeto con los datos del inmueble. No admite null ni un objeto vacío. |
| inmueble.direccion_zona | string | Sí | Dirección o zona del inmueble, máximo 250 caracteres. |
| inmueble.tipo_operacion | string | Sí | Solo venta o alquiler, en minúsculas. |
| inmueble.tipo_inmueble | string | No | Máximo 100 caracteres. Ejemplos: piso, casa, chalet, local. Se busca en el catálogo sin distinguir mayúsculas; si no existe, el vínculo queda vacío y el valor original se conserva en el payload del lead. |
| inmueble.metros_cuadrados | number | No | Desde 0 hasta 99999999.99, ambos incluidos. Admite decimales. |
| inmueble.habitaciones | integer | No | Número entero entre 0 y 100, ambos incluidos. |
| inmueble.banos | integer | No | Número entero entre 0 y 100, ambos incluidos. |
| inmueble.precio_orientativo | number | No | Desde 0 hasta 999999999999.99, ambos incluidos. Se guarda como precio de venta o alquiler según tipo_operacion. |
| inmueble.estado_descripcion | string | No | Descripción del estado del inmueble, máximo 10.000 caracteres. |
Ejemplo de petición
curl -X POST "https://api-public.inmocms.com/api/v1/clientes" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: portal-445901" \
-d '{
"tipo_cliente": "ofertante",
"nombre": "Carlos Pérez",
"telefono": "+34600999888",
"email": "carlos@example.com",
"origen": "Email",
"inmueble": {
"direccion_zona": "Calle Mayor 10, Madrid",
"tipo_operacion": "venta",
"tipo_inmueble": "piso",
"metros_cuadrados": 92,
"habitaciones": 3,
"banos": 2,
"precio_orientativo": 420000,
"estado_descripcion": "Reformado, exterior"
}
}'Respuesta 201
{
"message": "Cliente creado correctamente.",
"data": {
"lead_id": 81,
"cliente_id": 1254,
"inmueble_id": 908,
"tipo_cliente": "ofertante",
"created_at": "2026-09-18T10:30:00+02:00"
}
}Errores y límites
Se permiten 14 peticiones por minuto y credencial. El intento 15 bloquea la credencial durante 60 segundos. Consulta Retry-After antes de reintentar.
| HTTP | Significado |
|---|---|
| 401 | Credenciales incorrectas o JWT ausente, inválido o caducado. |
| 403 | La inmobiliaria vinculada ya no está disponible. |
| 409 | Existe una petición con la misma clave de idempotencia todavía en proceso o fallida. |
| 422 | Los datos no cumplen la validación. La respuesta incluye errores por campo. |
| 429 | Límite superado. La respuesta contiene los segundos restantes en retry_after. |
| 503 | No se pudo conectar temporalmente con la base de datos de la inmobiliaria. |