diff --git a/src/Controller/ApiLexiconController.php b/src/Controller/ApiLexiconController.php
index cec42ec1e2a6f72aadbf0225f4e2bd1d9d88f2ad..e2e2deffce7a4509ad49dd668427801c67983e82 100644
--- a/src/Controller/ApiLexiconController.php
+++ b/src/Controller/ApiLexiconController.php
@@ -128,4 +128,43 @@ class ApiLexiconController extends ApiBaseController
 
         return $this->createJsonResponse(200, ['message' => sprintf("La liste %s a été importée dans le lexique %s en mode %s", $graphyList, $lexicon, $importMode)]);
     }
+
+    /**
+     * Récupère un nombre n de graphies d’un lexique
+     *
+     * @Route("/extract/{nb}", name="api_lexicon_extract_graphies", methods={"GET"})
+     * @OA\Parameter(name="nb", in="path", description="nb de graphies retournées", @OA\Schema(type="integer"))
+     * @OA\Parameter(name="lexiconId", in="query", required=true, description="id du lexique dans lequel chercher", @OA\Schema(type="string"))
+     *
+     * @OA\Response(response=200, description="success", @OA\JsonContent(type="string"))
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     *
+     * @OA\Tag(name="Lexicons")
+     * @Security(name="OAuth2")
+     */
+    public function extractGraphies(Request $request, WiktionaryManager$wiktionaryManager, $nb): Response
+    {
+        $lexiconId = $request->get('lexiconId');
+        if (!$lexiconId) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Le paramètre lexiconId ets obligatoire")]);
+        }
+        $lexicon = $this->doctrine->getRepository(Lexicon::class)->find($lexiconId);
+        if (!$lexicon) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Pas de lexique trouvé pour cette Id")]);
+        }
+
+        $entries = $lexicon->getEntries()->toArray();
+        $graphies = [];
+        foreach ($entries as $entry) {
+            foreach ($entry->getHeadword()->getGraphies() as $graphy) {
+                $graphies[] = $graphy->getValue();
+            }
+        }
+        shuffle($graphies);
+        $selectedGraphies = array_slice($graphies, 0, $nb);
+
+        return $this->createJsonResponse(200, $selectedGraphies);
+    }
 }
diff --git a/src/Controller/ApiUserController.php b/src/Controller/ApiUserController.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1d07e8798d81da823dd6f12c4d20fd9c952768f
--- /dev/null
+++ b/src/Controller/ApiUserController.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Controller;
+
+use App\Entity\StudiedLanguage;
+use App\Entity\User;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Routing\Annotation\Route;
+use Nelmio\ApiDocBundle\Annotation\Security;
+use OpenApi\Annotations as OA;
+use Symfony\Component\Serializer\SerializerInterface;
+
+/**
+ * @Route("/api/user")
+ */
+class ApiUserController extends ApiBaseController
+{
+    /**
+     * Utilisée par une appli cliente pour lier un compte user au compte user balex correspondant grâce à l'IUID
+     *
+     * @Route("/details", name="api_user_details", methods={"GET"})
+     *
+     * @OA\Response(
+     *     response=200,
+     *     description="Success"
+     * )
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     * @OA\Tag(name="User")
+     * @Security(name="OAuth2")
+     */
+    public function userDetails(): Response
+    {
+        /** @var User $user */
+        $user = $this->getUser();
+        return $this->json([
+            'message' => 'You successfully authenticated!',
+            'email' => $user->getEmail(),
+            'uuid' => $user->getUuid(),
+            'pseudo' => $user->getPseudo(),
+        ]);
+    }
+
+    /**
+     * Si on précise la langue, retourne le niveau pour cette langue, sinon retourne tous les couples langue/niveau de l'utilisateur
+     *
+     * @Route("/level/{id}", name="api_user_level", methods={"GET"})
+     *
+     * @OA\Parameter(name="id", in="path", description="user id", @OA\Schema(type="string"))
+     * @OA\Parameter(name="language", in="query", description="langue pour laquelle on veut connaître le niveau", @OA\Schema(type="string"))
+     *
+     * @OA\Response(
+     *     response=200,
+     *     description="Success"
+     * )
+     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
+     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
+     * @OA\Tag(name="User")
+     * @Security(name="OAuth2")
+     */
+    public function getStudiedLanguages(SerializerInterface $serializer, Request $request, User $user): Response
+    {
+        if ($user === null) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Pas d'utilisateur trouvé pour cette Id")]);
+        }
+        $language = $request->get('language');
+        if ($language && !in_array($language, $this->getLanguages())) {
+            return $this->createJsonResponse(401, ['error' => sprintf("Pas de langue trouvée pour: %s", $language)]);
+        }
+
+        if ($language) {
+            $studiedLanguage = $this->doctrine->getRepository(StudiedLanguage::class)->findOneBy([
+                'user' => $user,
+                'language' => $language,
+            ]);
+            return $this->createJsonResponse(200, [$studiedLanguage->getLevel()]);
+        } else {
+            $content = $serializer->serialize($user->getStudiedLanguages(), 'json', ['groups' => ["studiedLanguage:read"]]);
+
+            return new JsonResponse($content, 200, [], true);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php
index 7ededc4210645bec69465e1763d4272be655f15b..e47379eaa560a7a13f70ee06af47390cd553e90a 100644
--- a/src/Controller/SecurityController.php
+++ b/src/Controller/SecurityController.php
@@ -11,33 +11,6 @@ use OpenApi\Annotations as OA;
 
 class SecurityController extends AbstractController
 {
-    /**
-     * Utilisée par une appli cliente pour lier un compte user au compte user balex correspondant grâce à l'IUID
-     *
-     * @Route("/api/user-details", name="app_user_details", methods={"GET"})
-     *
-     * @OA\Response(
-     *     response=200,
-     *     description="Success"
-     * )
-     * @OA\Response(response=401, description="error", @OA\JsonContent(type="string"))
-     * @OA\Response(response=403, description="error", @OA\JsonContent(type="string"))
-     * @OA\Response(response=500, description="error", @OA\JsonContent(type="string"))
-     * @OA\Tag(name="User")
-     * @Security(name="OAuth2")
-     */
-    public function userDetails(): Response
-    {
-        /** @var User $user */
-        $user = $this->getUser();
-        return $this->json([
-            'message' => 'You successfully authenticated!',
-            'email' => $user->getEmail(),
-            'uuid' => $user->getUuid(),
-            'pseudo' => $user->getPseudo(),
-        ]);
-    }
-
     /**
      * @Route("/logout", name="app_logout", methods={"GET"})
      */
diff --git a/src/Entity/Lexicon.php b/src/Entity/Lexicon.php
index 051501143c15176b1cc11ceaf361520f4151a83f..80fe18529edec312e6cc44382bba6c2612e8b575 100644
--- a/src/Entity/Lexicon.php
+++ b/src/Entity/Lexicon.php
@@ -158,9 +158,9 @@ class Lexicon
     }
 
     /**
-     * @return Collection<int, Entry>
-     */
-    public function getEntries(): Collection
+      * @return Collection|Entry[]
+      */
+    public function getEntries()
     {
         return $this->entries;
     }
diff --git a/src/Entity/StudiedLanguage.php b/src/Entity/StudiedLanguage.php
index 4f931ea801db68ab045e5b1f52479c807463459c..6b707ebcdc6969b51a844d509c21b64910b7b006 100644
--- a/src/Entity/StudiedLanguage.php
+++ b/src/Entity/StudiedLanguage.php
@@ -4,6 +4,7 @@ namespace App\Entity;
 
 use App\Repository\LabelRepository;
 use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Serializer\Annotation\Groups;
 
 /**
  * @ORM\Entity()
@@ -19,11 +20,13 @@ class StudiedLanguage
     private $id;
 
     /**
+     * @Groups({"studiedLanguage:read"})
      * @ORM\Column(type="string", length=100)
      */
     private $language;
 
     /**
+     * @Groups({"studiedLanguage:read"})
      * @ORM\Column(type="string", length=20)
      */
     private $level;