# Catálogos de Facturación [BETA]

<p class="callout warning">**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.</p>

Estos servicios devuelven los **catálogos que necesitas para crear facturas y notas** en nuby: resoluciones de venta, conceptos de nota, productos con sus impuestos y estados de factura. Así evitas escribir identificadores fijos en tu plataforma.

Los cuatro son de **solo lectura**: no crean, no modifican y no consumen referencias de idempotencia.

<p class="callout info">**¿Para qué sirve este servicio?**  
Úsalos cuando necesites **traducir los identificadores de nuby** a datos legibles, o al revés, sin mantener copias propias de la configuración. Los casos de uso más frecuentes son:</p>

<div class="page-content" dir="auto" id="bkmrk-elegir-la-resoluci%C3%B3n"><div dir="auto">- **Elegir la resolución de venta** que vas a enviar en `resolucion_id` al crear o editar una factura.
- **Obtener el `concepto_id`** de las notas de crédito y de las notas débito que vas a crear.
- **Tomar los impuestos del producto** (`tipo_iva_id`, `por_iva` y sus equivalentes de retención y reteICA) y enviarlos en `items[]` de una factura o de una nota.
- **Traducir el `estado_id`** de una factura al significado que ves en la interfaz de nuby.
- **Evitar identificadores fijos** en tu plataforma: los conceptos y productos dependen de la configuración de tu instancia.

---

  </div></div>#### **1. El Endpoint (La dirección web)**

##### **Método y direcciones**

<div class="page-content" dir="auto" id="bkmrk-m%C3%A9todo-recurso-cat%C3%A1l"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 20%;"></col><col style="width: 30%;"></col><col style="width: 50%;"></col></colgroup><thead><tr><th>Método</th><th>Recurso</th><th>Catálogo que devuelve</th></tr></thead><tbody><tr><td>`GET`</td><td>`/invoices/sales/resolutions`</td><td>Resoluciones de venta</td></tr><tr><td>`GET`</td><td>`/masters/note-concepts`</td><td>Conceptos de nota</td></tr><tr><td>`GET`</td><td>`/masters/products`</td><td>Productos e impuestos</td></tr><tr><td>`GET`</td><td>`/masters/invoice-statuses`</td><td>Estados de factura</td></tr></tbody></table>

</div></div>Ninguno de los cuatro recibe cuerpo en la petición ni exige `referencia_externa`: no son idempotentes y no escriben en la base.

```http
GET https://{{instancia}}/service/v2/public/invoices/sales/resolutions
GET https://{{instancia}}/service/v2/public/masters/note-concepts
GET https://{{instancia}}/service/v2/public/masters/products
GET https://{{instancia}}/service/v2/public/masters/invoice-statuses
```

##### **¿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`, sin `https://` y sin barras diagonales al final. Si entras a nuby escribiendo `inmobiliaria.nuby.app` en el navegador, esa es tu instancia.

<p class="callout warning">**Importante:** no incluyas `https://` ni barras diagonales (`/`) al final. La dirección se compone así: `https://` + tu instancia + `/service/v2/public/` + la ruta del catálogo.</p>

##### **Encabezados requeridos**

<div class="page-content" dir="auto" id="bkmrk-encabezado-valor-aut"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 78%;"></col></colgroup><thead><tr><th>Encabezado</th><th>Valor</th></tr></thead><tbody><tr><td>`Authorization`</td><td>`Bearer <token>`, con el token obtenido en el servicio **Login**.</td></tr></tbody></table>

</div></div>Los cuatro servicios exigen el encabezado `Authorization`.

##### **Permiso requerido (scope): `catalogs:read`**

Los cuatro servicios exigen el permiso `catalogs:read`. Si falta, la respuesta es `403` con `RECURSO_NO_AUTORIZADO`.

<p class="callout info">**¿Por qué `catalogs:read` y no un permiso de facturas?** Las lecturas de la API usan `catalogs:read` porque el cliente `nuby-clientes` no tiene un scope de lectura de facturas y exigirlo dejaría los endpoints inutilizables. En tu cliente OAuth los permisos de consulta disponibles son `catalogs:read`, `invoices:create`, `invoices:update`, `notes:create` y `third-parties:create`; leer se autoriza con `catalogs:read`.</p>

<p class="callout info">Si aún no tienes un token, consulta la página [*<span class="tw-font-bold tw-text-arrBlue hover:tw-text-nubyBlue tw-cursor-pointer">Login</span>*](https://docs.nuby.ai/books/api-nuby-v2/page/login) del libro **API nuby V2**.</p>

<div class="page-content" dir="auto" id="bkmrk-"><div dir="auto">  </div></div>#### **2. La Petición (¿Qué debes enviarnos?)**

Los catálogos se consultan con `GET` y **sin cuerpo**: lo único que puedes enviar son parámetros de consulta en la dirección. Todos son opcionales; si no envías ninguno, el servicio devuelve la primera página del catálogo completo.

##### **Resoluciones de venta — `GET /invoices/sales/resolutions`**

```http
GET https://{{instancia}}/service/v2/public/invoices/sales/resolutions
```

Devuelve las resoluciones de facturación **de venta**, es decir, las que puedes enviar en `resolucion_id` al crear o editar una factura. Las resoluciones reservadas para facturas de contrato (inquilino y propietario) **no aparecen** en esta lista.

<p class="callout warning">**Usa este servicio, no el anterior.** El endpoint `GET /invoices/resolutions` sigue existiendo por compatibilidad, pero puede devolver resoluciones de contrato, y la API de venta las rechaza con `422 RESOLUCION_CONTRATO_NO_PERMITIDA`.</p>

##### **Parámetros de consulta**

<div class="page-content" dir="auto" id="bkmrk-par%C3%A1metro-tipo-reque"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 34%;"></col><col style="width: 8%;"></col><col style="width: 9%;"></col><col style="width: 49%;"></col></colgroup><thead><tr><th>Parámetro</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>`activa`</td><td>texto</td><td>No</td><td>`SI` o `NO`.</td></tr><tr><td>`tipo_doc_id`</td><td>entero</td><td>No</td><td>Tipo de documento de la resolución.</td></tr><tr><td>`fact_electronica`</td><td>texto</td><td>No</td><td>`SI` o `NO`.</td></tr><tr><td>`resolucion_para`</td><td>entero</td><td>No</td><td>`1` factura o `2` documento soporte.</td></tr><tr><td>`fecha_desde` / `fecha_hasta`</td><td>fecha</td><td>No</td><td>Rango sobre la fecha de la resolución (`AAAA-MM-DD`).</td></tr><tr><td>`fecha_vigencia_desde` / `fecha_vigencia_hasta`</td><td>fecha</td><td>No</td><td>Rango sobre la vigencia (`AAAA-MM-DD`).</td></tr><tr><td>`page`</td><td>entero</td><td>No</td><td>Número de página, empezando en 1. Por defecto `1`.</td></tr><tr><td>`page_size`</td><td>entero</td><td>No</td><td>Registros por página. Por defecto `10`. Máximo `1000`.</td></tr></tbody></table>

</div></div>##### **Conceptos de nota — `GET /masters/note-concepts`**

```http
GET https://{{instancia}}/service/v2/public/masters/note-concepts?target=2
```

Devuelve los conceptos que puedes enviar en `concepto_id` al crear una nota. El campo `target` indica el tipo: **1 = nota crédito** y **2 = nota débito**.

<div class="page-content" dir="auto" id="bkmrk-par%C3%A1metro-tipo-reque-1"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 8%;"></col><col style="width: 9%;"></col><col style="width: 61%;"></col></colgroup><thead><tr><th>Parámetro</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>`target`</td><td>entero</td><td>No</td><td>`1` nota crédito o `2` nota débito. Sin filtro devuelve todos.</td></tr><tr><td>`page`</td><td>entero</td><td>No</td><td>Número de página, empezando en 1. Por defecto `1`.</td></tr><tr><td>`page_size`</td><td>entero</td><td>No</td><td>Registros por página. Por defecto `50`. Máximo `1000`.</td></tr></tbody></table>

</div></div>##### **Productos e impuestos — `GET /masters/products`**

```http
GET https://{{instancia}}/service/v2/public/masters/products?search=plan&estado=1
```

Devuelve los productos que puedes usar en `items[]` de una factura o nota, con los porcentajes de **IVA**, **retención en la fuente**, **reteIVA** y **reteICA** configurados.

<div class="page-content" dir="auto" id="bkmrk-par%C3%A1metro-tipo-reque-2"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 8%;"></col><col style="width: 9%;"></col><col style="width: 61%;"></col></colgroup><thead><tr><th>Parámetro</th><th>Tipo</th><th>Requerido</th><th>Descripción</th></tr></thead><tbody><tr><td>`search`</td><td>texto</td><td>No</td><td>Busca coincidencias en el nombre del producto y en su código.</td></tr><tr><td>`estado`</td><td>entero</td><td>No</td><td>`1` activos, `0` inactivos. Sin filtro devuelve todos.</td></tr><tr><td>`page`</td><td>entero</td><td>No</td><td>Número de página, empezando en 1. Por defecto `1`.</td></tr><tr><td>`page_size`</td><td>entero</td><td>No</td><td>Registros por página. Por defecto `50`. Máximo `1000`.</td></tr></tbody></table>

</div></div>##### **Estados de factura — `GET /masters/invoice-statuses`**

```http
GET https://{{instancia}}/service/v2/public/masters/invoice-statuses
```

Devuelve el significado de cada `estado_id` que aparece en las respuestas de factura. No recibe parámetros: entrega el catálogo completo.

<p class="callout info">**Parámetros inválidos:** si `page`, `page_size`, `activa`, `tipo_doc_id`, `fact_electronica`, `resolucion_para`, una fecha, `target` o `estado` no tienen un valor válido, la respuesta es `400` con `VALIDATION_ERROR`. `page` y `page_size` deben ser enteros mayores que cero.</p>

<div class="page-content" dir="auto" id="bkmrk--1"><div dir="auto">  </div></div>#### **3. La Respuesta (¿Qué te entregaremos?)**

Los cuatro catálogos responden con el mismo **envelope** de las lecturas de la API: el estado, el mensaje, el cuerpo con los registros y el bloque de paginación.

##### **Estructura principal de la respuesta**

<div class="page-content" dir="auto" id="bkmrk-campo-tipo-descripci"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 8%;"></col><col style="width: 70%;"></col></colgroup><thead><tr><th>Campo</th><th>Tipo</th><th>Descripción</th></tr></thead><tbody><tr><td>`status`</td><td>integer</td><td>Código del estado de la respuesta. `200` cuando la consulta fue exitosa.</td></tr><tr><td>`message`</td><td>string</td><td>`null` cuando la consulta fue exitosa.</td></tr><tr><td>`body`</td><td>array</td><td>Registros del catálogo consultado. En un error, este campo no existe.</td></tr><tr><td>`pagination`</td><td>object</td><td>Resumen de la página: `total_records`, `total_pages`, `current_page`, `page_size`, `current_page_records`, `has_next_page` y `has_previous_page`.</td></tr><tr><td>`filters_applied`</td><td>object</td><td>Filtros que aplicó el servicio (por ejemplo `{"target": 2}`). Llega en `null` cuando la consulta no llevaba filtros.</td></tr></tbody></table>

</div></div>##### **Resoluciones de venta**

Cada elemento de `body` describe una resolución de venta:

```json
{
  "status": 200,
  "message": null,
  "body": [
    {
      "resolucion_id": 1,
      "tipo_doc_id": 1,
      "tipo_doc": "Factura electronica de venta",
      "resolucion_numero": "18760000001",
      "consecutivo_iniciar": 1,
      "consecutivo_inicial": 1,
      "consecutivo_final": 5000,
      "fecha": "2026-01-01",
      "fecha_vigencia": "2027-01-01",
      "prefijo": "FE",
      "dias_vencimiento": 30,
      "activa": "SI",
      "fact_electronica": "SI",
      "resolucion_para": 1
    }
  ],
  "pagination": {
    "total_records": 1,
    "total_pages": 1,
    "current_page": 1,
    "page_size": 10,
    "current_page_records": 1,
    "has_next_page": false,
    "has_previous_page": false
  },
  "filters_applied": null
}
```

El `prefijo` y el `dias_vencimiento` son los que nuby usa al crear la factura si no envías `fecha_vencimiento`.

##### **Conceptos de nota**

Cada elemento de `body` trae el `id` que se envía en `concepto_id`, su tipo (`target`), el código y el nombre:

```json
{
  "status": 200,
  "message": null,
  "body": [
    { "id": 9, "target": 2, "codigo": "2", "nombre": "Gastos por cobrar", "estado": 1 },
    { "id": 10, "target": 2, "codigo": "4", "nombre": "Otros", "estado": 1 }
  ],
  "pagination": { "total_records": 2, "total_pages": 1, "current_page": 1, "page_size": 50, "current_page_records": 2, "has_next_page": false, "has_previous_page": false },
  "filters_applied": { "target": 2 }
}
```

<p class="callout info">Si no envías `concepto_id` al crear una nota, nuby aplica el concepto por defecto del tipo. Envíalo solo cuando necesites un concepto específico.</p>

##### **Productos e impuestos**

Cada elemento de `body` describe un producto con sus datos y los porcentajes configurados:

```json
{
  "producto_id": 159,
  "producto": "Plan X",
  "descripcion": "Plan administrativo",
  "codigo": "PLAN-X",
  "valor_unitario": 100000,
  "tipo_iva_id": 1,
  "por_iva": 19,
  "tipo_retencion_id": 1,
  "por_retencion": 2.5,
  "tipo_reteiva_id": null,
  "por_reteiva": null,
  "tipo_reteica_id": null,
  "por_reteica": null,
  "estado": 1
}
```

<p class="callout warning">**Los porcentajes no se calculan solos.** Al crear la factura o la nota envía `tipo_iva_id` y `por_iva` (y sus equivalentes de retención) tomados de este catálogo. Si el producto trae `null`, envía `null` y el impuesto no se aplica.</p>

##### **Estados de factura**

Cada elemento de `body` empareja el `estado_id` con su nombre, ordenado por `estado_id`:

<div class="page-content" dir="auto" id="bkmrk-estado_id-estado-qu%C3%A9"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 14%;"></col><col style="width: 64%;"></col></colgroup><thead><tr><th>`estado_id`</th><th>Estado</th><th>Qué significa</th></tr></thead><tbody><tr><td>1</td><td>Facturado</td><td>Emitida con consecutivo y enviada a la DIAN.</td></tr><tr><td>2</td><td>Anulado</td><td>Anulada.</td></tr><tr><td>3</td><td>Pagada</td><td>Saldo en cero.</td></tr><tr><td>4</td><td>Contabilizada</td><td>Contabilidad cerrada.</td></tr><tr><td>5</td><td>Borrador</td><td>Creada por la API, editable, aún sin número legal.</td></tr><tr><td>6</td><td>Anulada por nota crédito</td><td>Una nota crédito total la dejó en saldo cero.</td></tr><tr><td>7</td><td>Anulado por nota ajuste</td><td>Anulada por un ajuste.</td></tr></tbody></table>

</div></div><p class="callout info">Puedes consultar este catálogo una vez y guardarlo en tu sistema: los estados son fijos.</p>

<div class="page-content" dir="auto" id="bkmrk--2"><div dir="auto">  </div></div>#### **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 sistema te bloquea el acceso con un error `401` y tu sistema debe volver a consumir el servicio de **Login** para pedir un pase nuevo.

Las causas de rechazo de los catálogos ya documentadas son estas:

<div class="page-content" dir="auto" id="bkmrk-c%C3%B3digo-http-error_co"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 14%;"></col><col style="width: 64%;"></col></colgroup><thead><tr><th>Código HTTP</th><th>`error_code`</th><th>Cuándo ocurre</th></tr></thead><tbody><tr><td>`400`</td><td>`VALIDATION_ERROR`</td><td>Un parámetro tiene un valor inválido (por ejemplo `page=0`, `target=3` o una fecha mal formada).</td></tr><tr><td>`401`</td><td>—</td><td>Falta el encabezado `Authorization` o el token no es válido.</td></tr><tr><td>`403`</td><td>`RECURSO_NO_AUTORIZADO`</td><td>El token no tiene el permiso `catalogs:read`.</td></tr><tr><td>`500`</td><td>`INTERNAL_ERROR`</td><td>Fallo interno al consultar la base. Reintenta más tarde.</td></tr></tbody></table>

</div></div><p class="callout warning">**Un parámetro inválido rechaza la consulta completa** con `400 VALIDATION_ERROR`. Corrige el valor y repite la petición.</p>

Así se ve el rechazo por permisos:

```json
{
  "success": false,
  "status": 403,
  "message": "El consumidor no tiene habilitado el recurso solicitado.",
  "error_code": "RECURSO_NO_AUTORIZADO"
}
```

<div class="page-content" dir="auto" id="bkmrk--3"><div dir="auto">  ---

</div></div>#### **5. Ejemplos de integración**

Los ejemplos consultan el catálogo de **resoluciones de venta**; la misma forma de llamada sirve para los otros tres catálogos, cambiando solo la ruta. Tratan el caso feliz, el rechazo por parámetro inválido (`400 VALIDATION_ERROR`) y el rechazo por permisos (`403 RECURSO_NO_AUTORIZADO`).

<div class="page-content" dir="auto" id="bkmrk-curl-token%3D%22tu_token"><div dir="auto"><details><summary>cURL</summary>

```bash
TOKEN="TU_TOKEN_AQUI"
INSTANCIA="mi-inmobiliaria.nuby.app"

# 1. Primera página de resoluciones activas
curl --silent --show-error --write-out "\nHTTP %{http_code}\n" \
  "https://${INSTANCIA}/service/v2/public/invoices/sales/resolutions?activa=SI&page=1&page_size=10" \
  -H "Authorization: Bearer ${TOKEN}"

# 2. Un parámetro inválido devuelve 400 VALIDATION_ERROR
curl --silent --show-error --write-out "\nHTTP %{http_code}\n" \
  "https://${INSTANCIA}/service/v2/public/invoices/sales/resolutions?page=0" \
  -H "Authorization: Bearer ${TOKEN}"
```

</details><details><summary>PHP</summary>

```php
<?php

$instancia = 'mi-inmobiliaria.nuby.app'; // Tu dirección web completa
$token     = 'TU_TOKEN_AQUI';            // Token obtenido del servicio Login

$query = http_build_query([
    'activa'    => 'SI',
    'page'      => 1,
    'page_size' => 10,
]);

$url = "https://{$instancia}/service/v2/public/invoices/sales/resolutions?{$query}";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer {$token}",
]);

$respuesta = curl_exec($ch);
$httpCode  = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$datos = json_decode($respuesta, true);

if ($httpCode === 200) {
    foreach ($datos['body'] as $resolucion) {
        echo "{$resolucion['prefijo']} {$resolucion['resolucion_numero']} - "
            . "{$resolucion['consecutivo_inicial']} a {$resolucion['consecutivo_final']}\n";
    }

    echo "Total: {$datos['pagination']['total_records']}\n";
} elseif ($httpCode === 400) {
    echo "Parámetro inválido ({$datos['error_code']}): {$datos['message']}\n";
} elseif ($httpCode === 403) {
    echo "Sin permiso catalogs:read ({$datos['error_code']}): {$datos['message']}\n";
} else {
    echo "Error HTTP {$httpCode}: {$datos['message']}\n";
}
```

</details><details><summary>Python</summary>

```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. Envía la petición con los filtros como parámetros
url = f"https://{instancia}/service/v2/public/invoices/sales/resolutions"
headers = {"Authorization": f"Bearer {token}"}
params = {"activa": "SI", "page": 1, "page_size": 10}

respuesta = requests.get(url, headers=headers, params=params, timeout=30)

# 3. Procesa la respuesta
if respuesta.status_code == 200:
    datos = respuesta.json()
    for resolucion in datos["body"]:
        print(resolucion["prefijo"], resolucion["resolucion_numero"])
    print(f"Total: {datos['pagination']['total_records']}")
elif respuesta.status_code in (400, 403):
    error = respuesta.json()
    print(f"Rechazo {error['error_code']}: {error['message']}")
else:
    print(f"Error HTTP {respuesta.status_code}: {respuesta.text}")
```

</details><details><summary>JavaScript (Fetch API)</summary>

```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. Función que consulta el catálogo de resoluciones de venta
async function listarResoluciones(filtros = {}) {
  const params = new URLSearchParams({
    activa: 'SI',
    page: '1',
    page_size: '10',
    ...filtros,
  });

  const url = `https://${instancia}/service/v2/public/invoices/sales/resolutions?${params}`;

  const response = await fetch(url, {
    headers: { 'Authorization': `Bearer ${token}` },
  });

  const datos = await response.json().catch(() => ({}));

  if (!response.ok) {
    console.error(`Error HTTP ${response.status} ${datos.error_code ?? ''}: ${datos.message ?? ''}`);
    return [];
  }

  console.log(`Total de resoluciones: ${datos.pagination.total_records}`);
  return datos.body;
}

// 3. Consume el catálogo
listarResoluciones().then((resoluciones) => {
  resoluciones.forEach((r) => console.log(`${r.prefijo} ${r.resolucion_numero}`));
});
```

</details></div></div><p class="callout info">Los otros tres catálogos se consumen igual, con el mismo encabezado `Authorization` y el mismo permiso `catalogs:read`; solo cambia la ruta: `GET https://{{instancia}}/service/v2/public/masters/note-concepts` para los conceptos de nota (con el filtro opcional `target`), `GET https://{{instancia}}/service/v2/public/masters/products` para los productos e impuestos (con `search` y `estado`) y `GET https://{{instancia}}/service/v2/public/masters/invoice-statuses` para los estados de factura (sin parámetros).</p>

<div class="page-content" dir="auto" id="bkmrk--4"><div dir="auto">  </div></div>#### **6. Buenas prácticas y límites conocidos**

##### **Recomendaciones**

<div class="page-content" dir="auto" id="bkmrk-consulta-los-cat%C3%A1log"><div dir="auto">- **Consulta los catálogos una vez y guárdalos.** Cambian poco y son de solo lectura.
- **Usa `/invoices/sales/resolutions`** para elegir la resolución de una factura de venta; el endpoint anterior puede devolver resoluciones de contrato.
- **Toma los impuestos de `/masters/products`** y envíalos en `items[]`; nuby no los adivina.
- **Recorre hasta `total_pages`**, no hasta una página vacía.
- **No envíes `page_size` mayor a 1000:** el servidor lo recorta.

</div></div>##### **Límites**

<div class="page-content" dir="auto" id="bkmrk-los-cat%C3%A1logos-solo-d"><div dir="auto">- Los catálogos solo devuelven datos de **facturas de venta**.
- No exponen datos de contacto de terceros ni información contable.
- Los estados de factura son fijos; los conceptos y productos dependen de la configuración de tu instancia.

</div></div><p class="callout info">Si necesitas crear una factura, revisa la página [*<span class="tw-font-bold tw-text-arrBlue hover:tw-text-nubyBlue tw-cursor-pointer">Crear Factura Borrador</span>*](https://docs.nuby.ai/books/api-nuby-v2/page/crear-factura-borrador).</p>