diff --git a/backend/API/Filters/FluentValidationFilter.cs b/backend/API/Filters/FluentValidationFilter.cs
new file mode 100644
index 0000000..58d89f0
--- /dev/null
+++ b/backend/API/Filters/FluentValidationFilter.cs
@@ -0,0 +1,69 @@
+using FluentValidation;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+
+namespace Extrudex.API.Filters;
+
+///
+/// Action filter that automatically validates request DTOs using FluentValidation
+/// validators registered in DI. Runs before the controller action executes.
+/// Returns 400 Bad Request with validation errors if validation fails.
+///
+public class FluentValidationFilter : IAsyncActionFilter
+{
+ private readonly IServiceProvider _serviceProvider;
+ private readonly ILogger _logger;
+
+ public FluentValidationFilter(IServiceProvider serviceProvider, ILogger logger)
+ {
+ _serviceProvider = serviceProvider;
+ _logger = logger;
+ }
+
+ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+ {
+ foreach (var argument in context.ActionArguments.Values)
+ {
+ if (argument is null) continue;
+
+ var argumentType = argument.GetType();
+ var validatorType = typeof(IValidator<>).MakeGenericType(argumentType);
+
+ // Try to resolve a validator for this argument type
+ var validator = _serviceProvider.GetService(validatorType) as IValidator;
+ if (validator is null) continue;
+
+ _logger.LogDebug("Validating {Type} with {Validator}", argumentType.Name, validator.GetType().Name);
+
+ var validationResult = await validator.ValidateAsync(
+ new ValidationContext