La nouvelle API de GLPI 11 en pratique : OAuth2, du jeton au premier ticket

Nous avons testé l'API v2 de GLPI 11 de bout en bout : client OAuth, jeton, création, mise à jour et suivi d'un ticket, filtre RSQL et GraphQL. Les trois détails qui donnent un 403 avec un jeton valide, et une collection Postman testée à télécharger.

Dans cet article7 sections

GLPI 11 dispose de deux API : l'ancienne, que GLPI lui-même appelle désormais "API historique", et une nouvelle, avec OAuth2, GraphQL et une documentation interactive. Nous avons testé la nouvelle de bout en bout : du jeton au ticket ouvert, mis à jour et doté d'un suivi. Le premier accroc est arrivé avant même le moindre ticket : GLPI a délivré le jeton normalement, puis a tout refusé avec "The High-Level API is disabled". Ce guide présente le chemin qui a fonctionné, avec la collection Postman testée à télécharger.

L'API historique fonctionne toujours et c'est celle que nous utilisons dans le serveur MCP qui relie Claude à GLPI. Pour les nouvelles intégrations, GLPI lui-même recommande la nouvelle.

Les deux API de GLPI 11

API historique (v1) Nouvelle API (v2)
Adresse /apirest.php ou /api.php/v1 /api.php/v2.3 (version actuelle)
Authentification App-Token + jeton de l'utilisateur, puis Session-Token OAuth2 (jeton Bearer)
Format Éléments GLPI tels qu'ils sont en base de données Ressources organisées (/Assistance/Ticket, /Assistance/Ticket/{id}/Timeline)
Recherche Critères de la recherche GLPI Filtre RSQL (name=like=*toner*) et pagination dans l'en-tête
Extras — GraphQL et documentation interactive sur /doc
Statut GLPI prévient : "il est recommandé de n'utiliser que la nouvelle API lorsque c'est possible" Recommandée pour tout nouveau projet

Étape 1 : activer la nouvelle API

Dans Configuration > Générale > API, activez Activer l'API. Cette option est distincte de celle qui active l'API historique.

Lors de notre test, avec cette option désactivée, la demande de jeton a fonctionné : GLPI a renvoyé un jeton valable une heure. Ce n'est qu'au premier appel qu'est apparue l'erreur "The High-Level API is disabled". Si le jeton est délivré et que tout renvoie 403, commencez par là.

Étape 2 : l'utilisateur de service et le client OAuth

  1. Utilisateur de service : un compte dédié à l'intégration, avec le profil minimal dont elle a besoin, dans la bonne entité. Jamais un administrateur.
  2. Client OAuth (dans Configuration > Clients OAuth) :
  3. Autorisations : password pour le système à système avec l'utilisateur de service ; authorization_code lorsque l'application agit au nom de chaque personne qui se connecte ; client_credentials est utilisé par les agents d'inventaire.
  4. Portées : api pour l'API, graphql pour GraphQL, user et email pour les données de l'utilisateur lui-même, inventory et status pour des usages spécifiques. N'accordez que ce que l'intégration utilise.
  5. IP autorisées : limitez-les au serveur qui appellera l'API.

GLPI génère l'identifiant et le secret du client. Conservez-les tous les deux dans un coffre-fort, pas dans le code.

Étape 3 : du jeton au ticket

Demander le jeton (valable 1 heure, avec jeton de rafraîchissement) :

curl -X POST https://glpi.suaempresa.com.br/api.php/token \
  -d grant_type=password -d client_id=$CLIENT_ID -d client_secret=$CLIENT_SECRET \
  -d username=$USUARIO -d password=$SENHA -d scope="api graphql"

Ouvrir un ticket :

curl -X POST https://glpi.suaempresa.com.br/api.php/v2.3/Assistance/Ticket \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"name": "Impressora do 2o andar sem toner", "content": "Aberto pela API v2.", "urgency": 3, "type": 1}'

Le reste du parcours que nous avons testé :

Résultat de chaque étape du test de la nouvelle API : avec Activer l'API désactivé, le jeton est délivré et les appels renvoient 403 ; jeton, création, lecture, PATCH et suivi fonctionnent ; une portée non autorisée provoque un 403 sur la route
Si le jeton fonctionne et que tout renvoie 403, vérifiez l'option Activer l'API et les portées du client OAuth. Test NexTool, 4 octobre 2026.
Action Appel Résultat du test
Jeton POST /api.php/token Bearer, 1 heure, avec refresh, en 0,3 à 0,4 s
Ouvrir un ticket POST /v2.3/Assistance/Ticket 200, renvoie l'id
Lire GET /v2.3/Assistance/Ticket/{id} Le statut arrive déjà avec son nom ("Novo")
Modifier l'urgence PATCH /v2.3/Assistance/Ticket/{id} 200, la priorité est recalculée
Suivi POST /v2.3/Assistance/Ticket/{id}/Timeline/Followup 200
Chronologie GET /v2.3/Assistance/Ticket/{id}/Timeline Liste avec le suivi
Rechercher GET /v2.3/Assistance/Ticket?filter=name=like=*toner* Total dans l'en-tête Content-Range
GraphQL POST /v2.3/GraphQL Uniquement les champs demandés, avec pagination
Renouveler POST /api.php/token avec refresh_token Nouveau jeton sans redemander le mot de passe
Sans jeton n'importe quelle route 401

Trois détails qui piègent

  1. L'option "Activer l'API" est distincte de l'API historique, et le jeton est délivré même lorsque l'API est désactivée. L'erreur n'apparaît qu'ensuite.
  2. Une portée demandée mais non autorisée ne provoque pas d'erreur sur le moment. Nous avons demandé la portée user sur un client qui ne l'avait pas : le jeton est arrivé quand même, sans cette portée, et la route de l'utilisateur a répondu 403. Si une route renvoie 403 avec un jeton valide, vérifiez les portées du client.
  3. Le statut arrive sous forme d'objet ({"id": 1, "name": "Novo"}), et non de nombre. Ceux qui migrent depuis l'API historique doivent adapter le code qui lisait le statut.

Quand utiliser l'une ou l'autre

  • Nouvelle intégration : la nouvelle API. OAuth est le standard du marché, les ressources sont plus claires et la documentation se trouve dans GLPI lui-même.
  • Intégration qui fonctionne déjà avec l'API historique : rien ne presse, mais planifiez la migration. GLPI affiche déjà l'avertissement invitant à utiliser la nouvelle.
  • Application qui agit au nom de plusieurs personnes (un portail, une app) : authorization_code, pour que chaque personne donne son autorisation avec ses propres identifiants.
  • Tâche serveur (n8n, ERP, script) : password avec un utilisateur de service et une IP restreinte.

Téléchargez la collection testée

La collection Postman de l'API de GLPI 11 contient les neuf appels du tableau, avec le jeton et l'id du ticket enregistrés automatiquement d'un appel à l'autre. Renseignez l'adresse de votre GLPI, le client OAuth et l'utilisateur de service.


Test réalisé par NexTool le 4 octobre 2026, sur un GLPI 11.0.7 de test (API v2.3), avec un utilisateur de service et un client OAuth créés pour le test et supprimés à la fin. Les routes et les portées ont également été vérifiées dans le code source de GLPI 11.

Questions fréquentes

Oui. En plus de l'API historique (v1), GLPI 11 propose une nouvelle API sur /api.php/v2.3, avec OAuth2, des ressources structurées, des filtres RSQL, GraphQL et une documentation interactive sur /doc.

Les causes les plus fréquentes : l'option Activer l'API désactivée dans Configuration > Générale > API (le jeton est quand même délivré) et le client OAuth sans la portée exigée par la route.

Créez un client OAuth dans Configuration > Clients OAuth avec l'autorisation password et la portée api, puis faites un POST sur /api.php/token avec client_id, client_secret et les identifiants du compte de service. Le jeton Bearer dure 1 heure et peut être renouvelé.

Elle fonctionne toujours dans GLPI 11, mais GLPI recommande lui-même de n'utiliser que la nouvelle API lorsque c'est possible. Utilisez la v2 pour les nouvelles intégrations et planifiez la migration des existantes.

password avec un compte de service pour les intégrations serveur ; authorization_code quand l'application agit au nom de chaque personne ; client_credentials est utilisé par les agents d'inventaire.

Commentaires

Les commentaires de cet article proviennent de GitHub (giscus). En les chargeant, votre navigateur se connecte à GitHub, qui reçoit votre adresse IP et peut enregistrer ses propres cookies.

Pour les charger automatiquement, activez les cookies fonctionnels

Besoin d'aide ?