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

# Pagination

> Comprendre et gérer la pagination des collections

## Principe de pagination

Les ressources retournant beaucoup de résultats sont automatiquement paginées pour optimiser les performances.

## Utilisation du champ `_next`

Le champ `_next` dans la réponse contient l'URL de la page suivante.

### Exemple de réponse paginée

```json theme={null}
{
  "_status": "OK",
  "_self": "/restapi/v1/job",
  "_schema": "/restapi/schemav1/jobs",
  "_next": "/restapi/v1/job?pagecursor=42",
  "items": [
    {
      "id": 1,
      "title": "Développeur Full-Stack",
      "_self": "/restapi/v1/job/1"
    },
    {
      "id": 2,
      "title": "Chef de projet",
      "_self": "/restapi/v1/job/2"
    }
  ]
}
```

## Parcourir toutes les pages

### Algorithme de base

1. Effectuer la première requête
2. Traiter les `items` de la page
3. Vérifier si `_next` est présent et non vide
4. Si oui, requêter `_next` et retourner à l'étape 2
5. Si non, toutes les pages ont été parcourues

### Exemple en Python

```python theme={null}
import requests

def fetch_all_pages(url, auth):
    """Récupère tous les éléments d'une ressource paginée"""
    all_items = []

    while url:
        response = requests.get(url, auth=auth)
        data = response.json()

        if data.get('_status') != 'OK':
            break

        all_items.extend(data.get('items', []))
        url = data.get('_next', '')

    return all_items

# Utilisation
jobs = fetch_all_pages(
    'https://jobaffinity.fr/restapi/v1/job',
    auth=('login', 'password')
)
```

### Exemple en Shell

```bash theme={null}
#!/bin/bash

URL="https://jobaffinity.fr/restapi/v1/job"
AUTH="login:password"

while [ ! -z "$URL" ]; do
  RESPONSE=$(curl -s --basic --user "$AUTH" "$URL")

  # Traiter les items
  echo "$RESPONSE" | jq '.items[]'

  # Obtenir l'URL suivante
  URL=$(echo "$RESPONSE" | jq -r '._next // empty')
done
```

## Ressources paginées

Les ressources suivantes sont paginées :

* Collection de jobs (`/restapi/v1/job`)
* Collection de candidats (`/restapi/v1/candidate`)
* Collection de candidatures par job (`/restapi/v1/job/{id}/application`)
* Collection de candidatures par candidat (`/restapi/v1/candidate/{id}/application`)
* Collection des changements d'étapes (`/restapi/v1/step`)
* Collection des notes (`/restapi/v1/note`)
* Historique des webhooks (`/restapi/v1/webhook/task`)

## Ressources non paginées

Certaines ressources retournent toutes les données en une seule réponse :

* Détails d'un job (`/restapi/v1/job/{id}`)
* Détails d'un candidat (`/restapi/v1/candidate/{id}`)
* Détails d'une candidature (`/restapi/v1/application/{id}`)
* Équipe d'un job (`/restapi/v1/job/{id}/team`)
* Liste des processus (`/restapi/v1/process`)

<Tip>
  N'essayez pas de deviner la taille des pages ou de manipuler le curseur de pagination. Utilisez toujours l'URL fournie par `_next`.
</Tip>
