Crear Nota [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 registra una nota de crédito o una nota de débito sobre una factura de venta de nuby. La nota se guarda en borrador y actualiza el saldo de la factura en el acto: una nota de crédito lo reduce y puede anular la factura si llega a cero; una nota de débito lo aumenta.
Es el servicio que necesitas cuando tu plataforma debe ajustar o anular una factura emitida desde nuby, sin volver a digitar el documento en la interfaz.
¿Para qué sirve este servicio?
Úsalo cuando necesites ajustar una factura de venta desde tu plataforma sin volver a digitar el documento en nuby. Los casos de uso más frecuentes son:
- Anular una factura por nota de crédito. Cuando el ajuste iguala el saldo, la factura queda anulada por nota crédito.
- Registrar un cargo adicional posterior con una nota de débito, por ejemplo un cobro que no estaba incluido en la factura original.
- Replicar en nuby los ajustes que originas en tu plataforma, con una
referencia_externaque evita crear la nota dos veces. - Dejar la nota lista para emitir. La API crea el borrador; un usuario lo emite a la DIAN desde nuby.
1. El Endpoint (La dirección web)
Método y dirección
| Dato | Valor |
|---|---|
| Método | POST |
| Recurso | /notes |
| Cuerpo de la petición | Sí: el JSON de la nota que se describe en La Petición |
POST https://{{instancia}}/service/v2/public/notes
¿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.
Encabezados requeridos
| Encabezado | Valor |
|---|---|
Content-Type |
application/json |
Authorization |
Bearer <token>, con el token obtenido en el servicio Login. |
Permiso requerido (scope): notes:create
El cliente OAuth debe tener habilitado notes:create. Si el token es válido pero falta el permiso, la respuesta es 403 con el código RECURSO_NO_AUTORIZADO.
Si aún no tienes un token, consulta la página Login del libro API nuby V2.
2. ¿Qué hace este servicio?
La nota se crea reutilizando la misma lógica de la interfaz de nuby: se asigna su consecutivo, se guarda su detalle y se recalcula el saldo de la factura. La API no reimplementa numeración, contabilidad ni DIAN.
Qué SÍ hace
- Crea la nota en estado borrador y le asigna consecutivo.
- Reduce el saldo de la factura si es nota de crédito, o lo aumenta si es nota de débito.
- Deja la factura en estado 6 (anulada por nota crédito) cuando el saldo queda en cero.
- Resuelve por ti el concepto y los datos que hereda de la factura.
Qué NO hace
- No envía la nota a la DIAN. La nota queda en borrador; la emisión la realiza un usuario en nuby.
- No edita ni anula notas existentes.
- No crea notas no vinculantes. Toda nota creada por esta API queda vinculada a su factura.
- No anota facturas de contrato (inquilino o propietario): esas se gestionan en el flujo de contratos.
Importante: la factura debe estar en estado ACTIVA (facturada). Una factura en borrador o anulada no admite notas y la API responde 409 FACTURA_NO_ANOTABLE.
3. La Petición (¿Qué debes enviarnos?)
Campos obligatorios
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
referencia_externa |
texto | Sí | Identificador único de tu operación. Es la llave de idempotencia: un reintento no crea una segunda nota. |
factura_id |
entero | Sí | Identificador interno de la factura de venta que se va a anotar. |
tipo |
texto | Sí | credito para reducir el saldo o debito para aumentarlo. |
items[] |
arreglo | Sí | Al menos un ítem con producto_id, cantidad entero mayor que cero y valor_unitario distinto de cero. |
fecha es opcional: si no la envías, se usa la fecha de hoy en formato AAAA-MM-DD.
Campos opcionales
| Grupo | Campos |
|---|---|
| Cabecera | concepto_id, observaciones, por_iva, por_retencion, fecha_ini, fecha_fin |
| Ítem | descripcion, por_iva, por_retencion, por_reteiva, por_reteica, por_descuento |
Datos que hereda de la factura
No necesitas enviarlos y, de hecho, no se aceptan si difieren: resolucion_id, tercero_id, moneda y tasa_cambio se toman de la factura. Si envías una moneda o una tasa distinta, la respuesta es 422 CAMPO_NO_PERMITIDO: el saldo se calcula sin conversión y un valor distinto lo descuadraría.
Campos que el consumidor no puede fijar
La nota hereda de la factura los datos que garantizan la coherencia del saldo y de la numeración. Si envías uno de estos campos con valor, la respuesta es 422 CAMPO_NO_PERMITIDO y la nota no se crea:
| Campo | Por qué no lo puedes fijar | Respuesta |
|---|---|---|
clasificacion |
El servidor fija 1 (vinculante). La API no crea notas no vinculantes. |
422 CAMPO_NO_PERMITIDO |
tercero_id |
Se hereda de la factura anotada. Un tercero distinto descuadraría la cartera. | 422 CAMPO_NO_PERMITIDO |
resolucion_id |
Se hereda de la factura; la nota no tiene resolución propia. | 422 CAMPO_NO_PERMITIDO |
tipo_factura |
Lo determina la factura anotada, que debe ser de venta. | 422 CAMPO_NO_PERMITIDO |
consecutivo |
Lo asigna nuby al crear la nota. | 422 CAMPO_NO_PERMITIDO |
estado_id |
La nota nace en 5 (borrador); la emisión es un paso posterior en nuby. |
422 CAMPO_NO_PERMITIDO |
dian_id, cufe |
La emisión a la DIAN no forma parte de esta API. | 422 CAMPO_NO_PERMITIDO |
valor_total |
Se recalcula desde los ítems y sus porcentajes. | 422 CAMPO_NO_PERMITIDO |
creadopor |
Lo registra nuby con el consumidor autenticado. | 422 CAMPO_NO_PERMITIDO |
nota_id |
Lo asigna nuby; enviarlo sugiere una edición que la API no soporta. | 422 CAMPO_NO_PERMITIDO |
moneda, tasa_cambio |
Se heredan de la factura. Solo se toleran si coinciden exactamente con ella. | 422 CAMPO_NO_PERMITIDO si difieren |
Montos calculados: iva, retencion, reteiva, reteica, descuento |
El servidor los deriva de valor_unitario y de los porcentajes del ítem. |
Se ignoran; el total se recalcula |
Concepto de la nota
Si omites concepto_id, nuby aplica el concepto por defecto del tipo. El concepto se resuelve contra los target y codigo de la maestra:
| Tipo de nota | target |
codigo |
Cuándo aplica |
|---|---|---|---|
| Nota de crédito | 1 |
'2' |
Se omite concepto_id y tipo es credito. Corresponde a la anulación de la factura electrónica. |
| Nota de débito | 2 |
'4' |
Se omite concepto_id y tipo es debito. Corresponde al concepto "Otros". |
Si envías un concepto_id, nuby no aplica el default: valida que el concepto exista y que su target corresponda al tipo de nota. Si no existe o no corresponde, la respuesta es 422 CONCEPTO_NO_DISPONIBLE y no se crea la nota.
Montos: tú envías tasas, nuby calcula
Por cada ítem envía valor_unitario y los porcentajes. El servidor calcula el IVA, las retenciones y el descuento, y recalcula el total de la nota a partir del detalle. Si envías montos ya calculados, se ignoran.
| Monto | Fórmula (porcentaje sobre 100) | Ejemplo con base 50000 |
|---|---|---|
iva |
base × por_iva |
50000 × 19 % = 9500 |
retencion |
base × por_retencion |
50000 × 0 % = 0 |
reteiva |
iva × por_reteiva |
9500 × 0 % = 0 |
reteica |
base × por_reteica |
50000 × 0 % = 0 |
descuento |
base × por_descuento |
50000 × 0 % = 0 |
El total del ítem se obtiene al sumar la base y el IVA, y restar la retención, el reteIVA, el reteICA y el descuento. Con el ejemplo anterior, el total de la nota es 59500. Todos los montos se calculan en la moneda original de la factura y se redondean a dos decimales.
Importante: el IVA de un ítem requiere que el producto tenga configurado su tipo de IVA en nuby. Si no lo tiene, la operación falla y no se crea la nota.
Ejemplo: nota de crédito total
Cuando el total de la nota de crédito iguala el saldo de la factura, el saldo queda en 0 y la factura pasa al estado 6 (anulada por nota crédito). La respuesta lo confirma en factura_estado_id y factura_saldo.
{
"referencia_externa": "NOTE-000046",
"factura_id": 456,
"tipo": "credito",
"fecha": "2026-10-21",
"observaciones": "Anulación total acordada",
"items": [
{
"producto_id": 159,
"descripcion": "Anulación total factura 456",
"cantidad": 1,
"valor_unitario": 100000,
"por_iva": 19,
"por_retencion": 0,
"por_reteiva": 0,
"por_reteica": 0,
"por_descuento": 0
}
]
}
La nota calcula iva = 100000 × 19 % = 19000 y un total de 119000. Si el saldo de la factura es exactamente 119000, la respuesta devuelve factura_saldo: 0 y factura_estado_id: 6.
Ejemplo: nota de débito
La nota de débito aumenta el saldo. Úsala para cobrar un ajuste posterior, por ejemplo un cargo no incluido en la factura original. La factura debe seguir ACTIVA.
{
"referencia_externa": "NOTE-000047",
"factura_id": 456,
"tipo": "debito",
"fecha": "2026-10-21",
"observaciones": "Cargo adicional acordado",
"items": [
{
"producto_id": 159,
"descripcion": "Cargo adicional octubre",
"cantidad": 1,
"valor_unitario": 20000,
"por_iva": 0,
"por_retencion": 0,
"por_reteiva": 0,
"por_reteica": 0,
"por_descuento": 0
}
]
}
Si el saldo era 119000, después de esta nota de débito será 139000. La factura conserva el estado 1 (ACTIVA).
Ejemplo completo
{
"referencia_externa": "NOTE-000045",
"factura_id": 456,
"tipo": "credito",
"concepto_id": null,
"fecha": "2026-10-21",
"observaciones": "Ajuste acordado",
"items": [
{
"producto_id": 159,
"descripcion": "Ajuste plan X",
"cantidad": 1,
"valor_unitario": 50000,
"por_iva": 19,
"por_retencion": 0,
"por_reteiva": 0,
"por_reteica": 0,
"por_descuento": 0
}
]
}
4. Cómo afecta el saldo de la factura
Escenario → resultado en la factura
| Escenario | Resultado en la factura |
|---|---|
| Nota de crédito parcial | El saldo se reduce en el valor de la nota. La factura sigue ACTIVA (1). |
| Nota de crédito total | El saldo llega a 0 y la factura queda en estado 6 (anulada por nota crédito). |
| Nota de débito | El saldo aumenta en el valor de la nota. La factura sigue ACTIVA (1). |
| Factura en borrador | 409 FACTURA_NO_ANOTABLE. No se crea la nota ni se modifica el saldo. |
| Factura de contrato | 409 FACTURA_CONTRATO_NO_SOPORTADA con warnings[]. No se crea la nota ni se modifica el saldo. |
| Factura inexistente | 404 FACTURA_NO_ENCONTRADA. Verifica el factura_id antes de reintentar. |
La nota se crea en borrador y aun así afecta el saldo, porque nuby recalcula la cartera al guardarla. La emisión a la DIAN es un paso posterior y no cambia el saldo.
Ojo con el estado de la factura: solo se anotan facturas ACTIVAS. Si la factura ya fue anulada o está en borrador, la respuesta es 409 FACTURA_NO_ANOTABLE.
5. La Respuesta (¿Qué te entregaremos?)
Si la nota se crea correctamente, la respuesta es un JSON con el resultado de la operación y el estado en que queda la factura anotada:
{
"success": true,
"status": 201,
"message": "Nota creada en borrador.",
"body": {
"nota_id": 789,
"tipo": "credito",
"consecutivo": 1024,
"estado_id": 5,
"factura_id": 456,
"factura_estado_id": 1,
"factura_saldo": 150000
},
"idempotent_replay": false
}
Estructura de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
nota_id |
entero | Identificador interno de la nota. Guárdalo para consultarla después. |
tipo |
texto | credito o debito. |
consecutivo |
entero | Número asignado a la nota. |
estado_id |
entero | 5 = borrador. |
factura_estado_id |
entero | Estado de la factura después de la nota (1 activa, 6 anulada por nota crédito). |
factura_saldo |
número | Saldo de la factura después de la nota. |
idempotent_replay |
booleano | false en la primera respuesta; true cuando se recupera una solicitud anterior. |
Escenario de reintento (replay)
Si repites la petición con la misma referencia_externa y el mismo contenido, nuby no crea una segunda nota: devuelve la respuesta original con idempotent_replay en true.
{
"success": true,
"status": 201,
"message": "Nota creada en borrador.",
"body": {
"nota_id": 789,
"tipo": "credito",
"consecutivo": 1024,
"estado_id": 5,
"factura_id": 456,
"factura_estado_id": 1,
"factura_saldo": 150000
},
"idempotent_replay": true
}
Para ver el detalle completo de la nota, consulta la página Buscar Nota por Código.
6. Idempotencia y reintentos
La escritura exige referencia_externa. nuby recuerda qué respondió para esa referencia, así que un reintento no duplica la nota.
| Situación | Qué responde nuby |
|---|---|
| Primera vez que se usa la referencia | Procesa y responde 201. |
| Misma referencia y mismo contenido | La respuesta original con idempotent_replay: true. |
| Misma referencia con otro contenido | 409 IDEMPOTENCY_PAYLOAD_MISMATCH. |
| Solicitud en proceso | 409 IDEMPOTENCY_IN_PROGRESS. |
| Solicitud fallida | Se permite reintentar, incluso con datos corregidos. |
Importante: un error 422 de validación no consume la referencia. Puedes corregir el payload y reintentar con la misma referencia_externa.
Token renovado: el contenido interno que agrega la autenticación no forma parte de la comparación de idempotencia. Puedes renovar el token y reintentar sin conflicto.
7. Seguridad y Posibles Errores
| HTTP | error_code |
Cuándo ocurre y cómo resolverlo |
|---|---|---|
400 |
VALIDATION_ERROR |
El cuerpo no es un objeto JSON. Envía JSON válido con Content-Type: application/json. |
401 |
— | Falta el token o expiró. Vuelve a consumir Login. |
403 |
RECURSO_NO_AUTORIZADO |
Al cliente OAuth le falta notes:create. |
404 |
FACTURA_NO_ENCONTRADA |
El factura_id no existe en nuby. |
409 |
FACTURA_CONTRATO_NO_SOPORTADA |
La factura es de contrato; se gestiona en el flujo de contratos. Incluye warnings[]. |
409 |
FACTURA_NO_ANOTABLE |
La factura no está ACTIVA (borrador, anulada o pagada). |
409 |
IDEMPOTENCY_IN_PROGRESS / IDEMPOTENCY_PAYLOAD_MISMATCH |
Reintento con la misma referencia en curso o con contenido distinto. |
422 |
VALIDATION_ERROR |
Falta un obligatorio o un dato no es válido. Revisa errors por campo. |
422 |
CAMPO_NO_PERMITIDO |
Intentaste fijar un campo del sistema o una moneda/tasa distinta a la factura. |
422 |
FACTURACION_ELECTRONICA_DESHABILITADA |
La facturación electrónica está apagada en nuby. No se puede crear la nota por API. |
422 |
CONCEPTO_NO_DISPONIBLE |
El concepto_id no existe o no corresponde al tipo de nota. |
422 |
DATOS_NOTA_INVALIDOS |
Los datos no pasaron la validación de nuby. Revisa el mensaje. |
500 |
INTERNAL_ERROR |
Fallo interno. La solicitud queda fallida y es reintentable; si persiste, contacta a soporte. |
Errores de validación frecuentes
| Situación | Mensaje / error_code |
Cómo corregir |
|---|---|---|
Falta referencia_externa o viene vacía |
422 VALIDATION_ERROR |
Envía una referencia única y no vacía. Sin ella no se aplica idempotencia. |
Falta factura_id, tipo o items[] |
422 VALIDATION_ERROR |
Incluye la factura, un tipo válido (credito o debito) y al menos un ítem. |
Un ítem no tiene producto_id, o su cantidad o valor_unitario no es válido |
422 VALIDATION_ERROR |
Usa cantidad entero mayor que cero y valor_unitario distinto de cero. |
| La factura no existe | 404 FACTURA_NO_ENCONTRADA |
Verifica el factura_id con el detalle o el listado de facturas de venta. |
| La factura es de contrato | 409 FACTURA_CONTRATO_NO_SOPORTADA |
Anula o ajusta desde el flujo de contratos. Revisa warnings[].code, factura_id y scope. |
| La factura no está ACTIVA | 409 FACTURA_NO_ANOTABLE |
Solo se anotan facturas en estado 1. Emite o descarta el borrador antes de anotar. |
| La facturación electrónica está apagada | 422 FACTURACION_ELECTRONICA_DESHABILITADA |
Pide a tu administrador que habilite ENABLE_FACT_ELECT = 1 en nuby. |
| El concepto no existe o no corresponde al tipo | 422 CONCEPTO_NO_DISPONIBLE |
Omite concepto_id para usar el default, o envía uno del target correcto. |
| Enviaste un campo reservado al sistema | 422 CAMPO_NO_PERMITIDO |
Quita clasificacion, tercero_id, resolucion_id, consecutivo, estado_id, valor_total, nota_id y los demás de la lista. |
| La moneda o la tasa no coincide con la factura | 422 CAMPO_NO_PERMITIDO |
Omite moneda y tasa_cambio, o envía exactamente los de la factura. |
| El producto no tiene configurado su tipo de IVA o los porcentajes no son válidos | 422 DATOS_NOTA_INVALIDOS |
Revisa la configuración del producto en nuby y envía porcentajes válidos por ítem. |
Atención: cuando la respuesta es 409 o 422, nuby no deja una nota a medias. La operación se revierte completa.
8. Ejemplos de integración
cURL
TOKEN="TU_TOKEN_AQUI"
INSTANCIA="tu-inmobiliaria.nuby.app"
curl -X POST "https://${INSTANCIA}/service/v2/public/notes" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${TOKEN}" \
-d '{
"referencia_externa": "NOTE-000045",
"factura_id": 456,
"tipo": "credito",
"fecha": "2026-10-21",
"observaciones": "Ajuste acordado",
"items": [
{
"producto_id": 159,
"descripcion": "Ajuste plan X",
"cantidad": 1,
"valor_unitario": 50000,
"por_iva": 19,
"por_retencion": 0,
"por_reteiva": 0,
"por_reteica": 0,
"por_descuento": 0
}
]
}'
PHP
<?php
$instancia = 'tu-inmobiliaria.nuby.app';
$token = 'TU_TOKEN_AQUI';
$url = "https://{$instancia}/service/v2/public/notes";
$payload = [
'referencia_externa' => 'NOTE-000045',
'factura_id' => 456,
'tipo' => 'credito',
'fecha' => '2026-10-21',
'observaciones' => 'Ajuste acordado',
'items' => [
[
'producto_id' => 159,
'descripcion' => 'Ajuste plan X',
'cantidad' => 1,
'valor_unitario' => 50000,
'por_iva' => 19,
'por_retencion' => 0,
'por_reteiva' => 0,
'por_reteica' => 0,
'por_descuento' => 0,
],
],
];
$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}",
]);
$respuesta = curl_exec($ch);
$codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP: {$codigo}\n";
print_r(json_decode($respuesta, true));
Python
import requests
instancia = "tu-inmobiliaria.nuby.app"
token = "TU_TOKEN_AQUI"
url = f"https://{instancia}/service/v2/public/notes"
payload = {
"referencia_externa": "NOTE-000045",
"factura_id": 456,
"tipo": "credito",
"fecha": "2026-10-21",
"observaciones": "Ajuste acordado",
"items": [
{
"producto_id": 159,
"descripcion": "Ajuste plan X",
"cantidad": 1,
"valor_unitario": 50000,
"por_iva": 19,
"por_retencion": 0,
"por_reteiva": 0,
"por_reteica": 0,
"por_descuento": 0,
}
],
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {token}",
}
respuesta = requests.post(url, json=payload, headers=headers, timeout=30)
if respuesta.status_code == 201:
datos = respuesta.json()
print(f"Nota {datos['body']['nota_id']} — saldo factura: {datos['body']['factura_saldo']}")
else:
print(respuesta.status_code, respuesta.json())
JavaScript (Fetch API)
const instancia = 'tu-inmobiliaria.nuby.app';
const token = 'TU_TOKEN_AQUI';
const url = `https://${instancia}/service/v2/public/notes`;
const payload = {
referencia_externa: 'NOTE-000045',
factura_id: 456,
tipo: 'credito',
fecha: '2026-10-21',
items: [{
producto_id: 159,
descripcion: 'Ajuste plan X',
cantidad: 1,
valor_unitario: 50000,
por_iva: 19,
por_retencion: 0,
por_reteiva: 0,
por_reteica: 0,
por_descuento: 0
}]
};
const respuesta = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(payload)
});
const data = await respuesta.json();
if (respuesta.ok) {
console.log(`Nota ${data.body.nota_id} — saldo factura: ${data.body.factura_saldo}`);
} else {
console.error(`${respuesta.status} ${data.error_code}: ${data.message}`, data.errors ?? {});
}
Power Query M (Excel / Power BI)
Power Query construye el cuerpo con Json.FromValue y lo envía con Web.Contents. La respuesta se convierte en una tabla de una fila. Si la petición falla, Web.Contents genera una excepción que puedes capturar con try ... otherwise.
let
// 1. Configura tus datos de acceso
instancia = "tu-inmobiliaria.nuby.app",
token = "TU_TOKEN_AQUI",
// 2. Prepara la dirección de la petición
url = "https://" & instancia & "/service/v2/public/notes",
// 3. Construye el cuerpo JSON
cuerpo = Json.FromValue([
referencia_externa = "NOTE-000045",
factura_id = 456,
tipo = "credito",
fecha = "2026-10-21",
observaciones = "Ajuste acordado",
items = {
[
producto_id = 159,
descripcion = "Ajuste plan X",
cantidad = 1,
valor_unitario = 50000,
por_iva = 19,
por_retencion = 0,
por_reteiva = 0,
por_reteica = 0,
por_descuento = 0
]
}
]),
// 4. Envía la petición POST
response = Web.Contents(url, [
Headers = [
#"Content-Type" = "application/json",
#"Authorization" = "Bearer " & token
],
Content = cuerpo
]),
// 5. Decodifica la respuesta JSON
jsonResponse = Json.Document(response),
body = jsonResponse[body],
// 6. Convierte el resultado en tabla
tabla = Table.FromList({body}, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
expandido = Table.ExpandRecordColumn(tabla, "Column1",
{"nota_id", "tipo", "consecutivo", "estado_id", "factura_id", "factura_estado_id", "factura_saldo"},
{"NotaID", "Tipo", "Consecutivo", "EstadoID", "FacturaID", "FacturaEstadoID", "FacturaSaldo"})
in
expandido
9. Buenas prácticas y límites conocidos
Recomendaciones
- Verifica el estado de la factura antes de anotar: debe estar ACTIVA.
- Usa una referencia externa por operación y no la reutilices para otra nota.
- Guarda el
nota_idy elfactura_saldode la respuesta: te ahorran una consulta posterior. - Envía los porcentajes por ítem: los de cabecera no se usan.
- Trata el
422como reintentable tras corregir: la referencia no se consume.
Límites
- La nota queda en borrador: la emisión a la DIAN no forma parte de esta API.
- No hay edición ni anulación de notas por API.
- No se admiten notas no vinculantes.
fecha_iniyfecha_finse aceptan pero no se persisten en la nota.- No se valida el rango 0–100 de los porcentajes; envía valores válidos.
Para consultar notas ya registradas, revisa las páginas Listar Notas y Buscar Nota por Código.