diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts
index 6d2fdc8dd70e856207ecce63c57852ddca2fd1f3..f4cc9f320fa23dc772655a7c1a5ec58be99ae62d 100644
--- a/packages/api/src/database/queries/titres-etapes.queries.ts
+++ b/packages/api/src/database/queries/titres-etapes.queries.ts
@@ -64,7 +64,7 @@ import { CommuneId } from 'camino-common/src/static/communes'
 import { EtapeStatutId, etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts'
 import { contenuValidator, FlattenedContenu, heritageContenuValidator } from 'camino-common/src/etape-form'
 import { DemarcheTypeId, demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes'
-import { Effect, Match, Option, pipe } from 'effect'
+import { Effect, Option, pipe } from 'effect'
 import { CaminoError } from 'camino-common/src/zod-tools'
 import { callAndExit, shortCircuitError, zodParseEffectTyped } from '../../tools/fp-tools'
 import { TempDocumentName } from 'camino-common/src/document'
@@ -526,19 +526,7 @@ export const getDocumentsByEtapeId = (
   demarche: CanReadDemarche
 ): Effect.Effect<EtapeDocument[], CaminoError<GetDocumentsByEtapeIdErrors>> =>
   getEtapeDocumentLargeObjectIdsByEtapeId(titre_etape_id, pool, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeTypeId, demarche).pipe(
-    Effect.flatMap(result =>
-      zodParseEffectTyped(z.array(etapeDocumentValidator), result).pipe(
-        Effect.mapError(caminoError =>
-          Match.value(caminoError.message).pipe(
-            Match.when('Problème de validation de données', () => ({
-              ...caminoError,
-              message: errorParseGetDocumentsByEtapeId,
-            })),
-            Match.exhaustive
-          )
-        )
-      )
-    )
+    Effect.flatMap(result => zodParseEffectTyped(z.array(etapeDocumentValidator), result, errorParseGetDocumentsByEtapeId))
   )
 
 const getEtapesWithAutomaticStatutValidator = z.object({
diff --git a/packages/api/src/tools/fp-tools.ts b/packages/api/src/tools/fp-tools.ts
index 4fedc8aeacce18e2a3b76b2ee4b34c92e806ef3a..b670998c55db688ec376adf1c39af32f85ab9c74 100644
--- a/packages/api/src/tools/fp-tools.ts
+++ b/packages/api/src/tools/fp-tools.ts
@@ -3,8 +3,14 @@ import { Cause, Effect, Exit, pipe } from 'effect'
 import { ZodTypeAny } from 'zod'
 import { fromError, isZodErrorLike } from 'zod-validation-error'
 
+/**
+ * @deprecated use more precise message
+ */
 export type ZodUnparseable = 'Problème de validation de données'
 
+/**
+ * @deprecated use zodParseEffectTyped
+ */
 export const zodParseEffectCallback =
   <T extends ZodTypeAny>(validator: T) =>
   (value: unknown): Effect.Effect<T['_output'], CaminoError<ZodUnparseable>> =>
@@ -20,6 +26,9 @@ const zodErrorToDetail = (myError: unknown): string | undefined => {
   return undefined
 }
 
+/**
+ * @deprecated use zodParseEffectTyped
+ */
 export const zodParseEffect = <T extends ZodTypeAny>(validator: T, item: unknown): Effect.Effect<T['_output'], CaminoError<ZodUnparseable>> => {
   return Effect.try({
     try: () => validator.parse(item),
@@ -27,10 +36,10 @@ export const zodParseEffect = <T extends ZodTypeAny>(validator: T, item: unknown
   })
 }
 
-export const zodParseEffectTyped = <T extends ZodTypeAny>(validator: T, item: T['_output']): Effect.Effect<T['_output'], CaminoError<ZodUnparseable>> => {
+export const zodParseEffectTyped = <T extends ZodTypeAny, U extends string>(validator: T, item: T['_output'], errorMessage: U): Effect.Effect<T['_output'], CaminoError<U>> => {
   return Effect.try({
     try: () => validator.parse(item),
-    catch: myError => ({ message: 'Problème de validation de données', detail: zodErrorToDetail(myError), zodErrorReadableMessage: zodErrorToReadableMessage(myError) }),
+    catch: myError => ({ message: errorMessage, detail: zodErrorToDetail(myError), zodErrorReadableMessage: zodErrorToReadableMessage(myError) }),
   })
 }