Listar Contratos
Permite obtener la lista paginada de todos los contratos de arrendamiento registrados en el sistema. Cada elemento incluye la información completa del contrato: propiedad asociada, propietarios, inquilinos, valores económicos, fechas, estado y observaciones.
¿Para qué sirve este servicio?
Úsalo para sincronizar el inventario de contratos con tu sistema externo, generar reportes de gestión inmobiliaria, alimentar dashboards con información contractual o consultar el estado general de los contratos administrados.
1. El Endpoint (La dirección web)
Apunta tu sistema a la siguiente dirección. Recuerda reemplazar {{instancia}} por la dirección web completa que utilizas para ingresar a tu plataforma.
GET https://{{instancia}}/service/v2/public/contracts/list
¿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.
2. La Petición (¿Qué debes enviarnos?)
Este servicio no requiere cuerpo en la petición. Envía los encabezados requeridos y opcionalmente los parámetros de paginación en la URL:
| Método | GET |
| Content-Type | application/json |
| Authorization | Bearer token, Token obtenido al consumir el servicio Login |
¿Aún no tienes tu Token de acceso?
Para consumir este servicio necesitas un Token vigente. Consulta el servicio de Login para aprender cómo obtenerlo.
Parámetros de consulta (query string):
| Parámetro | Tipo | Requerido | Por defecto | Descripción |
|---|---|---|---|---|
page |
integer | No | 1 | Número de página de resultados que se desea recuperar. Debe ser un número positivo. |
page_size |
integer | No | 10 | Número máximo de contratos por página. Debe ser un número positivo. Valor máximo permitido: 1000. |
Ejemplos de petición:
GET https://mi-inmobiliaria.nuby.app/service/v2/public/contracts/list
GET https://mi-inmobiliaria.nuby.app/service/v2/public/contracts/list?page=2
GET https://mi-inmobiliaria.nuby.app/service/v2/public/contracts/list?page_size=50
GET https://mi-inmobiliaria.nuby.app/service/v2/public/contracts/list?page=3&page_size=100
3. La Respuesta (¿Qué te entregaremos?)
Si tu Token es válido, el sistema te devolverá un objeto JSON con el estado de la respuesta, el listado de contratos y la información de paginación. La respuesta se verá similar a esta:
{
"status": 200,
"message": null,
"body": [
{
"contrato_id": 45,
"consecutivo": "45",
"propiedad_id": 312,
"propiedad": "312 - Cll 78 # 12 - 34 Apto 501",
"estrato_propiedad": "Cuatro",
"propietario": "[1] 52498731 - ANDREA MILENA CASTRO ROJAS",
"propietarios_id": "18",
"inquilino": "[1] 80213654 - CARLOS EDUARDO PINEDA VARGAS",
"inquilinos_id": "42",
"valor_canon_individual": "2850000",
"canon_total": 2850000,
"porcentaje_comision": "10.00 %",
"periodicidad": "Mensual",
"escenario": "CANON DE ARRENDAMIENTO SIN IVA, CON RETEFUENTE 3.5%, SIN RETEIVA, SIN RETEICA",
"estado": "Activo",
"estado_id": 1,
"fecha_inicio": "2024-06-01",
"fecha_fin": "2025-05-31",
"fecha_terminacion": null,
"observaciones": "Contrato renovado automáticamente por un año adicional.",
"uso": "Vivienda",
"fecha_creacion": "2024-05-28 14:32:10",
"creado_por": "Sandra"
},
{
"contrato_id": 46,
"consecutivo": "46",
"propiedad_id": 589,
"propiedad": "589 - Cra 45 # 90 - 12 Local 3",
"estrato_propiedad": "Comercial",
"propietario": "[1] 900456789 - INVERSIONES HORIZONTE S.A.S.",
"propietarios_id": "65",
"inquilino": "[1] 1098745231 - JULIANA PATRICIA RÍOS MENDOZA",
"inquilinos_id": "73",
"valor_canon_individual": "4500000",
"canon_total": 4500000,
"porcentaje_comision": "8.50 %",
"periodicidad": "Mensual",
"escenario": "CANON DE ARRENDAMIENTO CON IVA 19%, CON RETEFUENTE 3.5%, CON RETEIVA 15%, SIN RETEICA",
"estado": "Activo",
"estado_id": 1,
"fecha_inicio": "2023-09-01",
"fecha_fin": "2025-08-31",
"fecha_terminacion": null,
"observaciones": null,
"uso": "Comercial",
"fecha_creacion": "2023-08-25 09:15:44",
"creado_por": "Administrador"
},
{
"contrato_id": 12,
"consecutivo": "12",
"propiedad_id": 104,
"propiedad": "104 - Cll 23 # 56 - 78",
"estrato_propiedad": "Tres",
"propietario": "[1] 71654321 - HÉCTOR FABIO MORENO AGUILAR",
"propietarios_id": "31",
"inquilino": "[1] 43876123 - DIANA MARCELA OSPINA VELÁSQUEZ",
"inquilinos_id": "55",
"valor_canon_individual": "1200000",
"canon_total": 1200000,
"porcentaje_comision": "12.00 %",
"periodicidad": "Mensual",
"escenario": "CANON DE ARRENDAMIENTO SIN IVA, SIN RETEFUENTE, SIN RETEIVA, SIN RETEICA",
"estado": "Terminado",
"estado_id": 2,
"fecha_inicio": "2022-01-15",
"fecha_fin": "2023-01-14",
"fecha_terminacion": "2022-11-30",
"observaciones": "Terminación anticipada por mutuo acuerdo.",
"uso": "Vivienda",
"fecha_creacion": "2021-12-20 16:40:33",
"creado_por": "Sandra"
}
],
"pagination": {
"total_records": 347,
"total_pages": 116,
"current_page": 1,
"page_size": 3,
"current_page_records": 3,
"has_next_page": true,
"has_previous_page": false
}
}
Estructura principal de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
status |
integer | Código del estado de la respuesta. 200 para exitoso, 400 para error de validación, 500 para error interno. |
message |
string | null | Cuando la respuesta es exitosa vale null. Si no se encuentran contratos, contiene el mensaje informativo. Si hay error, describe el problema. |
body |
array | Listado de contratos devueltos. Arreglo vacío [] si no hay resultados. |
pagination |
object | Información de paginación para recorrer los resultados. |
Campos de cada contrato (body)
Cada elemento dentro del arreglo body contiene las siguientes claves:
| Campo | Tipo | Descripción |
|---|---|---|
contrato_id |
integer | Identificador único del contrato en el sistema. |
consecutivo |
string | Número consecutivo interno del contrato. |
propiedad_id |
integer | Identificador de la propiedad asociada al contrato. |
propiedad |
string | Etiqueta descriptiva de la propiedad en formato {id} - {dirección}. |
estrato_propiedad |
string | Estrato socioeconómico asignado a la propiedad (ej. "Tres", "Cuatro", "Comercial"). |
propietario |
string | Cadena con el consecutivo del detalle, documento y nombre completo del propietario o propietarios. Formato: [n] documento - NOMBRE. Si hay varios, van separados por coma. |
propietarios_id |
string | ID(s) del/los propietario(s) en el sistema. Si hay varios, van separados por coma. |
inquilino |
string | Cadena con el consecutivo del detalle, documento y nombre completo del inquilino o inquilinos. Mismo formato que propietario. |
inquilinos_id |
string | ID(s) del/los inquilino(s) en el sistema. Si hay varios, van separados por coma. |
valor_canon_individual |
string | Valor del canon por cada detalle del contrato. Si hay varios detalles, los valores van separados por coma. |
canon_total |
number | null | Valor total del canon de arrendamiento del contrato. |
porcentaje_comision |
string | Porcentaje de comisión de la inmobiliaria con formato "X.XX %". |
periodicidad |
string | Frecuencia de pago del canon (ej. "Mensual"). |
escenario |
string | Descripción del escenario tributario y de facturación aplicado al contrato. |
estado |
string | Estado textual del contrato. Valores posibles: Activo, Terminado, En Construcción. |
estado_id |
integer | Identificador numérico del estado: 1 = Activo, 2 = Terminado, 3 = En Construcción. |
fecha_inicio |
string | Fecha de inicio del contrato en formato YYYY-MM-DD. |
fecha_fin |
string | Fecha de finalización prevista del contrato en formato YYYY-MM-DD. |
fecha_terminacion |
string | null | Fecha de terminación efectiva del contrato (si aplica). null si el contrato sigue vigente. |
observaciones |
string | null | Observaciones o notas asociadas al contrato. null si no hay. |
uso |
string | Tipo de uso de la propiedad: Vivienda o Comercial. |
fecha_creacion |
string | Fecha y hora de creación del registro en formato YYYY-MM-DD HH:MM:SS. |
creado_por |
string | Nombre del usuario que creó el contrato en el sistema. |
Campos de paginación (pagination)
El objeto pagination contiene las siguientes claves:
| Campo | Tipo | Descripción |
|---|---|---|
total_records |
integer | Total de contratos registrados en el sistema. |
total_pages |
integer | Cantidad total de páginas disponibles (total de registros dividido por el tamaño de página). |
current_page |
integer | Número de la página actual consultada. |
page_size |
integer | Tamaño de la página (cantidad de registros solicitados por consulta). |
current_page_records |
integer | Cantidad de registros efectivamente devueltos en la página actual. |
has_next_page |
boolean | true si existen páginas posteriores que se pueden consultar. |
has_previous_page |
boolean | true si existen páginas anteriores que se pueden consultar. |
Nota sobre contratos sin resultados
Si no existen contratos registrados en el sistema, la respuesta tendrá HTTP 200 con body vacío ([]), un message informativo y los valores de paginación en cero.
4. Seguridad y Posibles Errores
¡Tu pase tiene fecha de caducidad!
Por medidas de seguridad, el token que te entregamos solo dura 1 hora. Una vez transcurrido ese tiempo, el pase expirará y el sistema te bloqueará el acceso devolviéndote un error 401. Cuando esto ocurra, tu sistema simplemente debe volver a consumir el servicio de Login para pedir un pase nuevo y continuar trabajando.
Así se ve el error que te devolverá el sistema cuando tu token se haya vencido o intentes usar un pase inválido:
{
"statusCode": 401,
"error": {
"type": "SERVER_ERROR",
"description": "JWT Token expired."
}
}
Si alguno de los parámetros de paginación no cumple con las validaciones, el sistema devolverá un error 400 con la estructura estándar. Por ejemplo:
{
"status": 400,
"message": "El parámetro \"page_size\" debe ser un número positivo.",
"body": null,
"pagination": null
}
Posibles errores:
| Código HTTP | Descripción |
|---|---|
| 400 | Token faltante o inválido. Posibles causas: — No se envió el encabezado Authorization. Mensaje: "JWT Token required."— El encabezado no tiene el formato Bearer {token}. Mensaje: "JWT Token not send."— El token no fue encontrado en el sistema. Mensaje: "JWT Token not found."Parámetros inválidos. Posibles causas: — page no es numérico o no es positivo.— page_size no es numérico o no es positivo. |
| 401 | El token ha expirado. Debes generar uno nuevo consumiendo el servicio de Login. Mensaje: "JWT Token expired." |
| 403 | El cliente OAuth no tiene el scope necesario para esta operación. Para endpoints GET se requiere el scope read. Mensaje: "Insufficient scope. Required: 'read', granted: '{scope_actual}'." |
| 500 | Error interno del servidor al procesar la consulta de contratos. |
5. Ejemplos de integración
Aquí tienes ejemplos de código listos para que tus desarrolladores los adapten a tu plataforma:
cURL
# Listar contratos con paginación por defecto
curl -X GET "https://{{instancia}}/service/v2/public/contracts/list" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TU_TOKEN_AQUI"
# Listar contratos página 3 con 100 registros por página
curl -X GET "https://{{instancia}}/service/v2/public/contracts/list?page=3&page_size=100" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TU_TOKEN_AQUI"
PHP
<?php
$instance = 'tu_instancia'; // Reemplaza con tu instancia real
$token = 'TU_TOKEN_AQUI'; // Token obtenido del servicio Login
// Parámetros de paginación
$page = 1;
$page_size = 50;
$queryParams = http_build_query([
'page' => $page,
'page_size' => $page_size
]);
$url = "https://{$instance}/service/v2/public/contracts/list?{$queryParams}";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
"Authorization: Bearer {$token}"
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
echo 'Error: ' . curl_error($ch);
} else {
echo "Código de estado HTTP: " . $http_code . "\n";
$info = json_decode($response, true);
$body = $info['body'] ?? [];
if ($http_code === 200 && !empty($body)) {
$pagination = $info['pagination'];
echo "Contratos encontrados: {$pagination['total_records']} (página {$pagination['current_page']} de {$pagination['total_pages']})\n";
foreach ($body as $contrato) {
echo " [{$contrato['consecutivo']}] {$contrato['propiedad']} - {$contrato['estado']} - Canon: \${$contrato['canon_total']}\n";
}
} else {
echo "Mensaje: " . ($info['message'] ?? 'Sin resultados') . "\n";
}
}
curl_close($ch);
?>
Python
import requests
# 1. Configura tus datos de acceso
instancia = 'mi-inmobiliaria.nuby.app' # Reemplaza con tu dirección web completa
token = 'TU_TOKEN_AQUI' # Token obtenido del servicio Login
# 2. Prepara la dirección y los parámetros
url = f"https://{instancia}/service/v2/public/contracts/list"
params = {
"page": 1,
"page_size": 50
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}"
}
# 3. Envía la petición GET y procesa la respuesta
try:
response = requests.get(url, params=params, headers=headers)
print(f"Código de estado HTTP: {response.status_code}")
if response.status_code == 200:
info = response.json()
body = info.get('body', [])
pagination = info.get('pagination', {})
if body:
print(f"Contratos: {pagination['total_records']} total (página {pagination['current_page']} de {pagination['total_pages']})")
for contrato in body:
print(f" [{contrato['consecutivo']}] {contrato['propiedad']} - {contrato['estado']} - Canon: ${contrato['canon_total']}")
else:
print(f"Mensaje: {info.get('message', 'Sin resultados')}")
else:
print("Error al consultar los contratos.")
print(f"Detalle del error: {response.text}")
except Exception as e:
print(f"Ocurrió un error de conexión: {e}")
JavaScript
// 1. Configura tus datos de acceso
const instancia = 'mi-inmobiliaria.nuby.app'; // Reemplaza con tu dirección web completa
const token = 'TU_TOKEN_AQUI'; // Token obtenido del servicio Login
// 2. Prepara la dirección con parámetros
const params = new URLSearchParams({
page: 1,
page_size: 50
});
const url = `https://${instancia}/service/v2/public/contracts/list?${params}`;
// 3. Función para consultar los contratos
async function consultarContratos() {
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}
});
console.log(`Código de estado HTTP: ${response.status}`);
if (response.ok) {
const info = await response.json();
const body = info.body || [];
const pagination = info.pagination || {};
if (body.length > 0) {
console.log(`Contratos: ${pagination.total_records} total (página ${pagination.current_page} de ${pagination.total_pages})`);
body.forEach(contrato => {
console.log(` [${contrato.consecutivo}] ${contrato.propiedad} - ${contrato.estado} - Canon: $${contrato.canon_total}`);
});
} else {
console.log(`Mensaje: ${info.message || 'Sin resultados'}`);
}
} else {
console.log('Error al consultar los contratos.');
const errorData = await response.text();
console.log(`Detalle del error: ${errorData}`);
}
} catch (error) {
console.error(`Ocurrió un error de conexión: ${error}`);
}
}
// 4. Ejecutamos la función
consultarContratos();
Power Query M (Excel / Power BI)
let
// 1. Configura tus datos de acceso
instancia = "mi-inmobiliaria.nuby.app", // Reemplaza con tu dirección web completa
token = "TU_TOKEN_AQUI", // Token obtenido del servicio Login
// 2. Prepara la dirección de la petición con parámetros
url = "https://" & instancia & "/service/v2/public/contracts/list?page=1&page_size=1000",
// 3. Envía la petición GET
response = Web.Contents(url, [
Headers = [
#"Content-Type" = "application/json",
#"Authorization" = "Bearer " & token
]
]),
// 4. Decodifica la respuesta JSON
jsonResponse = Json.Document(response),
body = jsonResponse[body],
// 5. Convierte el listado en tabla
tabla = Table.FromList(body, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
expandido = Table.ExpandRecordColumn(tabla, "Column1",
{"contrato_id", "consecutivo", "propiedad", "estrato_propiedad", "propietario", "inquilino", "canon_total", "porcentaje_comision", "periodicidad", "estado", "fecha_inicio", "fecha_fin", "fecha_terminacion", "uso", "creado_por"},
{"ContratoID", "Consecutivo", "Propiedad", "Estrato", "Propietario", "Inquilino", "Canon", "Comision", "Periodicidad", "Estado", "FechaInicio", "FechaFin", "FechaTerminacion", "Uso", "CreadoPor"})
in
expandido