diff --git a/src/food-market.api/Infrastructure/Validation/ValidationFilter.cs b/src/food-market.api/Infrastructure/Validation/ValidationFilter.cs
new file mode 100644
index 0000000..aacf89a
--- /dev/null
+++ b/src/food-market.api/Infrastructure/Validation/ValidationFilter.cs
@@ -0,0 +1,43 @@
+using FluentValidation;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+
+namespace foodmarket.Api.Infrastructure.Validation;
+
+/// Action filter, который автоматически прогоняет
+/// по каждому body-параметру, для которого
+/// validator зарегистрирован в DI. На неуспех — возвращает 400 ValidationProblemDetails
+/// (стандартный формат RFC 7807, фронт уже знает как парсить ModelState).
+///
+/// Зачем не FluentValidation.AspNetCore: пакет официально deprecated
+/// (см. https://docs.fluentvalidation.net/en/latest/aspnet.html). Текущая
+/// рекомендация — ручная интеграция через DI + minimal filter. У нас тонкий
+/// слой, читается прозрачно.
+public sealed class ValidationFilter : IAsyncActionFilter
+{
+ private readonly IServiceProvider _sp;
+ public ValidationFilter(IServiceProvider sp) => _sp = sp;
+
+ public async Task OnActionExecutionAsync(ActionExecutingContext ctx, ActionExecutionDelegate next)
+ {
+ foreach (var (name, value) in ctx.ActionArguments)
+ {
+ if (value is null) continue;
+ // Ищем IValidator для рантайм-типа значения.
+ var validatorType = typeof(IValidator<>).MakeGenericType(value.GetType());
+ var validator = _sp.GetService(validatorType) as IValidator;
+ if (validator is null) continue;
+
+ var ctxV = new ValidationContext