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

# Paginación

> Cómo funciona la paginación basada en cursores en toda la API de Devin

Todos los endpoints de lista en las APIs de Organization y Enterprise usan **paginación basada en cursores**. Esto ofrece una paginación uniforme y eficiente, independientemente del tamaño del conjunto de resultados.

<div id="how-it-works">
  ## Cómo funciona
</div>

Todos los endpoints de lista aceptan dos parámetros de consulta:

| Parámetro | Tipo    | Descripción                                                                                               |
| --------- | ------- | --------------------------------------------------------------------------------------------------------- |
| `first`   | integer | Número máximo de elementos que se devolverán por página (el valor predeterminado varía según el endpoint) |
| `after`   | string  | Cursor opaco de una respuesta anterior. Omítelo en la primera página                                      |

<div id="response-format">
  ### Formato de respuesta
</div>

Las respuestas de tipo lista incluyen metadatos de paginación:

```json theme={null}
{
  "items": [...],
  "has_next_page": true,
  "end_cursor": "eyJsYXN0X2lkIjoiYWJjMTIzIn0=",
  "total": 142
}
```

| Field           | Description                                                                                                    |
| --------------- | -------------------------------------------------------------------------------------------------------------- |
| `items`         | Array de resultados para la página actual                                                                      |
| `has_next_page` | `true` si hay más resultados                                                                                   |
| `end_cursor`    | Pasa esto como el parámetro `after` para obtener la página siguiente. `null` cuando `has_next_page` es `false` |
| `total`         | Número total de elementos coincidentes (puede omitirse en algunos endpoints por motivos de rendimiento)        |

<div id="example-paginating-through-sessions">
  ## Ejemplo: paginación de sesiones
</div>

<div id="first-page">
  ### Primera página
</div>

```bash theme={null}
curl "https://api.devin.ai/v3/organizations/$DEVIN_ORG_ID/sessions?first=10" \
  -H "Authorization: Bearer $DEVIN_API_KEY"
```

<div id="next-page">
  ### Siguiente página
</div>

Utiliza el valor de `end_cursor` de la respuesta anterior:

```bash theme={null}
curl "https://api.devin.ai/v3/organizations/$DEVIN_ORG_ID/sessions?first=10&after=eyJsYXN0X2lkIjoiYWJjMTIzIn0=" \
  -H "Authorization: Bearer $DEVIN_API_KEY"
```

<div id="collecting-all-results">
  ### Recopilación de todos los resultados
</div>

```python theme={null}
import os
import requests

org_id = os.environ["DEVIN_ORG_ID"]
url = f"https://api.devin.ai/v3/organizations/{org_id}/sessions"
headers = {"Authorization": f"Bearer {os.environ['DEVIN_API_KEY']}"}
all_sessions = []
cursor = None

while True:
    params = {"first": 50}
    if cursor:
        params["after"] = cursor

    response = requests.get(url, headers=headers, params=params).json()
    all_sessions.extend(response["items"])

    if not response.get("has_next_page"):
        break
    cursor = response["end_cursor"]

print(f"Fetched {len(all_sessions)} sessions")
```

<div id="migrating-from-offset-based-pagination">
  ## Migración desde paginación basada en offset
</div>

Si estás migrando desde la API v1 o v2, reemplaza `offset`/`limit` por `after`/`first`:

```bash theme={null}
# Before (v1/v2)
curl ".../v1/sessions?offset=50&limit=25"

# After
curl ".../v3/organizations/{org_id}/sessions?first=25&after=CURSOR_FROM_PREVIOUS_PAGE"
```

La paginación basada en cursores es más fiable que la paginación basada en offset porque no se ve afectada por elementos que se agregan o eliminan entre páginas.
