Custom Route Returns 301/Passing Variable from Input

Just a guess: Your regular expression 'verify/(?<voucher_code>)' is not correct. Have a look here. They are using e.g. (?P[a-zA-Z0-9-]+) there’s a P inside.
Another reason could be that you are missing a / before the verify. Try this:


function register_voucher_endpoint() {
    register_rest_route(
        'voucher',
        '/verify/(?P<voucher_code>[a-zA-Z0-9-]+)',
        array(
            'methods'=> 'POST',
            'callback'=>'verify_voucher'
        ));
}

[a-zA-Z0-9-] defines the regular expression group for this endpoint.

To answer question nr. 2: check the global $_POST array. There you should have an voucher-code entry which you can access with $_POST['voucher-code'].
I’m not 100% sure my answer is correct.