diff --git a/backend/app/crud.py b/backend/app/crud.py
index 57d3c04439f71427113109accc186d84b9205319..3736f8043f9802fb4569c52526237137853cfc2b 100644
--- a/backend/app/crud.py
+++ b/backend/app/crud.py
@@ -179,6 +179,18 @@ def get_messages(db: Session, session_id: int, skip: int = 0):
     )
 
 
+def get_all_messages(db: Session, skip: int = 0):
+    return db.query(models.Message).offset(skip).all()
+
+
+def get_all_metadata(db: Session, skip: int = 0):
+    return db.query(models.MessageMetadata).offset(skip).all()
+
+
+def get_all_feedbacks(db: Session, skip: int = 0):
+    return db.query(models.MessageFeedback).offset(skip).all()
+
+
 def create_message(
     db: Session,
     message: schemas.MessageCreate,
diff --git a/backend/app/main.py b/backend/app/main.py
index 0071d39163de31d7e7f0510b724e1efd01df255e..82769b0190262702ca903c0fb5a5b18943eb860a 100644
--- a/backend/app/main.py
+++ b/backend/app/main.py
@@ -543,6 +543,79 @@ def download_session(
     )
 
 
+@sessionsRouter.get("/download/messages")
+def download_sessions_messages(
+    db: Session = Depends(get_db),
+    current_user: schemas.User = Depends(get_jwt_user),
+):
+    if not check_user_level(current_user, models.UserType.ADMIN):
+        raise HTTPException(
+            status_code=401,
+            detail="You do not have permission to download messages",
+        )
+
+    data = crud.get_all_messages(db)
+    output = StringIO()
+    writer = csv.writer(output)
+    writer.writerow(models.Message.__table__.columns.keys())
+    for row in data:
+        writer.writerow(row.raw())
+    output.seek(0)
+    return StreamingResponse(
+        output,
+        media_type="text/csv",
+        headers={"Content-Disposition": f"attachment; filename=messages.csv"},
+    )
+
+
+@sessionsRouter.get("/download/metadata")
+def download_sessions_metadata(
+    db: Session = Depends(get_db),
+    current_user: schemas.User = Depends(get_jwt_user),
+):
+    if not check_user_level(current_user, models.UserType.ADMIN):
+        raise HTTPException(
+            status_code=401,
+            detail="You do not have permission to download metadata",
+        )
+    data = crud.get_all_metadata(db)
+    output = StringIO()
+    writer = csv.writer(output)
+    writer.writerow(models.MessageMetadata.__table__.columns.keys())
+    for row in data:
+        writer.writerow(row.raw())
+    output.seek(0)
+    return StreamingResponse(
+        output,
+        media_type="text/csv",
+        headers={"Content-Disposition": f"attachment; filename=metadata.csv"},
+    )
+
+
+@sessionsRouter.get("/download/feedbacks")
+def download_sessions_feedbacks(
+    db: Session = Depends(get_db),
+    current_user: schemas.User = Depends(get_jwt_user),
+):
+    if not check_user_level(current_user, models.UserType.ADMIN):
+        raise HTTPException(
+            status_code=401,
+            detail="You do not have permission to download feedbacks",
+        )
+    data = crud.get_all_feedbacks(db)
+    output = StringIO()
+    writer = csv.writer(output)
+    writer.writerow(models.MessageFeedback.__table__.columns.keys())
+    for row in data:
+        writer.writerow(row.raw())
+    output.seek(0)
+    return StreamingResponse(
+        output,
+        media_type="text/csv",
+        headers={"Content-Disposition": f"attachment; filename=feedbacks.csv"},
+    )
+
+
 @sessionsRouter.post(
     "/{session_id}/users/{user_id}", status_code=status.HTTP_201_CREATED
 )
diff --git a/backend/app/models.py b/backend/app/models.py
index 9bead73f94d484e49f1b6e803bda34d507dea4c5..da304ed53dde54ff7d94cc6098b9f704e24272a8 100644
--- a/backend/app/models.py
+++ b/backend/app/models.py
@@ -151,6 +151,9 @@ class MessageMetadata(Base):
     message = Column(String)
     date = Column(Integer)
 
+    def raw(self):
+        return [self.id, self.message_id, self.message, self.date]
+
 
 class MessageFeedback(Base):
     __tablename__ = "message_feedbacks"
@@ -162,6 +165,9 @@ class MessageFeedback(Base):
     content = Column(String, default="")
     date = Column(DateTime, default=datetime_aware)
 
+    def raw(self):
+        return [self.id, self.message_id, self.start, self.end, self.content, self.date]
+
 
 class TestTyping(Base):
     __tablename__ = "test_typing"
diff --git a/frontend/src/lang/fr.json b/frontend/src/lang/fr.json
index ee50fe12993e082decb775762e7cee5f813f2701..eee4865522a74c44068d5c2aa041240617a58b6d 100644
--- a/frontend/src/lang/fr.json
+++ b/frontend/src/lang/fr.json
@@ -250,7 +250,10 @@
 				},
 				"success": "Questionnaire envoyé, merci !"
 			}
-		}
+		},
+		"downloadAllMessages": "Télécharger toutes les conversations",
+		"downloadAllMetadata": "Télécharger toutes les métadonnées",
+		"downloadAllFeedbacks": "Télécharger tous les feedbacks"
 	},
 	"button": {
 		"create": "Créer",
diff --git a/frontend/src/routes/admin/sessions/+page.svelte b/frontend/src/routes/admin/sessions/+page.svelte
index 611dc67e31eeb0b2f95c0c7719e776107c981232..d50db59d3bd4d476d6b20ab7f92fca747d2eb3a1 100644
--- a/frontend/src/routes/admin/sessions/+page.svelte
+++ b/frontend/src/routes/admin/sessions/+page.svelte
@@ -14,6 +14,32 @@
 	});
 </script>
 
+<h1 class="text-xl font-bold m-5 text-center">{$t('header.admin.sessions')}</h1>
+
+<div class="my-4 mx-auto">
+	<a
+		class="btn btn-primary btn-sm"
+		title="Download"
+		href={`${config.API_URL}/sessions/download/messages`}
+	>
+		{$t('session.downloadAllMessages')}
+	</a>
+	<a
+		class="btn btn-primary btn-sm"
+		title="Download"
+		href={`${config.API_URL}/sessions/download/metadata`}
+	>
+		{$t('session.downloadAllMetadata')}
+	</a>
+	<a
+		class="btn btn-primary btn-sm"
+		title="Download"
+		href={`${config.API_URL}/sessions/download/feedbacks`}
+	>
+		{$t('session.downloadAllFeedbacks')}
+	</a>
+</div>
+
 <table class="table">
 	<thead>
 		<tr>