diff --git a/core/src/main/java/com/loremind/infrastructure/web/GlobalExceptionHandler.java b/core/src/main/java/com/loremind/infrastructure/web/GlobalExceptionHandler.java
new file mode 100644
index 0000000..77e1db2
--- /dev/null
+++ b/core/src/main/java/com/loremind/infrastructure/web/GlobalExceptionHandler.java
@@ -0,0 +1,97 @@
+package com.loremind.infrastructure.web;
+
+import jakarta.persistence.EntityNotFoundException;
+import jakarta.servlet.http.HttpServletRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Intercepteur global d'exceptions pour TOUS les @RestController.
+ *
+ *
Role :
+ *
+ * - Logger systematiquement les exceptions non gerees (avec stack trace + path)
+ * — evite d'avoir a creuser dans les logs Docker apres coup.
+ * - Renvoyer un JSON propre au client (`{error, type, ...}`) au lieu du 500 nu
+ * par defaut de Spring — utile pour debug cote frontend (visible directement
+ * dans la DevTools reseau).
+ * - Mapper les exceptions courantes vers des status HTTP appropries
+ * (IllegalArgumentException -> 400, EntityNotFoundException -> 404).
+ *
+ *
+ * Important : ne court-circuite PAS les try/catch locaux des controllers
+ * (ex: LicenseController.install catche InstallException -> 400 lui-meme).
+ * Ce handler n'attrape QUE ce qui a echappe au catch local.
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+ /**
+ * Violation d'invariant domaine (doublons, valeurs invalides, etc.) -> 400.
+ * Concentre ici la logique qui etait dupliquee dans GameSystemController.
+ */
+ @ExceptionHandler(IllegalArgumentException.class)
+ public ResponseEntity