Ir al contenido principal

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_externa que 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_id y el factura_saldo de la respuesta: te ahorran una consulta posterior.
  • Envía los porcentajes por ítem: los de cabecera no se usan.
  • Trata el 422 como 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_ini y fecha_fin se 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.

¿Necesita ayuda adicional?

Nuestro equipo de soporte está disponible para asistirle:

Escríbenos a nuestro correo:

📞 (604) 444-7417 Opción 2

📧 soporte@nuby.ai

Escríbenos a nuestra línea de Whatsapp:

Whatsapp

Síguenos en nuestras redes sociales: