← Documentation/ api / users

Users API

Une base déterministe de 50 utilisateurs (toujours les mêmes pour faciliter tes tests). Couvre tout le cycle CRUD : lister, lire un détail, créer, mettre à jour, supprimer. La pagination renvoie `total_pages`, `has_next` et même un objet `links` façon HATEOAS — parfait pour t'entraîner à boucler sur les pages dans Make ou n8n.

Authentification

Appel anonyme (autorisé en mode pédagogique)

Lister les utilisateurs

#

Récupère la liste paginée des utilisateurs (50 au total).

GET/api/users

Retourne une page d'utilisateurs avec une pagination complète : `total`, `total_pages`, `has_next`, `next_page` et un objet `links` (next/prev/first/last). Utilise `total_pages` comme **page max** pour ta boucle d'automatisation. Si tu demandes une page > total_pages, l'API te renvoie automatiquement la dernière page valide.

Paramètres de requête
pagenumberoptionnel

Page demandée (1 → total_pages). Plafonnée automatiquement.

Défaut : 1

per_pagenumberoptionnel

Nombre d'utilisateurs par page (1–50).

Défaut : 10

Tester dans le playground
curl -X GET 'https://otter-api-playground.lovable.app/api/users'
/ sans curl — make & n8ncopier champ par champ
Method
GET
URL (paste-ready)
https://otter-api-playground.lovable.app/api/users?page=1&per_page=10
URL sans query params
https://otter-api-playground.lovable.app/api/users

utile si tu actives « Send Query Parameters » dans n8n / le toggle Map de Make

Query parameters2 champs
  • page(optionnel)
    Page demandée (1 → total_pages). Plafonnée automatiquement.
    1
  • per_page(optionnel)
    Nombre d'utilisateurs par page (1–50).
    10

Ajoute-les un par un dans l'onglet Query parameters.

Liste paginée d'utilisateurs avec métadonnées de pagination.
{
  "page": 1,
  "per_page": 10,
  "total": 50,
  "total_pages": 5,
  "has_next": true,
  "has_prev": false,
  "next_page": 2,
  "prev_page": null,
  "links": {
    "self": "https://otter-api-playground.lovable.app/api/users?page=1&per_page=10",
    "first": "https://otter-api-playground.lovable.app/api/users?page=1&per_page=10",
    "last": "https://otter-api-playground.lovable.app/api/users?page=5&per_page=10",
    "next": "https://otter-api-playground.lovable.app/api/users?page=2&per_page=10",
    "prev": null
  },
  "data": [
    {
      "id": 1,
      "nom": "Martin",
      "prenom": "Sophie",
      "email": "sophie.martin@loutre.me",
      "pays": "France",
      "ville": "Lyon",
      "age": 32,
      "profession": "Développeuse"
    }
  ]
}

Récupérer un utilisateur

#

Récupère un utilisateur par son identifiant.

GET/api/users/:id

Renvoie un seul utilisateur. Si l'identifiant n'existe pas, retourne 404 avec un message explicite. Les IDs valides vont de 1 à 50.

Paramètres de chemin
idnumberrequis

Identifiant de l'utilisateur (1 à 50).

Tester dans le playground
curl -X GET 'https://otter-api-playground.lovable.app/api/users/3'
/ sans curl — make & n8ncopier champ par champ
Method
GET
URL (paste-ready)
https://otter-api-playground.lovable.app/api/users/3
Utilisateur trouvé.
{
  "id": 3,
  "nom": "Dubois",
  "prenom": "Lucas",
  "email": "lucas.dubois@loutre.me",
  "pays": "Belgique",
  "ville": "Bruxelles",
  "age": 28,
  "profession": "Designer UX"
}

Créer un utilisateur

#

Crée un nouvel utilisateur (echo + id généré).

POST/api/users

Reçoit un body JSON et renvoie l'utilisateur créé avec un `id` et un `createdAt`. Les données ne sont pas réellement persistées : l'API rejoue ton input pour que tu puisses tester ton intégration sans risque.

Body JSON
prenomstringrequis

Prénom.

nomstringrequis

Nom de famille.

emailstringoptionnel

Adresse email.

paysstringoptionnel

Pays.

agenumberoptionnel

Âge.

professionstringoptionnel

Métier.

Tester dans le playground
curl -X POST 'https://otter-api-playground.lovable.app/api/users' \
  -H 'Content-Type: application/json' \
  -d '{
  "prenom": "Marie",
  "nom": "Dupont",
  "email": "marie.dupont@loutre.me",
  "pays": "France",
  "age": 28,
  "profession": "Designer"
}'
/ sans curl — make & n8ncopier champ par champ
Method
POST
URL (paste-ready)
https://otter-api-playground.lovable.app/api/users
Headers1 champ
  • Content-Type
    application/json

Active « Send Headers » (n8n) ou le toggle Headers (Make), puis ajoute chaque paire Name/Value.

Body — JSON (raw)
{
  "prenom": "Marie",
  "nom": "Dupont",
  "email": "marie.dupont@loutre.me",
  "pays": "France",
  "age": 28,
  "profession": "Designer"
}

Make : Body content type → JSON (application/json). n8n : Send Body ✅ → Body Content Type JSON → Using JSON.

Utilisateur créé.
{
  "id": 1735689600000,
  "prenom": "Marie",
  "nom": "Dupont",
  "email": "marie.dupont@loutre.me",
  "createdAt": "2026-01-01T12:00:00.000Z"
}

Mettre à jour un utilisateur

#

Met à jour un utilisateur (echo).

PUT/api/users/:id

Renvoie l'utilisateur mis à jour. Comme pour POST, rien n'est réellement persisté — c'est volontaire pour que les étudiants puissent tester sans casser quoi que ce soit.

Paramètres de chemin
idnumberrequis

Identifiant de l'utilisateur.

Body JSON
prenomstringoptionnel

Nouveau prénom.

villestringoptionnel

Nouvelle ville.

Tester dans le playground
curl -X PUT 'https://otter-api-playground.lovable.app/api/users/3' \
  -H 'Content-Type: application/json' \
  -d '{
  "ville": "Paris",
  "profession": "Lead Designer"
}'
/ sans curl — make & n8ncopier champ par champ
Method
PUT
URL (paste-ready)
https://otter-api-playground.lovable.app/api/users/3
Headers1 champ
  • Content-Type
    application/json

Active « Send Headers » (n8n) ou le toggle Headers (Make), puis ajoute chaque paire Name/Value.

Body — JSON (raw)
{
  "ville": "Paris",
  "profession": "Lead Designer"
}

Make : Body content type → JSON (application/json). n8n : Send Body ✅ → Body Content Type JSON → Using JSON.

Utilisateur mis à jour.
{
  "id": 3,
  "ville": "Paris",
  "profession": "Lead Designer",
  "updatedAt": "2026-01-01T12:00:00.000Z"
}

Supprimer un utilisateur

#

Supprime un utilisateur (no-op pédagogique).

DELETE/api/users/:id

Retourne 204 No Content. Aucune donnée n'est supprimée côté serveur, mais ton client recevra exactement la réponse d'une vraie API REST.

Paramètres de chemin
idnumberrequis

Identifiant à supprimer.

Tester dans le playground
curl -X DELETE 'https://otter-api-playground.lovable.app/api/users/3'
/ sans curl — make & n8ncopier champ par champ
Method
DELETE
URL (paste-ready)
https://otter-api-playground.lovable.app/api/users/3
Suppression confirmée — pas de body.
(no body)

Guides

Comprendre la pagination

Les endpoints liste acceptent page (défaut 1) et per_page (défaut 10, max 50). La réponse contient toujours : page (page actuelle), per_page, total (nombre total d'éléments), total_pages (la page max — utilise-la comme borne de boucle), has_next / has_prev (booléens), next_page / prev_page (numéros ou null), links (URLs prêtes à l'emploi pour next/prev/first/last) et data (le tableau d'utilisateurs).

Configurer un nœud HTTP Request dans n8n

Étape par étape pour appeler /api/users depuis n8n et boucler sur toutes les pages :

1. Crée un nœud `HTTP Request`

  • Method : GET
  • URL : https://otter-api-playground.lovable.app/api/users
  • Authentication : None (ou Generic Credential Type → Header Auth → Name X-API-Key, Value demo-key si tu veux t'entraîner avec une clé)
  • Send Query Parameters : ✅ active-le, puis ajoute deux paramètres :
  • Name page, Value 1 (ou ={{ $json.next_page }} si tu boucles, voir étape 3)
  • Name per_page, Value 10
  • Options → Response → Response Format : JSON

2. Lis la réponse
Le body parsé contient total_pages (la page max), has_next (booléen) et data (tableau). Connecte un nœud Set ou utilise directement ={{ $json.data }} pour itérer sur les utilisateurs.

3. Boucler page par page (la vraie astuce)
La méthode propre dans n8n :
• Ajoute un nœud Loop Over Items (ou utilise Split In Batches).
• Avant la boucle, crée un nœud Code qui fait un premier appel pour récupérer total_pages et génère un tableau [{page:1},{page:2}, ..., {page:N}].
• Dans la boucle, ton nœud HTTP Request utilise ={{ $json.page }} comme valeur du paramètre page.
• À chaque itération tu obtiens un data de 10 lignes — pousse-les dans Airtable / Google Sheets / ta base.

4. Alternative plus simple : pagination intégrée n8n
Dans le nœud HTTP Request, ouvre Options → Pagination et configure :
• Pagination Mode : Update a Parameter in Each Request
• Type : Query Parameter
• Name : page
• Value : ={{ $pageCount + 1 }}
• Pagination Complete When : Other → expression ={{ $response.body.has_next === false }}
• Limit Pages Fetched : laisse vide ou mets total_pages comme garde-fou.
n8n boucle alors automatiquement et te concatène toutes les pages.

Pas de persistance

Les méthodes POST/PUT/DELETE renvoient des réponses réalistes mais ne modifient rien. C'est conçu pour s'entraîner sans risque.