Param-level applies the pipe to a single argument only. Handler-level (@UsePipes on the method) runs the pipe for all arguments of that handler. Controller-level applies to all handlers in the controller. Global applies to every request across the entire app. The global ValidationPipe is the standard for most apps.
Param-level — for transformation pipes like ParseIntPipe, ParseUUIDPipe on specific params.
Handler-level — when only some routes need validation with specific options.
Controller-level — when all routes in the controller share the same validation rules.
Global — for ValidationPipe in most apps; register via APP_PIPE for DI support.