# Listar Terceros [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>

Este servicio devuelve una **lista paginada de terceros** registrados en nuby, con sus datos principales de identificación y contacto. Puedes filtrar por documento exacto, por coincidencia parcial en el nombre y por tipo de documento.

Úsalo para **buscar un tercero del que no conoces el identificador interno**, para conciliar tus clientes con los de nuby o para construir un buscador en tu propia interfaz.

<p class="callout info">**¿Para qué sirve este servicio?**  
Los casos de uso más frecuentes de este servicio son:</p>

<div class="page-content" dir="auto" id="bkmrk-buscar-un-tercero-de"><div dir="auto">- **Buscar un tercero del que no conoces el identificador interno**, por documento exacto o por coincidencia parcial en el nombre.
- **Conciliar tus clientes con los que ya están en nuby.**
- **Construir un buscador en tu propia interfaz**, con paginación.
- **Obtener el `tercero_id`** que necesitan los demás servicios de la API.

---

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

##### **Método y dirección**

<div class="page-content" dir="auto" id="bkmrk-dato-valor-m%C3%A9todo-ge"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 23%;"></col><col style="width: 77%;"></col></colgroup><thead><tr><th>Dato</th><th>Valor</th></tr></thead><tbody><tr><td>Método</td><td>`GET`</td></tr><tr><td>Recurso</td><td>`/third-parties/list`</td></tr><tr><td>Cuerpo de la petición</td><td>No se envía cuerpo</td></tr></tbody></table>

</div></div>```http
GET https://{{instancia}}/service/v2/public/third-parties/list
```

**¿Qué debes 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.

##### **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>##### **Permiso requerido (scope)**

Este servicio es de **solo lectura** y exige el permiso `catalogs:read` en el cliente OAuth. Si el token es válido pero al cliente le falta el permiso, la respuesta es `403` con el código `RECURSO_NO_AUTORIZADO`.

<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?)**

Todos los parámetros son opcionales y se envían en la dirección web (*query string*). Si no envías ninguno, recibes la primera página con los primeros 50 terceros ordenados por documento.

<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: 22%;"></col><col style="width: 8%;"></col><col style="width: 9%;"></col><col style="width: 10%;"></col><col style="width: 51%;"></col></colgroup><thead><tr><th>Parámetro</th><th>Tipo</th><th>Requerido</th><th>Valor por defecto</th><th>Descripción</th></tr></thead><tbody><tr><td>`documento`</td><td>texto</td><td>No</td><td>—</td><td>Busca por **documento exacto**. Es el filtro más preciso: úsalo cuando ya conoces el documento del tercero.</td></tr><tr><td>`nombre`</td><td>texto</td><td>No</td><td>—</td><td>Busca una **coincidencia parcial** en `nombre1`, `nombre2`, `apellido1` y `apellido2`. No distingue entre nombres y apellidos.</td></tr><tr><td>`tipo_doc_id`</td><td>entero</td><td>No</td><td>—</td><td>Filtra por tipo de documento exacto. Debe ser un entero mayor que cero.</td></tr><tr><td>`page`</td><td>entero</td><td>No</td><td>`1`</td><td>Número de página, empezando en 1.</td></tr><tr><td>`page_size`</td><td>entero</td><td>No</td><td>`50`</td><td>Cantidad de registros por página. Si envías un valor mayor a `1000`, nuby lo ajusta a `1000`.</td></tr></tbody></table>

</div></div><p class="callout warning">**Importante:** `page` y `page_size` deben ser números positivos. Un valor en cero, negativo o con letras produce `400`; no se corrige automáticamente.</p>

<p class="callout info">**Los filtros se combinan.** Si envías `documento` y `tipo_doc_id` al mismo tiempo, la búsqueda exige que se cumplan ambos.</p>

##### **Ejemplos de dirección**

```http
GET /third-parties/list?page=1&page_size=50
GET /third-parties/list?documento=900123456
GET /third-parties/list?nombre=acme&page_size=10
GET /third-parties/list?tipo_doc_id=1&page=2
```

##### **Validaciones de parámetros**

La consulta se valida antes de ejecutarse. Si un parámetro no cumple su regla, la respuesta es `400 VALIDATION_ERROR` y no se devuelve ningún tercero:

<div class="page-content" dir="auto" id="bkmrk-par%C3%A1metro-regla-mens"><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>Parámetro</th><th>Regla</th><th>Mensaje `400`</th></tr></thead><tbody><tr><td>`page`</td><td>Entero positivo. `0`, negativos o texto no son válidos.</td><td>`El parámetro "page" debe ser un número positivo.`</td></tr><tr><td>`page_size`</td><td>Entero positivo. Si supera `1000`, nuby lo ajusta a `1000`.</td><td>`El parámetro "page_size" debe ser un número positivo.`</td></tr><tr><td>`tipo_doc_id`</td><td>Entero positivo; se compara exactamente contra el tipo de documento.</td><td>`El parámetro "tipo_doc_id" debe ser un número entero positivo.`</td></tr><tr><td>`documento`, `nombre`</td><td>Texto libre. Se comparan como se describe en la tabla de filtros.</td><td>No generan `400` por formato.</td></tr></tbody></table>

</div></div>##### **Cuándo usar cada filtro**

<div class="page-content" dir="auto" id="bkmrk-filtro-caso-de-uso-p"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 14%;"></col><col style="width: 61%;"></col></colgroup><thead><tr><th>Filtro</th><th>Caso de uso</th><th>Precisión</th></tr></thead><tbody><tr><td>`documento`</td><td>Buscar un tercero concreto del que ya conoces el documento.</td><td>Exacta: devuelve el registro con ese documento.</td></tr><tr><td>`nombre`</td><td>Búsqueda exploratoria cuando no tienes el documento.</td><td>Parcial sobre `nombre1`, `nombre2`, `apellido1` y `apellido2`; puede devolver varios.</td></tr><tr><td>`tipo_doc_id`</td><td>Segmentar por tipo de documento (por ejemplo, solo NIT).</td><td>Exacta sobre el identificador del tipo.</td></tr><tr><td>`documento` + `tipo_doc_id`</td><td>Confirmar que el documento encontrado es del tipo esperado.</td><td>Exacta: los filtros se combinan con `AND`.</td></tr><tr><td>`page` / `page_size`</td><td>Recorrer un resultado largo sin traer todo de una vez.</td><td>No filtra: controla el tamaño y la posición de la página.</td></tr></tbody></table>

  </div></div>#### **3. La Respuesta (¿Qué te entregaremos?)**

La respuesta tiene una estructura uniforme para todas las consultas de la API: los datos van en `body` y la información de paginación en `pagination`.

```json
{
  "status": 200,
  "message": null,
  "body": [
    {
      "tercero_id": 123,
      "documento": "900123456",
      "tipo_doc_id": 1,
      "tipo_doc": "NIT",
      "nombre_completo": "ACME SAS",
      "email": "cuenta@acme.co",
      "telefono1": "6040000000",
      "direccion1": "CL 1 #2-3",
      "municipio_id": 1,
      "tipo_tercero_id": "1,2"
    }
  ],
  "pagination": {
    "page": 1,
    "page_size": 50,
    "total": 1,
    "total_pages": 1
  },
  "filters_applied": {
    "documento": "900123456"
  }
}
```

##### **Variantes de respuesta**

El listado cambia el contenido de `filters_applied` y de `message` según los filtros y las coincidencias. Maneja estos tres casos:

##### **Con filtros**

```json
{
  "status": 200,
  "message": null,
  "body": [
    {
      "tercero_id": 123,
      "documento": "900123456",
      "tipo_doc_id": 1,
      "tipo_doc": "NIT",
      "nombre_completo": "ACME SAS",
      "email": "cuenta@acme.co",
      "telefono1": "6040000000",
      "direccion1": "CL 1 #2-3",
      "municipio_id": 1,
      "tipo_tercero_id": "1,2"
    }
  ],
  "pagination": { "page": 1, "page_size": 50, "total": 1, "total_pages": 1 },
  "filters_applied": { "documento": "900123456" }
}
```

##### **Sin filtros**

Sin parámetros, `filters_applied` es `null` y recibes la primera página de todos los terceros, ordenados por documento ascendente.

```json
{
  "status": 200,
  "message": null,
  "body": [
    {
      "tercero_id": 123,
      "documento": "900123456",
      "tipo_doc_id": 1,
      "tipo_doc": "NIT",
      "nombre_completo": "ACME SAS",
      "email": "cuenta@acme.co",
      "telefono1": "6040000000",
      "direccion1": "CL 1 #2-3",
      "municipio_id": 1,
      "tipo_tercero_id": "1,2"
    },
    {
      "tercero_id": 124,
      "documento": "901234567",
      "tipo_doc_id": 1,
      "tipo_doc": "NIT",
      "nombre_completo": "INVERSIONES ANDINAS SAS",
      "email": null,
      "telefono1": "6044445555",
      "direccion1": "CR 43A #1-50",
      "municipio_id": 1,
      "tipo_tercero_id": "1"
    }
  ],
  "pagination": { "page": 1, "page_size": 50, "total": 2, "total_pages": 1 },
  "filters_applied": null
}
```

##### **Lista vacía**

No es un error: se responde `200` con `body: []` y un mensaje informativo. Si enviaste filtros, `filters_applied` sigue reflejándolos.

```json
{
  "status": 200,
  "message": "No se encontraron terceros con los filtros aplicados.",
  "body": [],
  "pagination": { "page": 1, "page_size": 50, "total": 0, "total_pages": 0 },
  "filters_applied": { "nombre": "zzz" }
}
```

##### **Campos de cada tercero en la lista**

<p class="callout warning">**Importante:** la columna “Puede ser `null`” describe el contrato del endpoint para terceros creados o actualizados por la API. En terceros históricos de nuby algunos campos que hoy son obligatorios pueden estar vacíos o en `null`; no asumas que un campo marcado “No” siempre trae valor.</p>

<div class="page-content" dir="auto" id="bkmrk-campo-tipo-puede-ser"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 22%;"></col><col style="width: 8%;"></col><col style="width: 11%;"></col><col style="width: 59%;"></col></colgroup><thead><tr><th>Campo</th><th>Tipo</th><th>Puede ser `null`</th><th>Descripción</th></tr></thead><tbody><tr><td>`tercero_id`</td><td>entero</td><td>No</td><td>Identificador interno del tercero. Úsalo para consultar el detalle.</td></tr><tr><td>`documento`</td><td>texto</td><td>No</td><td>Número de documento o NIT.</td></tr><tr><td>`tipo_doc_id`</td><td>entero</td><td>No</td><td>Identificador del tipo de documento.</td></tr><tr><td>`tipo_doc`</td><td>texto</td><td>No</td><td>Nombre del tipo de documento (por ejemplo, NIT).</td></tr><tr><td>`nombre_completo`</td><td>texto</td><td>No</td><td>Nombre unificado: nombres y apellidos separados por espacios, sin duplicar espacios.</td></tr><tr><td>`email`</td><td>texto</td><td>Sí</td><td>Correo electrónico del tercero, si está registrado.</td></tr><tr><td>`telefono1`</td><td>texto</td><td>Sí</td><td>Teléfono principal, si está registrado.</td></tr><tr><td>`direccion1`</td><td>texto</td><td>Sí</td><td>Dirección principal, si está registrada.</td></tr><tr><td>`municipio_id`</td><td>entero</td><td>No</td><td>Identificador del municipio. El nombre del municipio se obtiene en el detalle.</td></tr><tr><td>`tipo_tercero_id`</td><td>texto</td><td>Sí</td><td>Tipos del tercero en una sola cadena separada por comas, por ejemplo `"1,2"`. Es `null` si el tercero no tiene tipos.</td></tr></tbody></table>

</div></div>##### **Lista vs. detalle**

<div class="page-content" dir="auto" id="bkmrk-dato-en-el-listado-e"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30%;"></col><col style="width: 14%;"></col><col style="width: 56%;"></col></colgroup><thead><tr><th>Dato</th><th>En el listado</th><th>En el detalle</th></tr></thead><tbody><tr><td>Nombres y apellidos separados</td><td>No: solo `nombre_completo`</td><td>Sí: `nombre1`, `nombre2`, `apellido1` y `apellido2`</td></tr><tr><td>Ubicación</td><td>Solo `municipio_id`</td><td>`municipio`, `departamento` y `pais`</td></tr><tr><td>Información tributaria</td><td>No</td><td>Sí</td></tr><tr><td>Tipos del tercero</td><td>Cadena `"1,2"`</td><td>Cadena y arreglo `[1, 2]`</td></tr><tr><td>Información bancaria</td><td>No</td><td>Sí</td></tr></tbody></table>

</div></div>##### **Paginación**

<div class="page-content" dir="auto" id="bkmrk-campo-descripci%C3%B3n-pa"><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>Campo</th><th>Descripción</th></tr></thead><tbody><tr><td>`page`</td><td>Página devuelta.</td></tr><tr><td>`page_size`</td><td>Cantidad de registros por página efectivamente aplicada.</td></tr><tr><td>`total`</td><td>Total de terceros que cumplen los filtros.</td></tr><tr><td>`total_pages`</td><td>Total de páginas disponibles. Cuando no hay resultados, este valor es `0`.</td></tr></tbody></table>

</div></div>##### **`filters_applied` y `message`**

<div class="page-content" dir="auto" id="bkmrk-si-no-enviaste-filtr"><div dir="auto">- Si **no enviaste filtros**, `filters_applied` es `null`.
- Si **enviaste filtros**, `filters_applied` es un objeto con los filtros usados.
- Si hay resultados, `message` es `null`.
- Si no hay resultados, `message` es `No se encontraron terceros con los filtros aplicados.` y `body` es una lista vacía `[]`.

</div></div>##### **Comportamiento de `filters_applied` y `message`**

<div class="page-content" dir="auto" id="bkmrk-situaci%C3%B3n-filters_ap"><div dir="auto"><table style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30%;"></col><col style="width: 14%;"></col><col style="width: 56%;"></col></colgroup><thead><tr><th>Situación</th><th>`filters_applied`</th><th>`message`</th></tr></thead><tbody><tr><td>Sin filtros y con resultados</td><td>`null`</td><td>`null`</td></tr><tr><td>Con filtros y con resultados</td><td>Objeto con los filtros aplicados</td><td>`null`</td></tr><tr><td>Con filtros y sin resultados</td><td>Objeto con los filtros aplicados</td><td>`No se encontraron terceros con los filtros aplicados.`</td></tr><tr><td>Sin filtros y sin resultados</td><td>`null`</td><td>`No se encontraron terceros con los filtros aplicados.`</td></tr></tbody></table>

</div></div>##### **Campos del envelope**

<div class="page-content" dir="auto" id="bkmrk-campo-contenido-cu%C3%A1n"><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>Campo</th><th>Contenido</th><th>Cuándo cambia</th></tr></thead><tbody><tr><td>`status`</td><td>`200` en una lectura exitosa.</td><td>Los errores usan su propio código HTTP y agregan `error_code`.</td></tr><tr><td>`message`</td><td>Texto informativo o `null`.</td><td>Deja de ser `null` cuando no hay coincidencias.</td></tr><tr><td>`body`</td><td>Arreglo de terceros con los campos del listado.</td><td>Es `[]` cuando no hay coincidencias.</td></tr><tr><td>`pagination`</td><td>Objeto con `page`, `page_size`, `total` y `total_pages`.</td><td>`total` y `total_pages` pasan a `0` sin resultados.</td></tr><tr><td>`filters_applied`</td><td>Objeto con los filtros usados, o `null`.</td><td>Es `null` solo cuando no enviaste ningún filtro.</td></tr></tbody></table>

</div></div><p class="callout info">**Una lista vacía no es un error.** Cuando ningún tercero coincide con los filtros, el servicio responde `200` con `body: []`. Revisa `pagination.total` para confirmar que no hay coincidencias.</p>

<p class="callout warning">**Orden de los resultados:** la lista se ordena por `documento` ascendente y, cuando hay documentos repetidos, por `tercero_id` ascendente. El orden es estable entre páginas.</p>

<div class="page-content" dir="auto" id="bkmrk--1"><div dir="auto">  </div></div>#### **4. Seguridad y Posibles Errores**

<div class="page-content" dir="auto" id="bkmrk-http-error_code-cu%C3%A1n"><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>HTTP</th><th>`error_code`</th><th>Cuándo ocurre y cómo resolverlo</th></tr></thead><tbody><tr><td>`400`</td><td>`VALIDATION_ERROR`</td><td>`page` o `page_size` no son números positivos, o `tipo_doc_id` no es un entero positivo. Corrige el valor y repite la consulta.</td></tr><tr><td>`401`</td><td>—</td><td>No enviaste el encabezado `Authorization`, o el token no existe o expiró. Vuelve a consumir **Login**.</td></tr><tr><td>`403`</td><td>`CONSUMIDOR_NO_AUTENTICADO`</td><td>El token es válido, pero no corresponde a un cliente OAuth habilitado para consumir la API.</td></tr><tr><td>`403`</td><td>`RECURSO_NO_AUTORIZADO`</td><td>Al cliente OAuth le falta el permiso `catalogs:read`.</td></tr><tr><td>`500`</td><td>`INTERNAL_ERROR`</td><td>Fallo interno al consultar. Reintenta; si persiste, contacta a soporte.</td></tr></tbody></table>

</div></div>##### **Ejemplo de parámetro inválido (400)**

```json
{
  "success": false,
  "status": 400,
  "message": "El parámetro \"page\" debe ser un número positivo.",
  "error_code": "VALIDATION_ERROR"
}
```

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

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

<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="tu-inmobiliaria.nuby.app"

# Buscar por documento exacto
curl -G "https://${INSTANCIA}/service/v2/public/third-parties/list" \
  --data-urlencode "documento=900123456" \
  -H "Authorization: Bearer ${TOKEN}"

# Buscar por nombre, página 1 de 10 registros
curl -G "https://${INSTANCIA}/service/v2/public/third-parties/list" \
  --data-urlencode "nombre=acme" \
  --data-urlencode "page=1" \
  --data-urlencode "page_size=10" \
  -H "Authorization: Bearer ${TOKEN}"
```

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

```php
<?php

$instancia = 'tu-inmobiliaria.nuby.app';
$token = 'TU_TOKEN_AQUI';

$query = http_build_query([
    'documento' => '900123456',
    'page' => 1,
    'page_size' => 50,
]);

$url = "https://{$instancia}/service/v2/public/third-parties/list?{$query}";

$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);

echo "HTTP: {$codigo}\n";
echo "Total: " . ($datos['pagination']['total'] ?? 0) . "\n";

foreach ($datos['body'] as $tercero) {
    echo $tercero['documento'] . ' - ' . $tercero['nombre_completo'] . "\n";
}
```

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

```python
import requests

instancia = "tu-inmobiliaria.nuby.app"
token = "TU_TOKEN_AQUI"
url = f"https://{instancia}/service/v2/public/third-parties/list"

headers = {
    "Authorization": f"Bearer {token}",
}

pagina = 1
total_paginas = 1

while pagina <= total_paginas:
    respuesta = requests.get(
        url,
        headers=headers,
        params={"nombre": "acme", "page": pagina, "page_size": 50},
        timeout=30,
    )

    if respuesta.status_code != 200:
        print(respuesta.status_code, respuesta.json())
        break

    datos = respuesta.json()
    total_paginas = datos["pagination"]["total_pages"]

    for tercero in datos["body"]:
        print(tercero["documento"], tercero["nombre_completo"])

    pagina += 1
```

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

```javascript
const instancia = 'tu-inmobiliaria.nuby.app';
const token = 'TU_TOKEN_AQUI';

const params = new URLSearchParams({
  nombre: 'acme',
  page: '1',
  page_size: '10'
});

const url = `https://${instancia}/service/v2/public/third-parties/list?${params}`;

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

const data = await respuesta.json();

if (respuesta.ok) {
  console.log(`Página ${data.pagination.page} de ${data.pagination.total_pages}`);
  data.body.forEach(t => console.log(t.documento, t.nombre_completo));
} else {
  console.error(`${respuesta.status} ${data.error_code}: ${data.message}`);
}
```

</details><details><summary>Power Query M (Excel / Power BI)</summary>

Power Query consulta una página por vez con `Web.Contents`. Puedes cambiar `nombre` por `documento` o `tipo_doc_id` en la cadena de la dirección.

```m
let
    // 1. Configura tus datos de acceso
    instancia = "tu-inmobiliaria.nuby.app",
    token = "TU_TOKEN_AQUI",

    // 2. Prepara la dirección con el filtro y la página
    url = "https://" & instancia & "/service/v2/public/third-parties/list?nombre=acme&page=1&page_size=1000",

    // 3. Envía la petición GET
    response = Web.Contents(url, [
        Headers = [
            #"Authorization" = "Bearer " & token
        ]
    ]),

    // 4. Decodifica el envelope
    jsonResponse = Json.Document(response),
    body = jsonResponse[body],
    pagination = jsonResponse[pagination],

    // 5. Convierte el listado en tabla
    tabla = Table.FromList(body, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    expandido = Table.ExpandRecordColumn(tabla, "Column1",
        {"tercero_id", "documento", "tipo_doc_id", "tipo_doc", "nombre_completo",
         "email", "telefono1", "direccion1", "municipio_id", "tipo_tercero_id"},
        {"TerceroID", "Documento", "TipoDocID", "TipoDoc", "NombreCompleto",
         "Email", "Telefono1", "Direccion1", "MunicipioID", "TipoTerceroID"}),
    tipos = Table.TransformColumnTypes(expandido, {
        {"TerceroID", Int64.Type},
        {"TipoDocID", Int64.Type},
        {"MunicipioID", Int64.Type}
    }),
    totalPaginas = pagination[total_pages]
in
    tipos
```

</details></div></div>#### **6. Buenas prácticas y límites conocidos**

<div class="page-content" dir="auto" id="bkmrk-para-buscar-un-terce"><div dir="auto">- **Para buscar un tercero concreto, usa `documento`.** Es coincidencia exacta y devuelve el registro correcto sin ambigüedad.
- **Usa `nombre` solo para búsquedas exploratorias.** Es coincidencia parcial y puede devolver varios terceros.
- **No pidas `page_size=1000` "por si acaso".** Pagina con un tamaño razonable y recorre con `page`.
- **Recorre hasta `total_pages`** y no hasta que una página venga vacía: si el filtro no tiene resultados, `total_pages` es `0`.
- **No uses la lista como detalle.** Para nombres y apellidos separados, ubicación completa, información tributaria y arreglo de tipos, consulta la página [*<span class="tw-font-bold tw-text-arrBlue hover:tw-text-nubyBlue tw-cursor-pointer">Buscar Tercero por Código</span>*](https://docs.nuby.ai/books/api-nuby-v2/page/buscar-tercero-por-codigo).
- **Guarda el `tercero_id`** que encuentres: evita volver a buscar por documento en cada operación.

</div></div><p class="callout info">Si el tercero que buscas **no existe** en nuby, puedes crearlo con el servicio [*<span class="tw-font-bold tw-text-arrBlue hover:tw-text-nubyBlue tw-cursor-pointer">Crear o Resolver Tercero</span>*](https://docs.nuby.ai/books/api-nuby-v2/page/crear-o-resolver-tercero).</p>