# Paginación

> Cómo recorrer todos tus contactos, página por página.

`GET /contacts` devuelve los contactos de a páginas. Cada respuesta trae `data` (los contactos) y `next`:

```json
{
  "data": [ { "id": "01a0d456-e419-7c69-a35f-38a00ae65b81", "…": "…" } ],
  "next": "01a0d467-e634-7f7f-b98b-bdb48431733e"
}
```

- Para pedir la página siguiente, manda el valor de `next` en el parámetro `after`.
- Cuando `next` es `null`, llegaste al final.
- `limit` define el tamaño de página: de 1 a 200, por defecto 50.

Los contactos vienen ordenados por `id`. Como los ids crecen con el tiempo, los contactos nuevos aparecen al final: si guardas el último `next`, más tarde puedes seguir desde ahí para traer solo los nuevos.

## Recorrer todos los contactos

<CodeGroup>

```javascript Node
async function* allContacts() {
  let after = null
  do {
    const url = new URL("https://app.mindo.ar/api/v1/contacts")
    url.searchParams.set("limit", "200")
    if (after) url.searchParams.set("after", after)
    const res = await fetch(url, {
      headers: { Authorization: `Bearer ${process.env.MINDO_API_KEY}` },
    })
    if (!res.ok) throw new Error((await res.json()).error)
    const page = await res.json()
    yield* page.data
    after = page.next
  } while (after)
}

for await (const contact of allContacts()) {
  console.log(contact.phone, contact.name)
}
```

```python Python
import os, requests

def all_contacts():
    after = None
    while True:
        params = {"limit": 200}
        if after:
            params["after"] = after
        res = requests.get(
            "https://app.mindo.ar/api/v1/contacts",
            headers={"Authorization": f"Bearer {os.environ['MINDO_API_KEY']}"},
            params=params,
        )
        res.raise_for_status()
        page = res.json()
        yield from page["data"]
        after = page["next"]
        if not after:
            break

for contact in all_contacts():
    print(contact["phone"], contact["name"])
```

```php PHP
<?php
function all_contacts(): Generator {
  $after = null;
  do {
    $query = http_build_query(array_filter(["limit" => 200, "after" => $after]));
    $ch = curl_init("https://app.mindo.ar/api/v1/contacts?$query");
    curl_setopt_array($ch, [
      CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("MINDO_API_KEY")],
      CURLOPT_RETURNTRANSFER => true,
    ]);
    $page = json_decode(curl_exec($ch), true);
    yield from $page["data"];
    $after = $page["next"];
  } while ($after);
}

foreach (all_contacts() as $contact) {
  echo $contact["phone"] . " " . $contact["name"] . "\n";
}
```

</CodeGroup>

<Note>
  Si la última página tiene justo `limit` contactos, `next` viene con un valor y la llamada siguiente devuelve `data: []` con `next: null`. Es normal: tu bucle termina ahí.
</Note>

## Buscar un contacto por teléfono

No hace falta recorrer todo: pasa `phone` y recibes una lista con ese contacto (o vacía si no existe).

```bash
curl "https://app.mindo.ar/api/v1/contacts?phone=%2B5491155550101" \
  -H "Authorization: Bearer $MINDO_API_KEY"
```

<Tip>
  En una URL, el `+` se escribe `%2B`. También puedes mandar el número sin `+` (`phone=5491155550101`), siempre con el código de país.
</Tip>

## Otras listas

`GET /templates` y `GET /campaigns` no se paginan: devuelven todas las plantillas aprobadas y las últimas 100 campañas.
