> ## Documentation Index
> Fetch the complete documentation index at: https://docs.x.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Paginación

> Recorre los resultados de la X API en Python usando el iterador del XDK para el manejo automático de next_token, o gestiona pagination_token manualmente para lógica de paginación personalizada.

La X API usa paginación para los endpoints que devuelven múltiples páginas de resultados (por ejemplo, timelines, búsqueda, etc.). Cada respuesta de la API incluye un objeto `meta` con `result_count`, `previous_token` y `next_token`. El XDK se encarga de realizar varias llamadas a la API usando el `next_token` para que los desarrolladores solo tengan que especificar cuántos datos buscan, sin necesidad de hacer varias llamadas.
El SDK simplifica esto con:

* **Iteradores integrados**: Usa funciones generadoras para obtener múltiples páginas sin fricción.
* **Manejo explícito de tokens**: Para control manual y flexible cuando lo necesites, pasando `pagination_token`.
* **Aplicación de max results**: Respeta `max_results` por llamada (hasta los límites de la API; por ejemplo, 100 para búsqueda).

## Paginación automática (recomendada)

Usa el método `iterate()` en las respuestas paginadas para obtener todos los resultados de forma perezosa.
**Ejemplo: búsqueda paginada**

```python title="Example" lines wrap icon="python" theme={null}
from xdk import Client
client = Client(bearer_token="your_bearer_token")
# Search with automatic pagination
all_posts = []
for page in client.posts.search_recent(
    query="python",
    max_results=100,  # Per page
    tweet_fields=["created_at", "author_id"]  # Optional expansions
):
    all_posts.extend(page.data)
    print(f"Fetched {len(page.data)} Posts (total: {len(all_posts)})")
print(f"Total tweets: {len(all_posts)}")
```

* El iterador maneja `next_token` automáticamente.
* Se detiene cuando no hay `next_token`.
* Admite backoff por rate limit para evitar errores 429.

## Paginación manual

Si necesitas controlar los resultados para alguna lógica personalizada (por ejemplo, procesar página por página), aún puedes usar el `next_token` y hacer la paginación manualmente como se muestra a continuación:

```python title="Example" lines wrap icon="python" theme={null}
# Get first page - search_recent returns an Iterator
first_page = next(client.posts.search_recent(
    query="xdk python sdk",
    max_results=100,
    pagination_token=None  # First page
))
print(f"First page: {len(first_page.data) if first_page.data else 0} Posts")
# Extract next_token from meta
next_token = None
if hasattr(first_page, 'meta') and first_page.meta:
    if hasattr(first_page.meta, 'next_token'):
        next_token = first_page.meta.next_token
    elif isinstance(first_page.meta, dict):
        next_token = first_page.meta.get('next_token')
if next_token:
    second_page = next(client.posts.search_recent(
        query="xdk python sdk",
        max_results=100,
        pagination_token=next_token
    ))
    print(f"Second page: {len(second_page.data) if second_page.data else 0} Posts")
```

**Consejos**:

* Especifica siempre `max_results` para optimizar (el valor por defecto varía según el endpoint).
* Monitorea `meta.result_count` para depurar.
* Para consultas muy grandes, considera la iteración asíncrona para evitar bloqueos.
  Para ejemplos de código detallados usando el Python XDK, consulta nuestro [repositorio de ejemplos de código en GitHub](https://github.com/xdevplatform/samples/tree/main/python).
