Why does the percent sign in a URL cause an HTTP 400 Bad Request error?

Short answer

As per RFC 3986, a bare % character is not a valid URI syntax; it should be followed by two meaningful hexadecimal digits.

Long answer

The HTTP status code you got belongs to the 4xx class:

4xx: Client Error - The request contains bad syntax or cannot be fulfilled

Source: Hypertext Transfer Protocol (HTTP) Status Code Registry

In particular, code 400 is defined by the Internet Engineering Task Force (IETF) in RFC 2616:

10.4.1 400 Bad Request

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

Source: RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

Quoting Wikipedia (bold emphasis mine):

The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding).

Source: Percent-encoding - Percent-encoding in a URI

If you want to insert a literal % symbol, you need to use its percent-encoded representation: %25.

Further reading

  • List of HTTP status codes
  • Percent-encoding

The percent sign is for inserting a character that is normally not supported in the url. For example %20 is the same as a space.