Buscar Nota por Código [BETA]
Funcionalidad en desarrollo y pruebas: este servicio está disponible en el ambiente de pruebas y todavía no debe usarse en producción. El funcionamiento, los campos y los mensajes de error pueden cambiar antes del despliegue definitivo.
Este servicio devuelve el detalle completo de una nota de crédito o débito a partir de su identificador interno en nuby (nota_id): cabecera, ítems con sus impuestos y retenciones, y el estado y saldo actuales de la factura anotada.
Úsalo después de crear una nota, o cuando ya guardaste su nota_id y necesitas verificarla sin recorrer el listado.
¿Para qué sirve este servicio?
Úsalo cuando necesites ver el detalle de una nota sin recorrer el listado. Los casos de uso más frecuentes son:
- Verificar una nota recién creada. La creación ya devuelve el
nota_id; con este servicio confirmas su contenido. - Mostrar el detalle del ajuste en tu plataforma: cabecera e ítems con sus impuestos y retenciones.
- Auditar los montos que calculó nuby ítem por ítem: IVA, retenciones y descuento.
- Confirmar el estado y el saldo de la factura anotada antes de emitir el borrador en la interfaz de nuby.
1. El Endpoint (La dirección web)
Método y dirección
| Dato | Valor |
|---|---|
| Método | GET |
| Recurso | /notes/{nota_id} |
| Cuerpo de la petición | No se envía cuerpo |
GET https://{{instancia}}/service/v2/public/notes/{nota_id}
¿Qué debo colocar en {{instancia}}?
La dirección web principal con la que ingresas a tu plataforma, incluyendo la terminación .nuby.app o .arrendasoft.co.
Importante: no incluyas https:// ni barras diagonales (/) al final. La dirección se compone así: https:// + tu instancia + /service/v2/public/notes/ + el identificador de la nota.
Encabezados requeridos
| Encabezado | Valor |
|---|---|
Authorization |
Bearer <token>, con el token obtenido en el servicio Login. |
Permiso requerido (scope): catalogs:read
Este servicio es de solo lectura y exige el permiso catalogs:read. Si falta, la respuesta es 403 con RECURSO_NO_AUTORIZADO.
Si aún no tienes un token, consulta la página Login del libro API nuby V2.
2. La Petición (¿Qué debes enviarnos?)
Este servicio no requiere cuerpo. Solo necesitas el encabezado de autorización y el identificador de la nota en la dirección.
Parámetros de la ruta (path)
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
nota_id |
entero | Sí | Identificador interno de la nota. Debe ser un número: la dirección solo acepta dígitos. Va en la dirección, después del segmento /notes/. |
¿De dónde saco el nota_id?
- De la creación de la nota (
POST /notes): la respuesta lo devuelve enbody.nota_id. - Del listado (
GET /notes/list): cada fila delbodylo trae ennota_id.
Ejemplos de petición
GET https://tu-inmobiliaria.nuby.app/service/v2/public/notes/789
3. La Respuesta (¿Qué te entregaremos?)
Si la nota existe y pertenece a una factura de venta, el sistema devuelve el envelope y el cuerpo con el detalle de la nota:
{
"status": 200,
"message": null,
"body": {
"nota_id": 789,
"factura_id": 456,
"tipo": "credito",
"consecutivo": 1024,
"fecha": "2026-10-21",
"resolucion_id": 3,
"valor_total": 59500,
"estado_id": 5,
"moneda": "COP",
"tasa_cambio": 1,
"observaciones": "Ajuste acordado",
"clasificacion": 1,
"tercero_id": 123,
"concepto_id": 6,
"items": [
{
"producto_id": 159,
"descripcion": "Ajuste plan X",
"cantidad": 1,
"valor_unitario": 50000,
"por_iva": 19,
"iva": 9500,
"por_retencion": 0,
"retencion": 0,
"por_reteiva": 0,
"reteiva": 0,
"por_reteica": 0,
"reteica": 0,
"por_descuento": 0,
"descuento": 0
}
],
"factura_estado_id": 1,
"factura_saldo": 150000
},
"pagination": null,
"filters_applied": null
}
Nota sobre el envelope: es una consulta de un solo registro, así que pagination y filters_applied siempre vienen en null.
Cabecera de la nota
| Campo | Tipo | Puede ser null |
Descripción |
|---|---|---|---|
nota_id |
entero | No | Identificador interno de la nota. |
factura_id |
entero | No | Factura anotada. |
tipo |
texto | No | credito o debito. |
consecutivo |
entero | No | Número de la nota. |
fecha |
fecha | No | Fecha de la nota en formato AAAA-MM-DD. |
resolucion_id |
entero | Sí | Resolución heredada de la factura; puede ser null si la factura no tiene resolución. |
valor_total |
número | No | Valor total de la nota, calculado desde el detalle. |
estado_id |
entero | No | 5 = borrador. |
moneda |
texto | No | Moneda heredada de la factura (por ejemplo, COP). |
tasa_cambio |
número | No | Tasa heredada de la factura; es 1 cuando la moneda es la local. |
observaciones |
texto | No | Observaciones registradas; puede venir vacía si no se enviaron. |
clasificacion |
entero | No | 1 = vinculante. |
tercero_id |
entero | Sí | Tercero de la factura; puede ser null si la factura no lo tiene. |
concepto_id |
entero | No | Concepto aplicado a la nota. |
Campos de cada ítem
Cada ítem trae la base y los porcentajes junto con los montos ya calculados por nuby:
| Campo | Tipo | Descripción | Puede ser null |
|---|---|---|---|
producto_id |
entero | Producto o servicio del ítem. | No |
descripcion |
texto | Descripción del ajuste. | No (puede venir vacía) |
cantidad |
entero | Cantidad del ítem. | No |
valor_unitario |
número | Base unitaria enviada por el consumidor. | No |
por_iva |
número | Porcentaje de IVA aplicado. | No |
iva |
número | IVA calculado: base × por_iva / 100. |
No |
por_retencion |
número | Porcentaje de retención en la fuente. | No |
retencion |
número | Retención calculada sobre la base. | No |
por_reteiva |
número | Porcentaje de reteIVA. | No |
reteiva |
número | ReteIVA calculado sobre el IVA. | No |
por_reteica |
número | Porcentaje de reteICA. | No |
reteica |
número | ReteICA calculado sobre la base. | No |
por_descuento |
número | Porcentaje de descuento. | No |
descuento |
número | Descuento calculado sobre la base. | No |
Cómo se compone el valor total
| Monto | Fórmula | Se calcula sobre |
|---|---|---|
iva |
base × por_iva / 100 |
La base del ítem (cantidad × valor_unitario). |
retencion |
base × por_retencion / 100 |
La base del ítem. |
reteiva |
iva × por_reteiva / 100 |
El IVA calculado. |
reteica |
base × por_reteica / 100 |
La base del ítem. |
descuento |
base × por_descuento / 100 |
La base del ítem. |
El total del ítem suma la base y el IVA, y resta la retención, el reteIVA, el reteICA y el descuento. El valor_total de la nota es la suma de los totales de sus ítems, en la moneda original y con redondeo a dos decimales.
Estado y saldo de la factura
factura_estado_id indica el estado actual de la factura (1 activa, 6 anulada por nota crédito) y factura_saldo su saldo después de las notas.
Variantes de respuesta
El mismo endpoint devuelve una nota de crédito, una de débito o un rechazo de factura de contrato. Los tres casos cambian el contenido del body y, en el último, el estado HTTP:
Nota de crédito
{
"status": 200,
"message": null,
"body": {
"nota_id": 789,
"factura_id": 456,
"tipo": "credito",
"consecutivo": 1024,
"fecha": "2026-10-21",
"resolucion_id": 3,
"valor_total": 59500,
"estado_id": 5,
"moneda": "COP",
"tasa_cambio": 1,
"observaciones": "Ajuste acordado",
"clasificacion": 1,
"tercero_id": 123,
"concepto_id": 6,
"items": [
{
"producto_id": 159,
"descripcion": "Ajuste plan X",
"cantidad": 1,
"valor_unitario": 50000,
"por_iva": 19,
"iva": 9500,
"por_retencion": 0,
"retencion": 0,
"por_reteiva": 0,
"reteiva": 0,
"por_reteica": 0,
"reteica": 0,
"por_descuento": 0,
"descuento": 0
}
],
"factura_estado_id": 1,
"factura_saldo": 150000
},
"pagination": null,
"filters_applied": null
}
La nota de crédito reduce el saldo de la factura. Si el saldo llega a cero, factura_estado_id pasa a 6.
Nota de débito
{
"status": 200,
"message": null,
"body": {
"nota_id": 790,
"factura_id": 456,
"tipo": "debito",
"consecutivo": 1025,
"fecha": "2026-10-21",
"resolucion_id": 3,
"valor_total": 20000,
"estado_id": 5,
"moneda": "COP",
"tasa_cambio": 1,
"observaciones": "Cargo adicional acordado",
"clasificacion": 1,
"tercero_id": 123,
"concepto_id": 8,
"items": [
{
"producto_id": 159,
"descripcion": "Cargo adicional octubre",
"cantidad": 1,
"valor_unitario": 20000,
"por_iva": 0,
"iva": 0,
"por_retencion": 0,
"retencion": 0,
"por_reteiva": 0,
"reteiva": 0,
"por_reteica": 0,
"reteica": 0,
"por_descuento": 0,
"descuento": 0
}
],
"factura_estado_id": 1,
"factura_saldo": 170000
},
"pagination": null,
"filters_applied": null
}
La nota de débito aumenta el saldo. La factura conserva el estado 1 mientras siga ACTIVA.
Nota de una factura de contrato (409)
Cuando la nota pertenece a una factura de contrato, nuby no devuelve sus datos: responde 409 con el código estable y la advertencia estructurada. El scope siempre es solo_facturas_de_venta.
{
"success": false,
"status": 409,
"message": "La factura 456 fue generada desde un contrato de arrendamiento. Esta API solo admite facturas de venta; las facturas de contrato se gestionan en el flujo de contratos de nuby.",
"error_code": "FACTURA_CONTRATO_NO_SOPORTADA",
"warnings": [
{
"code": "FACTURA_CONTRATO_NO_SOPORTADA",
"factura_id": 456,
"scope": "solo_facturas_de_venta"
}
]
}
Estados que puedes recibir
| Campo | Valor | Significado |
|---|---|---|
estado_id |
5 |
Borrador. Es el estado de toda nota creada por esta API. |
factura_estado_id |
1 |
Factura ACTIVA; el saldo todavía es mayor que cero. |
factura_estado_id |
6 |
Factura anulada por nota crédito porque el saldo llegó a cero. |
Campos que no expone el detalle
El detalle se limita a la nota y al estado y saldo de la factura. Estos datos no forman parte de la respuesta y debes consultarlos en otro servicio:
| Dato | Por qué no aparece | Dónde consultarlo |
|---|---|---|
| Nombre y documento del tercero | Solo se devuelve tercero_id. |
Buscar Tercero por Código. |
| Número, fecha y valor total de la factura | La nota solo informa factura_estado_id y factura_saldo. |
Ver Detalle de una Factura. |
| Ítems de la factura original | El arreglo items[] corresponde a la nota, no a la factura. |
Ver Detalle de una Factura. |
Emisión DIAN de la nota (cufe, dian_id) |
La API crea y consulta el borrador; la emisión es un paso posterior en nuby. | Interfaz de nuby. |
| Contactos, archivos y documentos del tercero | No forman parte de esta API. | Módulo de terceros de nuby. |
Importante: los campos sin valor vienen en null, no se omiten. Verifica null antes de usar un dato en tu interfaz.
4. Seguridad y Posibles Errores
| HTTP | error_code |
Cuándo ocurre y cómo resolverlo |
|---|---|---|
401 |
— | Falta el token o expiró. Vuelve a consumir Login. |
403 |
RECURSO_NO_AUTORIZADO |
Al cliente OAuth le falta catalogs:read. |
404 |
NOTA_NO_ENCONTRADA |
No existe una nota con ese identificador. Verifica el nota_id o búscala en Listar Notas. |
409 |
FACTURA_CONTRATO_NO_SOPORTADA |
La nota pertenece a una factura de contrato; esa información no se expone por esta API. Incluye warnings[]. |
500 |
INTERNAL_ERROR |
Fallo interno al consultar. Reintenta; si persiste, contacta a soporte. |
Ejemplo de nota inexistente (404)
{
"success": false,
"status": 404,
"message": "No se encontró la nota con el código solicitado.",
"error_code": "NOTA_NO_ENCONTRADA"
}
Ojo con el identificador: nota_id es el número interno de la nota, no el consecutivo ni el número de la factura. Para buscar las notas de una factura usa /notes/list?factura_id=....
Errores frecuentes y solución
| Código | Causa | Qué hacer |
|---|---|---|
401 |
No enviaste el token o ya expiró. | Vuelve a consumir Login y repite la consulta con el token nuevo. |
403 RECURSO_NO_AUTORIZADO |
Al cliente OAuth le falta el permiso catalogs:read. |
Solicita el scope a tu administrador en nuby. |
404 NOTA_NO_ENCONTRADA |
El nota_id no existe en nuby. |
Verifica el identificador o búscalo con Listar Notas. |
409 FACTURA_CONTRATO_NO_SOPORTADA |
La nota pertenece a una factura de contrato. | Gestiona el ajuste en el flujo de contratos y revisa warnings[]. |
500 INTERNAL_ERROR |
Fallo interno al consultar. | Reintenta; si persiste, contacta a soporte con el nota_id consultado. |
5. Ejemplos de integración
cURL
TOKEN="TU_TOKEN_AQUI"
INSTANCIA="tu-inmobiliaria.nuby.app"
NOTA_ID=789
curl "https://${INSTANCIA}/service/v2/public/notes/${NOTA_ID}" \
-H "Authorization: Bearer ${TOKEN}"
PHP
<?php
$instancia = 'tu-inmobiliaria.nuby.app';
$token = 'TU_TOKEN_AQUI';
$notaId = 789;
$url = "https://{$instancia}/service/v2/public/notes/{$notaId}";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$token}",
]);
$respuesta = curl_exec($ch);
$codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$datos = json_decode($respuesta, true);
if ($codigo === 200) {
$nota = $datos['body'];
echo "{$nota['tipo']} {$nota['consecutivo']} - total {$nota['valor_total']}\n";
echo "Factura {$nota['factura_id']}: estado {$nota['factura_estado_id']}, saldo {$nota['factura_saldo']}\n";
foreach ($nota['items'] as $item) {
echo "{$item['descripcion']} - {$item['cantidad']} x {$item['valor_unitario']}\n";
}
} else {
echo "HTTP {$codigo}: " . $datos['message'] . "\n";
}
Python
import requests
instancia = "tu-inmobiliaria.nuby.app"
token = "TU_TOKEN_AQUI"
nota_id = 789
url = f"https://{instancia}/service/v2/public/notes/{nota_id}"
headers = {
"Authorization": f"Bearer {token}",
}
respuesta = requests.get(url, headers=headers, timeout=30)
if respuesta.status_code == 200:
nota = respuesta.json()["body"]
print(f"{nota['tipo']} {nota['consecutivo']} — total {nota['valor_total']}")
print(f"Factura {nota['factura_id']}: estado {nota['factura_estado_id']}, saldo {nota['factura_saldo']}")
for item in nota["items"]:
print(item["descripcion"], item["cantidad"], item["valor_unitario"])
else:
print(respuesta.status_code, respuesta.json())
JavaScript (Fetch API)
const instancia = 'tu-inmobiliaria.nuby.app';
const token = 'TU_TOKEN_AQUI';
const notaId = 789;
const url = `https://${instancia}/service/v2/public/notes/${notaId}`;
const respuesta = await fetch(url, {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await respuesta.json();
if (respuesta.ok) {
const nota = data.body;
console.log(`${nota.tipo} ${nota.consecutivo} — total ${nota.valor_total}`);
console.log(`Factura ${nota.factura_id}: estado ${nota.factura_estado_id}, saldo ${nota.factura_saldo}`);
nota.items.forEach(i => console.log(i.descripcion, i.cantidad, i.valor_unitario));
} else {
console.error(`${respuesta.status} ${data.error_code}: ${data.message}`);
}
Power Query M (Excel / Power BI)
El detalle se modela como una tabla de cabecera y otra de ítems. Power Query consulta una vez y expande ambas partes del body:
let
// 1. Configura tus datos de acceso
instancia = "tu-inmobiliaria.nuby.app",
token = "TU_TOKEN_AQUI",
notaId = "789",
// 2. Prepara la dirección de la petición
url = "https://" & instancia & "/service/v2/public/notes/" & notaId,
// 3. Envía la petición GET
response = Web.Contents(url, [
Headers = [
#"Authorization" = "Bearer " & token
]
]),
// 4. Decodifica la respuesta JSON
jsonResponse = Json.Document(response),
body = jsonResponse[body],
// 5. Convierte la cabecera en tabla
cabecera = Table.FromList({body}, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
columnas = Table.ExpandRecordColumn(cabecera, "Column1",
{"nota_id", "factura_id", "tipo", "consecutivo", "fecha", "valor_total",
"estado_id", "concepto_id", "factura_estado_id", "factura_saldo"},
{"NotaID", "FacturaID", "Tipo", "Consecutivo", "Fecha", "ValorTotal",
"EstadoID", "ConceptoID", "FacturaEstadoID", "FacturaSaldo"}),
tipos = Table.TransformColumnTypes(columnas, {
{"NotaID", Int64.Type},
{"FacturaID", Int64.Type},
{"Consecutivo", Int64.Type},
{"Fecha", type date},
{"ValorTotal", type number},
{"FacturaSaldo", type number}
}),
// 6. Expande los ítems en una tabla aparte
items = Table.FromList(body[items], Splitter.SplitByNothing(), null, null, ExtraValues.Error),
itemsExpandidos = Table.ExpandRecordColumn(items, "Column1",
{"producto_id", "descripcion", "cantidad", "valor_unitario", "por_iva", "iva",
"por_retencion", "retencion", "por_reteiva", "reteiva",
"por_reteica", "reteica", "por_descuento", "descuento"},
{"ProductoID", "Descripcion", "Cantidad", "ValorUnitario", "PorIVA", "IVA",
"PorRetencion", "Retencion", "PorReteIVA", "ReteIVA",
"PorReteICA", "ReteICA", "PorDescuento", "Descuento"})
in
tipos
6. Buenas prácticas y límites conocidos
Recomendaciones
- Consulta el detalle solo cuando lo necesites. La creación ya devuelve el
nota_idy el saldo resultante. - Usa
factura_saldoyfactura_estado_idpara reflejar el estado real de la cartera sin consultar la factura. - Trata el
404como un caso de negocio, no como una falla técnica: el identificador no existe en nuby. - Recuerda que los campos ausentes vienen en
null; no supongas cadenas vacías.
Límites
- Solo devuelve notas de facturas de venta; las de contrato se rechazan con
409. - El detalle no incluye la emisión DIAN de la nota: la API solo crea y consulta el borrador.
- No incluye datos del tercero más allá de su identificador: para eso usa los servicios de terceros.
El detalle no admite paginación ni filtros: el nota_id identifica un único registro. Si necesitas recorrer varias notas, usa Listar Notas y consulta el detalle solo de las que vayas a mostrar. Así evitas una petición por cada nota del período.
Para crear una nota, revisa la página Crear Nota. Para listar notas, revisa Listar Notas.