
Je stuurt een request. De URL klopt, de server draait, er is geen foutmelding zoals 404 of 500. Maar toch komt er niets terug. Geen bruikbare content, alleen een foutcode: 406 Not Acceptable.
De server wil wel antwoorden, maar niet op de manier die jij vraagt. De inhoud is er, maar je krijgt ’m niet. Niet omdat hij ontbreekt, maar omdat hij in het verkeerde formaat zit, volgens jouw eigen voorwaarden.
De http 406 foutmelding is technisch gezien geen blokkade, maar een misverstand. De client geeft aan welke contenttypes hij accepteert, en de server zegt: daar kan ik niet aan voldoen.
Wat gebeurt er bij een 406 precies?
Een 406 status code ontstaat als de client via een Accept header beperkingen oplegt aan de vorm waarin een antwoord geleverd moet worden, en de server geen geschikte variant kan terugsturen.
Denk aan een verzoek dat alleen application/json accepteert, terwijl de server alleen HTML of XML aanbiedt. Of een taalinstelling zoals Accept-Language: fr-FR, terwijl de site geen Franse content heeft.
De server snapt het verzoek, en wíl iets teruggeven. Maar geen van de beschikbare representaties voldoet aan wat de client verwacht. En dus weigert de server, volgens de regels van het protocol.
In de praktijk komt dat vooral voor in API’s, headless omgevingen of apps waar content negotiation een rol speelt. Op gewone websites zie je het zelden.
Hoe herken je een 406?
De browser laat het meestal niet expliciet zien. Soms krijg je een blanco pagina, soms een generieke foutmelding. Maar onder water is de statuscode helder:
HTTP/1.1 406 Not Acceptable
Via tools zoals curl kun je het direct oproepen:
curl -H “Accept: application/xml” https://voorbeeld.nl/data
Of gebruik je netwerkconsole in Chrome of Firefox. Laad de pagina, kijk naar de response, en je ziet de code staan.
Wat veroorzaakt een http 406 fout?

Vaak begint het bij de client. Als die te strikt is in wat ‘ie accepteert, sluit je representaties uit die de server wél had kunnen leveren.
Soms is het een bewuste instelling, bijvoorbeeld in een fetch request of bij een API-call. Maar het kan ook automatisch gebeuren, bijvoorbeeld door een bibliotheek die standaard bepaalde headers meestuurt.
Aan de andere kant kan ook de server beperkt zijn in wat hij aanbiedt. Een legacy systeem dat alleen XML terugstuurt. Of een endpoint dat alleen Nederlands ondersteunt, terwijl de client Frans vraagt.
In sommige setups zit er nog een proxy of firewall tussen die contenttypes blokkeert. Ook die kan een 406 status code veroorzaken.
Hoe los je een 406 foutmelding op?
Er is geen universele oplossing, het hangt af van wie het probleem veroorzaakt.
Als client:
- Wees minder strikt in wat je accepteert. Gebruik Accept: */* als je geen specifieke voorkeur hebt.
- Controleer of je headers wel nodig zijn, en pas ze aan waar mogelijk.
Als server:
- Ondersteun meer representaties, of stel een default in.
- Voeg content negotiation toe als dat ontbreekt.
- Wees duidelijk in je responses: geef aan wat je wél kunt leveren.
De kern: zorg dat er overlap is tussen wat wordt gevraagd en wat beschikbaar is.
Tot slot
De http 406 fout zegt niet dat de content ontbreekt, of dat de server stuk is. Hij zegt: “ik heb het, maar niet in de vorm die jij vraagt.” Het is geen infrastructuurprobleem, maar een communicatief conflict.
De 406 status code dwingt je om goed te kijken naar wat je verstuurt, en wat je terug wilt krijgen. In moderne API’s, headless CMS’en en slimme frontends is dat geen randverschijnsel meer, maar iets wat integraal bij het ontwerp hoort.
Begrijp je fout, en je lost ’m meestal snel op. Begrijp je hem niet, dan blijf je zoeken naar iets wat er al is, maar buiten bereik ligt.