# Crear Propiedad

Permite registrar una nueva propiedad en el sistema de forma integral. A través de este servicio, es posible guardar la información básica de la propiedad, asociar propietarios (existentes o creados dinámicamente en la misma petición), registrar características personalizadas, coordenadas geográficas, videos de recorridos, fotos del inmueble y relacionar otras propiedades.

<p class="callout info">**¿Para qué sirve este servicio?**  
Úsalo cuando necesites automatizar el ingreso de propiedades a nuby desde portales externos, aplicaciones móviles o sistemas de captación propios. Este endpoint está diseñado bajo un modelo transaccional robusto, asegurando que si algún paso crítico falla (por ejemplo, validación de un propietario o falta de características obligatorias del tipo de propiedad), toda la operación se cancele de forma automática para evitar datos inconsistentes en tu base de datos.</p>

---

#### **1. El Endpoint (La dirección web)**

Apunta tu sistema a la siguiente dirección de petición POST. Recuerda reemplazar <span style="color: rgb(241, 196, 15);">**{{instancia}}**</span> por la dirección web completa que utilizas para ingresar a tu plataforma.

```http
POST https://{{instancia}}/service/v2/public/properties
```

<p class="callout info">**¿Qué debes colocar en {{instancia}}?**  
Es muy sencillo: corresponde a la **dirección web principal** que utilizas a diario para ingresar a tu plataforma (incluyendo la terminación `.nuby.app` o `.arrendasoft.co`).  
Por ejemplo, si para entrar a tu sistema escribes `inmobiliaria.nuby.app` o `inmobiliaria.arrendasoft.co` en tu navegador, esa será exactamente tu instancia. Solo asegúrate de no incluir el "https://" ni barras diagonales ("/") al final.</p>

#### **2. La Petición (¿Qué debes enviarnos?)**

Este servicio requiere autenticación mediante un Token JWT. Envía los encabezados requeridos y estructura la petición con un cuerpo (Body) en formato JSON que contenga las secciones detalladas a continuación:

<table border="1" id="bkmrk-m%C3%A9todo-post-content-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 20%;"></col><col style="width: 80%;"></col></colgroup><tbody><tr><td>**Método**</td><td>POST</td></tr><tr><td>**Content-Type**</td><td>application/json</td></tr><tr><td>**Authorization**</td><td>**Bearer token**, Token obtenido al consumir el servicio **Login**.</td></tr></tbody></table>

<p class="callout danger">**Autenticación requerida**  
Este servicio requiere un Token de autenticación válido. Debes incluir el encabezado `Authorization: Bearer TU_TOKEN` en cada petición. El token se obtiene consumiendo el servicio de **Login**. Adicionalmente, el cliente OAuth debe contar con el scope `write` para poder consumir este endpoint.</p>

##### **Cuerpo de la petición (JSON Body - Estructura General)**

La raíz del JSON enviado debe estructurarse con las siguientes llaves principales:

<table border="1" id="bkmrk-elemento-ra%C3%ADz-tipo-r" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 15%;"></col><col style="width: 15%;"></col><col style="width: 45%;"></col></colgroup><thead><tr><th>Elemento Raíz</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>**Propiedad**</td><td>object</td><td>Sí</td><td>Contiene la información básica del inmueble (Título, tipo, ubicación, valores, etc.).</td></tr><tr><td>**Propietarios**</td><td>array</td><td>Sí</td><td>Lista de propietarios asociados. Puede ser un arreglo de IDs existentes o de objetos con datos de nuevos propietarios.</td></tr><tr><td>**Caracteristicas**</td><td>object</td><td>No</td><td>Mapeo de características de la propiedad en formato llave-valor `{"id_caracteristica": "valor"}`.</td></tr><tr><td>**Videos**</td><td>array</td><td>No</td><td>Listado de enlaces a videos del inmueble.</td></tr><tr><td>**Fotos**</td><td>array</td><td>No</td><td>Listado de imágenes del inmueble en formato base64 o URLs públicas.</td></tr><tr><td>**PropiedadesRelacionadas**</td><td>array</td><td>No</td><td>Arreglo de códigos numéricos de propiedades que se desea relacionar de forma recíproca.</td></tr><tr><td>**Coordenadas**</td><td>string | object</td><td>No</td><td>Coordenadas de latitud y longitud. Ejemplo de texto: `"6.2089,-75.5678"`.</td></tr></tbody></table>

---

##### **Estructura Detallada de las Secciones**

#### **2.1 Sección "Propiedad" 🏢**

Contiene la información comercial y técnica base del inmueble. Los siguientes campos son validados estrictamente bajo validación rápida (Fail-Fast):

<table border="1" id="bkmrk-campo-tipo-requerido" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 15%;"></col><col style="width: 15%;"></col><col style="width: 45%;"></col></colgroup><thead><tr><th>Campo</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>**txtTitulo**</td><td>string</td><td>Sí</td><td>Título descriptivo o publicitario del inmueble. Máximo 255 caracteres.</td></tr><tr><td>**tipo\_id**</td><td>integer</td><td>Sí</td><td>ID de la clase de propiedad (Ej: apartamento, casa, local). Debe ser una clase existente en la maestra de clases de inmueble.</td></tr><tr><td>**propiedad\_tipo**</td><td>string</td><td>Sí</td><td>Modalidad de comercialización. Valores válidos: `"arriendo"`, `"venta"`, o `"venta y arriendo"`.</td></tr><tr><td>**municipio\_id**</td><td>integer</td><td>Sí</td><td>ID de la ciudad o municipio donde se ubica el inmueble (debe existir en la maestra de municipios).</td></tr><tr><td>**direccion**</td><td>string</td><td>Sí</td><td>Dirección exacta del inmueble. El sistema validará que no exista otra propiedad con la misma dirección en el mismo municipio para evitar duplicados accidentales.</td></tr><tr><td>**estrato**</td><td>integer</td><td>Sí</td><td>Estrato socioeconómico del inmueble. Debe ser un número entero entre 1 y 6.</td></tr><tr><td>**barrio\_id**</td><td>integer</td><td>No</td><td>ID del barrio (debe existir en la maestra de barrios de la ciudad).</td></tr><tr><td>**urbanizacion**</td><td>string</td><td>No</td><td>Nombre del edificio, conjunto cerrado o urbanización.</td></tr><tr><td>**valor\_arriendo**</td><td>numeric</td><td>No</td><td>Canon mensual del arriendo (monto mayor o igual a 0).</td></tr><tr><td>**valor\_venta**</td><td>numeric</td><td>No</td><td>Precio de venta solicitado (monto mayor o igual a 0).</td></tr><tr><td>**valor\_administracion**</td><td>numeric</td><td>No</td><td>Costo de la cuota de administración de la copropiedad.</td></tr><tr><td>**propiedad\_area**</td><td>numeric</td><td>No</td><td>Área privada del inmueble en metros cuadrados. Se envía estrictamente con el nombre físico de columna.</td></tr><tr><td>**observaciones**</td><td>string</td><td>No</td><td>Descripción comercial extensa del inmueble.</td></tr><tr><td>**llaves\_en**</td><td>string</td><td>No</td><td>Ubicación física de las llaves. Valores válidos: `"oficina"`, `"propiedad"`, o `"otro"`.</td></tr><tr><td>**paga\_cuota\_sost**</td><td>string</td><td>No</td><td>Establece quién asume el pago de la cuota de administración. Valores válidos: `"propietario"` o `"inquilino"`.</td></tr><tr><td>**folio\_matricula**</td><td>string</td><td>No</td><td>Número de matrícula inmobiliaria del inmueble.</td></tr><tr><td>**referencia\_catastral**</td><td>string</td><td>No</td><td>Número de referencia catastral asignado por el municipio.</td></tr></tbody></table>

---

#### **2.2 Sección "Propietarios" 👥**

Cada propiedad en nuby requiere obligatoriamente tener asociado al menos un propietario. El arreglo acepta dos formatos de datos, los cuales pueden combinarse:

#### **Formato A: Propietario Existente (Por ID)**

Si el propietario ya se encuentra registrado en el ERP nuby, simplemente envía su identificador único (ID de tercero) como un entero dentro del arreglo:

```json
"Propietarios": [1528, 4390]
```

#### **Formato B: Creación Dinámica de Propietario (Objeto de Datos)**

Si el propietario no existe, puedes enviar sus datos completos estructurados en un objeto. El sistema validará su información, lo creará automáticamente en la base de datos de nuby, y lo asociará al inmueble bajo una misma transacción comercial:

<table border="1" id="bkmrk-campo-tipo-requerido-1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 15%;"></col><col style="width: 15%;"></col><col style="width: 45%;"></col></colgroup><thead><tr><th>Campo</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>**persona**</td><td>integer</td><td>Sí</td><td>Naturaleza jurídica del tercero: `1` = Persona Natural, `2` = Persona Jurídica.</td></tr><tr><td>**documento**</td><td>string</td><td>Sí</td><td>Número de documento de identidad o NIT.</td></tr><tr><td>**tipo\_doc\_id**</td><td>integer</td><td>Sí</td><td>ID de la maestra de tipos de documentos (Cédula, NIT, Pasaporte, etc.).</td></tr><tr><td>**nombre1**</td><td>string</td><td>Sí</td><td>Primer nombre del propietario o razón social completa.</td></tr><tr><td>**apellido1**</td><td>string</td><td>Sí (para Natural)</td><td>Primer apellido del propietario (requerido si `persona = 1`).</td></tr><tr><td>**direccion1**</td><td>string</td><td>Sí</td><td>Dirección de domicilio del propietario.</td></tr><tr><td>**municipio\_id**</td><td>integer</td><td>Sí</td><td>ID del municipio de residencia (debe existir en la base de datos).</td></tr><tr><td>**email**</td><td>string</td><td>Sí</td><td>Correo electrónico para envío de facturas and notificaciones. Debe tener formato de email válido.</td></tr><tr><td>**telefono**</td><td>string</td><td>Sí</td><td>Número telefónico o celular de contacto.</td></tr><tr><td>**tipo\_persona\_id**</td><td>integer</td><td>Sí (para Natural)</td><td>ID de tipo de persona tributaria (requerido si `persona = 1`).</td></tr><tr><td>**regimen\_id**</td><td>integer</td><td>Sí (para Natural)</td><td>ID del régimen tributario del propietario (requerido si `persona = 1`).</td></tr><tr><td>**resp\_fiscal\_id**</td><td>integer</td><td>Sí (para Natural)</td><td>ID de la responsabilidad fiscal (requerido si `persona = 1`).</td></tr></tbody></table>

---

#### **2.3 Sección "Caracteristicas" ⚙️**

Permite registrar valores para las características personalizadas del inmueble. Se envía en formato de objeto clave-valor, donde la clave es el ID numérico de la característica y el valor es el contenido a asignar:

```json
"Caracteristicas": {
    "1": "3",   // ID 1 (Habitaciones) = 3
    "2": "2",   // ID 2 (Baños) = 2
    "31": "si", // ID 31 (Red de gas) = si (Obligatoria)
    "63": "1"   // ID 63 (Garaje) = 1 (Checkbox de Garaje activo)
}
```

<p class="callout danger">**Validación de Características Obligatorias por Tipo**  
El motor de validación del sistema nuby verificará qué características están configuradas en el ERP como **obligatorias** para el tipo de propiedad seleccionado (`tipo_id`). Si omites alguna de estas características obligatorias en la petición, o el formato del valor es erróneo (por ejemplo, enviar texto en un campo netamente numérico), el endpoint devolverá un código de estado `422 Unprocessable Entity` y se revertirá todo el proceso de guardado.   
**Nota:** En una configuración estándar, el apartamento (`1247`) y la casa (`1249`) exigen de forma obligatoria las características de: N° de Habitaciones (ID 1), N° de Baños (ID 2) y Red de gas (ID 31).</p>

---

#### **2.4 Sección "Fotos" 📸**

Permite adjuntar imágenes del inmueble de forma directa. El procesamiento de imágenes está automatizado y realiza optimizaciones de rendimiento y de presentación visual (redimensionamiento, corrección de orientación por metadatos EXIF, e inserción de la marca de agua corporativa configurada en el sistema).

<table border="1" id="bkmrk-campo-tipo-requerido-2" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 15%;"></col><col style="width: 15%;"></col><col style="width: 45%;"></col></colgroup><thead><tr><th>Campo</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>**url**</td><td>string</td><td>Sí</td><td>Contenido de la imagen. Puede enviarse como una cadena Base64 válida (`data:image/jpeg;base64,...`) o como una URL accesible públicamente para su descarga.</td></tr><tr><td>**nombre**</td><td>string</td><td>No</td><td>Nombre del archivo o descripción física para almacenar el documento.</td></tr></tbody></table>

---

#### **2.5 Sección "Videos" 🎥**

Permite registrar recorridos en video de las propiedades (por ejemplo, cargados en plataformas como YouTube o Vimeo):

<table border="1" id="bkmrk-campo-tipo-requerido-3" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 15%;"></col><col style="width: 15%;"></col><col style="width: 45%;"></col></colgroup><thead><tr><th>Campo</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>**video\_url**</td><td>string</td><td>Sí</td><td>URL completa o código físico del video. Ejemplo: `"https://www.youtube.com/watch?v=..."`.</td></tr><tr><td>**video\_tipo**</td><td>string</td><td>No</td><td>Tipo o plataforma emisora del video (Ej: `"youtube"` o `"vimeo"`).</td></tr><tr><td>**video\_descripcion**</td><td>string</td><td>No</td><td>Descripción del video.</td></tr><tr><td>**video\_posicion**</td><td>integer</td><td>No</td><td>Posición de visualización de este video.</td></tr></tbody></table>

---

#### **2.6 Sección "PropiedadesRelacionadas" y "Coordenadas" 📍**

- **PropiedadesRelacionadas** → Permite enlazar propiedades entre sí (ideal para bodegas subdivididas, oficinas del mismo centro de negocios, etc.). Recibe una lista de códigos de inmuebles: `[137, 1042]`. El sistema nuby creará una asociación **recíproca**: la propiedad creada apuntará a estas asociadas, y estas asociadas apuntarán automáticamente a la nueva propiedad.
- **Coordenadas** → Coordenadas de geolocalización. Se recomienda enviar como una cadena de texto separada por comas `"latitud,longitud"` (Ej: `"6.2089,-75.5678"`). El motor de nuby se encarga de analizar la cadena, validar su rango físico geográfico y guardarlo bajo el formato propietario del sistema.

---

#### **3. La Respuesta (¿Qué te entregaremos?)**

Esta sección describe la respuesta que recibirás del sistema cuando la creación del inmueble sea completamente exitosa.

##### **Respuesta Exitosa (201 Created)**

Se genera cuando la propiedad y todos sus componentes asociados han sido validados e insertados con éxito. Se retorna el identificador único físico asignado al inmueble:

```json
{
  "error": false,
  "type": "success",
  "msg": "La propiedad ha sido creada exitosamente.",
  "propiedad_id": 7786,
  "warnings": []
}
```

<p class="callout warning">**¿Qué contiene la sección "warnings"?**  
Si se incluyen fotos o videos y el almacenamiento en la nube o procesamiento de marcas de agua tiene algún inconveniente no letal (por ejemplo, formato no soportado o redimensión fallida de una imagen en particular), el inmueble **se creará con éxito**, pero se devolverán advertencias en esta sección para que puedas corregir los archivos de forma manual. Esto no interrumpe el registro del inmueble.</p>

---

#### **4. Seguridad y Posibles Errores**

El sistema realiza validaciones de autenticación, permisos (scopes) y estructura de datos. Si alguna falla, devolverá un error con su respectivo código HTTP y un mensaje descriptivo:

<table border="1" id="bkmrk-c%C3%B3digo-http-signific" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 15%;"></col><col style="width: 85%;"></col></colgroup><thead><tr><th>Código HTTP</th><th>Significado y Solución</th></tr></thead><tbody><tr><td>**400 Bad Request**</td><td>**Causa:** La estructura de la petición es incorrecta o faltan datos esenciales. Ocurre antes de que se intente procesar la lógica de negocio.  
**Ejemplos comunes:**- No se envió el objeto `Propiedad` o el array `Propietarios`.
- El array `Propietarios` está vacío.
- Se omitieron campos obligatorios dentro de la sección `Propiedad` (ej: `municipio_id`, `direccion`).
- Se envió un tipo de dato incorrecto (ej: texto en un campo numérico como `estrato`).

**Solución:** Revisa el cuerpo (body) de tu petición JSON y compáralo con la estructura definida en la sección 2 de esta guía. Asegúrate de que todos los campos requeridos estén presentes y tengan el tipo de dato correcto.</td></tr><tr><td>**401 Unauthorized**</td><td>**Causa:** El Token JWT de autenticación no es válido o ha expirado.  
**Solución:** Vuelve a consumir el servicio de **Login** para generar un nuevo token de acceso y úsalo en el encabezado `Authorization`.</td></tr><tr><td>**403 Forbidden**</td><td>**Causa:** El token es válido, pero el cliente OAuth con el que fue generado no tiene los permisos (scopes) necesarios para esta operación.  
**Solución:** Verifica la configuración de tu cliente OAuth en nuby y asegúrate de que tenga asignado el scope `write`.</td></tr><tr><td>**422 Unprocessable Entity**</td><td>**Causa:** La petición es sintácticamente correcta, pero incumple una regla de negocio del sistema.  
**Ejemplos comunes:**- La `direccion` enviada ya existe para otra propiedad en el mismo `municipio_id`.
- Se omitió una característica marcada como obligatoria para el `tipo_id` de la propiedad.
- Se intentó crear un propietario persona natural omitiendo los campos fiscales requeridos.
- Se usó un ID de un modelo que no existe (ej: un `municipio_id` o `tipo_id` inválido).

**Solución:** Lee con atención el `msg` del JSON de error. Te indicará exactamente qué regla de negocio se infringió para que puedas corregir los datos enviados.</td></tr></tbody></table>

<p class="callout danger">**Operación Atómica y de Transacción Segura**  
nuby implementa transacciones anidadas en sus modelos de negocio. Si el endpoint responde con un código `422` (o un fallo 500 del servidor), **toda la creación física del inmueble es cancelada de forma automática (ROLLBACK)**. No tendrás propiedades huérfanas sin propietario ni registros incompletos en las tablas del sistema.</p>

---

#### **5. Ejemplos de integración**

Aquí tienes ejemplos de código listos para que tus desarrolladores los adapten a tu plataforma:

<details id="bkmrk-ejemplos-de-json-bod"><summary>Ejemplos de JSON Body</summary>

##### **Ejemplo 1: Creación de propiedad con propietario existente**

```json
{
  "Propiedad": {
    "txtTitulo": "Penthouse Duplex El Poblado con Terraza",
    "tipo_id": 1247,
    "propiedad_tipo": "arriendo",
    "municipio_id": 1,
    "direccion": "Carrera 35 # 10B - 120, Apartamento 1201",
    "estrato": 1260,
    "barrio_id": 5,
    "valor_arriendo": 4800000,
    "valor_administracion": 650000,
    "urbanizacion": "Torres de San Lucas",
    "observaciones": "Espectacular penthouse con vista de 360 grados, tina de hidromasajes en terraza principal, 3 alcobas cada una con baño.",
    "propiedad_area": 185.4,
    "llaves_en": "oficina",
    "paga_cuota_sost": "propietario"
  },
  "Propietarios": [
    1247
  ],
  "Caracteristicas": {
    "1": "3",   // Alcobas
    "2": "4",   // Baños
    "31": "si", // Red de gas (Obligatoria)
    "63": "1"   // Garaje (Checkbox de Garaje - ID 63 en nuby)
  },
  "Coordenadas": "6.205210,-75.561240"
}
```

##### **Ejemplo 2: Creación de propiedad con propietario nuevo, videos y fotos**

```json
{
  "Propiedad": {
    "txtTitulo": "Casa de Campo en Llanogrande",
    "tipo_id": 1249,
    "propiedad_tipo": "venta",
    "municipio_id": 2,
    "direccion": "Vía Llanogrande Kilómetro 4, Parcelación La Sofía",
    "estrato": 1259,
    "valor_venta": 1250000000,
    "valor_administracion": 300000,
    "observaciones": "Hermosa casa de un solo nivel, amplias zonas verdes, deck con zona BBQ, acabados campestres modernos.",
    "propiedad_area": 320.0,
    "paga_cuota_sost": "propietario"
  },
  "Propietarios": [
    {
      "persona": 1,
      "documento": "1024567890",
      "tipo_doc_id": 1,
      "nombre1": "Alejandro",
      "apellido1": "Restrepo",
      "direccion1": "Transversal 39B # 4G - 85",
      "municipio_id": 1,
      "email": "alejandro.restrepo@email.com",
      "telefono": "3104567890",
      "tipo_persona_id": 1,
      "regimen_id": 2,
      "resp_fiscal_id": 11
    }
  ],
  "Caracteristicas": {
    "1": "4",
    "2": "5",
    "31": "si", // Red de gas (Obligatoria)
    "63": "1",  // Garaje (Checkbox de Garaje - ID 63 en nuby)
    "8": "Sí"
  },
  "Videos": [
    {
      "video_url": "https://www.youtube.com/watch?v=abc123xyz",
      "video_tipo": "youtube",
      "video_descripcion": "Video aéreo con Dron de la parcelación"
    }
  ],
  "Fotos": [
    {
      "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
      "nombre": "foto_fachada_casa_campo.jpg"
    }
  ]
}
```

</details><details id="bkmrk-curl-%23-define-tu-tok"><summary>cURL</summary>

```bash
# Define tu token y tu instancia
TOKEN="TU_TOKEN_AQUI"
INSTANCIA="tu-inmobiliaria.nuby.app"

# Prepara el cuerpo de la petición utilizando estrictamente los nombres de campos físicos
PAYLOAD='{
  "Propiedad": {
    "txtTitulo": "Apartamento para prueba cURL",
    "tipo_id": 1247,
    "propiedad_tipo": "arriendo",
    "municipio_id": 127,
    "direccion": "Calle Falsa 123 via cURL",
    "estrato": 1258,
    "propiedad_area": 97
  },
  "Propietarios": [1],
  "Caracteristicas": {
    "1": "3",
    "2": "3",
    "31": "si",
    "63": "1"
  }
}'

curl -X POST "https://${INSTANCIA}/service/v2/public/properties" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-d "${PAYLOAD}"
```

</details><details id="bkmrk-php-%3C%3Fphp-%24instancia"><summary>PHP</summary>

```php
<?php

$instancia = 'tu-inmobiliaria.nuby.app';
$token = 'TU_TOKEN_AQUI';

$url = "https://{$instancia}/service/v2/public/properties";

$payload = [
    'Propiedad' => [
        'txtTitulo' => 'Propiedad creada desde PHP',
        'tipo_id' => 1247,
        'propiedad_tipo' => 'venta',
        'municipio_id' => 127,
        'direccion' => 'Avenida Siempreviva 742, PHP',
        'estrato' => 1258,
        'propiedad_area' => 97 // Nombre exacto de la columna física
    ],
    'Propietarios' => [1], // ID de un propietario existente
    'Caracteristicas' => [
        '1' => '3',   // Habitaciones
        '2' => '3',   // Baños
        '31' => 'si', // Red de gas (Obligatoria)
        '63' => '1'   // Garaje (Checkbox de Garaje - ID 63 en nuby)
    ]
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    "Authorization: Bearer {$token}"
]);

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

echo "Código de estado HTTP: {$http_code}\n";
echo "Respuesta del servidor:\n";
print_r($response);

?>
```

</details><details id="bkmrk-python-import-reques"><summary>Python</summary>

```python
import requests
import json

instancia = 'tu-inmobiliaria.nuby.app'
token = 'TU_TOKEN_AQUI'
url = f"https://{instancia}/service/v2/public/properties"

payload = {
    "Propiedad": {
        "txtTitulo": "Propiedad Creada desde Python",
        "tipo_id": 1247,
        "propiedad_tipo": "venta",
        "municipio_id": 127,
        "direccion": "Calle de Python, 101",
        "estrato": 1258,
        "propiedad_area": 97
    },
    "Propietarios": [1], # ID de un propietario existente
    "Caracteristicas": {
        "1": "3",
        "2": "3",
        "31": "si",
        "63": "1"
    }
}

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {token}"
}

try:
    response = requests.post(url, headers=headers, data=json.dumps(payload))
    
    print(f"Código de estado HTTP: {response.status_code}")
    print("Respuesta del servidor:")
    print(response.json())

except requests.exceptions.RequestException as e:
    print(f"Ocurrió un error en la petición: {e}")


```

</details><details id="bkmrk-javascript-%28fetch-ap"><summary>JavaScript (Fetch API)</summary>

```javascript
const instancia = 'tu-inmobiliaria.nuby.app';
const token = 'TU_TOKEN_AQUI';
const url = `https://${instancia}/service/v2/public/properties`;

const payload = {
    "Propiedad": {
        "txtTitulo": "Propiedad Creada desde JavaScript",
        "tipo_id": 1247,
        "propiedad_tipo": "arriendo",
        "municipio_id": 127,
        "direccion": "Avenida JavaScript, Lote 5",
        "estrato": 1258,
        "propiedad_area": 97
    },
    "Propietarios": [1], // ID de un propietario existente
    "Caracteristicas": {
        "1": "3",
        "2": "3",
        "31": "si",
        "63": "1"
    }
};

async function crearPropiedad() {
    try {
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${token}`
            },
            body: JSON.stringify(payload)
        });

        const data = await response.json();

        console.log(`Código de estado HTTP: ${response.status}`);
        console.log('Respuesta del servidor:');
        console.log(data);

    } catch (error) {
        console.error('Error en la petición:', error);
    }
}

crearPropiedad();

```

</details><details id="bkmrk-power-query-m-%28excel"><summary>Power Query M (Excel / Power BI)</summary>

```powerquery
let
    instancia = "tu-inmobiliaria.nuby.app",
    token = "TU_TOKEN_AQUI",
    url = "https://" & instancia & "/service/v2/public/properties",

    payload = [
        Propiedad = [
            txtTitulo = "Propiedad desde Power Query",
            tipo_id = 1247,
            propiedad_tipo = "venta",
            municipio_id = 127,
            direccion = "Calle Power BI, 4.0",
            estrato = 1258,
            propiedad_area = 97
        ],
        Propietarios = {1}, // ID de un propietario existente
        Caracteristicas = [
            #"1" = "3",
            #"2" = "3",
            #"31" = "si",
            #"63" = "1"
        ]
    ],

    jsonPayload = Json.FromValue(payload),

    response = Web.Contents(url, [
        Headers = [
            #"Content-Type" = "application/json",
            #"Authorization" = "Bearer " & token
        ],
        Content = jsonPayload
    ]),
    
    jsonResponse = Json.Document(response)
in
    jsonResponse

```

</details>