406 Not Acceptable

HTTP response status code 406 Not Acceptable is a client error that is returned by the server to indicate that the resource exists but the proactive Content Negotiation engaged in by the client using a relevant HTTP request header was not satisfiable and the server does not supply a default in lieu.

Usage

When the 406 Not Acceptable error message is received, it is in response to an HTTP request that includes a negation-related header such as Accept or Accept-Language. When the client includes one or more of these headers, the server will satisfy the requirements if possible.

The most common HTTP Accept headers are:

  • Accept: Specifies the type of content. For example, a server may be willing to supply either plain text or an HTML representation. In the example, the client prefers HTML but is willing to accept plain text.

    Accept: text/html, text/plain

  • Accept-Charset: Specifies the character set, which allows for special-purpose character sets to be requested of a server that supports them. In the example, the client is requesting UTF-8 be the character set used for the response.

    Accept-Charset: UTF-8

  • Accept-Datetime: The client uses this header to indicate that it wants a past state of this resource, as specified by the date. In the example, the client is requesting a copy of the resource that was available on January 1st, 2021.

    Accept-Datetime: Fri, 1 Jan 2021 00:00:00 GMT

  • Accept-Encoding: Specifies the encodings that the client is willing to accept. In the example, the client indicates that it can handle Compression, such as gzip.

    Accept-Encoding: gzip

In practice, this error is rarely used because the server supplies a default representation instead. The rationale is that it assumes that the client will prefer something over nothing. However, when the 406 Not Acceptable response is returned, the message body will contain a list of available representations that the client can choose from.

Note

Search engines like Google will not index a URL with 406 Not Acceptable response status, and consequently, URLs that have been indexed in the past but are now returning this HTTP status code will be removed from the search results.

Example

In the example, the client requests a resource in the French language but the server responds with the 406 Not Acceptable response because only German and English versions of the document are available.

Request

GET /news HTTP/1.1
Host: www.example.re
Accept-Language: fr

Response

HTTP/1.1 406 Method Not Acceptable
Content-Type: text/html
Content-Length: 242

<html>
  <head>
    <title>French Language Not Available</title>
  </head>
  <body>
   <p>Please choose a supported language:</p>
    <p><a href="/news/news-de.html">German</a></p>
    <p><a href="/news/news-en.html">English</a></p>
   </body>
</html>

Code references

.NET

HttpStatusCode.NotAcceptable

Rust

http::StatusCode::NOT_ACCEPTABLE

Rails

:not_acceptable

Go

http.StatusNotAcceptable

Symfony

Response::HTTP_NOT_ACCEPTABLE

Python3.5+

http.HTTPStatus.NOT_ACCEPTABLE

Java

java.net.HttpURLConnection.HTTP_NOT_ACCEPTABLE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_NOT_ACCEPTABLE

Angular

@angular/common/http/HttpStatusCode.NotAcceptable

Takeaway

The 406 Not Acceptable status code is a client error that is returned when the client-specified proactive negotiation requirements cannot be satisfied, and the server is unwilling to send a default representation.

See also

Last updated: August 2, 2023