Setting the HTTP status in Dancer's before hook with the status keyword doesn't work with the exception of 301 and 302 (redirects).
To solve this problem, you can define first a special route for setting the HTTP status:
get '/bad_request' => sub { status 400; return 'Bad request.'; }
And advise Dancer to run this route from the before hook
on a certain condition:
hook before => sub { if (! param('customer_id')) { request->path_info('/bad_request'); } }