
You send a request. The URL is correct, the server is running, there is no error message like 404 or 500. But still nothing comes back. No usable content, just an error code: 406 Not Acceptable.
The server wants to answer, but not in the way you ask. The content is there, but you don't get it. Not because it's missing, but because it's in the wrong format, according to your own terms.
The http 406 error message is technically not a block, but a misunderstanding. The client indicates which content types it accepts, and the server says: I can't comply with that.
What exactly happens in a 406?
A 406 status code occurs when the client imposes restrictions on the form in which a response should be delivered via an Accept header, and the server cannot return a suitable variant.
Consider a request that accepts only application/json, while the server offers only HTML or XML. Or a language setting such as Accept-Language: fr-FR, while the site has no French content.
The server understands the request, and wants to return something. But none of the available representations satisfy what the client expects. And so, according to the rules of the protocol, the server refuses.
In practice, this occurs mostly in APIs, headless environments or apps where content negotiation plays a role. On regular websites, you rarely see it.
How do you recognize a 406?
The browser usually doesn't show it explicitly. Sometimes you get a blank page, sometimes a generic error message. But underwater, the status code is clear:
HTTP/1.1 406 Not Acceptable
Through tools like curl, you can call it directly:
curl -H "Accept: application/xml" https://voorbeeld.nl/data
Or use your network console in Chrome or Firefox. Load the page, look at the response, and you'll see the code.
What causes an http 406 error?

Often it starts with the client. If it is too strict in what it accepts, you exclude representations that the server could have provided.
Sometimes it is a deliberate setting, for example in a fetch request or in an API call. But it can also happen automatically, for example by a library that sends certain headers by default.
On the other hand, the server may also be limited in what it offers. A legacy system that only returns XML. Or an endpoint that only supports Dutch, while the client requests French.
In some setups, there is another proxy or firewall in between that blocks content types. That, too, can cause a 406 status code.
How do you resolve a 406 error message?
There is no universal solution, it depends on who is causing the problem.
As a client:
- Be less strict about what you accept. Use Accept: */* if you don't have a specific preference.
- Check that your headers are necessary, and adjust them where possible.
As server:
- Support more representations, or set a default.
- Add content negotiation if it is missing.
- Be clear in your responses: state what you can deliver.
The bottom line: make sure there is overlap between what is requested and what is available.
In conclusion
The http 406 error does not say that the content is missing, or that the server is broken. It says, "I have it, but not in the form you request." It's not an infrastructure problem, but a communication conflict.
The 406 status code forces you to look carefully at what you are sending, and what you want to get back. In modern APIs, headless CMSs and smart frontends, this is no longer a fringe issue, but something integral to the design.
Understand your mistake, and you usually solve it quickly. Don't understand it, and you keep looking for something that is already there but out of reach.