501 Not Implemented
A 501 Not Implemented is the calmest error in the 5xx family. Nothing crashed, nothing timed out, and no dependency fell over. The server simply does not do what you asked it to do, and it is telling you so plainly rather than failing while trying. That makes it the one server error where retrying is pointless by definition.
Updated August 2026 · 6 min read
-
Written by
Andrian Valeanu
Founder of Pulsetic
Andrian Valeanu founded Pulsetic and, before it, Designmodo. Across 15-plus years he has shipped web products, design tools, and monitoring software teams around the world rely on.
-
Reviewed by
Ionut Caval
Technical reviewer
Ionut Caval reviews Pulsetic's technical guides for accuracy. He works hands-on with web servers, networking, and uptime monitoring day to day, and makes sure the causes and fixes here hold up in production.
The short version: Work out which layer answered by bypassing your CDN or proxy and sending the same request to the origin, since edge layers reject unusual methods before your application sees them. If the origin returns it too, the server genuinely does not implement that method or header, so change the request. Do not retry: unlike other 5xx codes, nothing about a 501 is transient.
Key takeaways
- 501 Not Implemented means the server does not support the functionality needed to fulfil the request. It is the one 5xx that describes a limitation rather than a failure.
- It differs from 405 by scope. A 405 says the method is not allowed on that URL; a 501 says the server does not implement it anywhere, for anything.
- Unusually for a 5xx, RFC 9110 makes 501 heuristically cacheable, because a server that does not implement something will not implement it a second later.
- Do not retry it. Despite the 5xx status, nothing about the situation is transient, so retry logic should treat it like a client error and change the request instead.
- A proxy, CDN, or gateway can return 501 for a method your application would have handled perfectly well, which is why bypassing the edge is the fastest way to locate it.
- Error type
- HTTP 5xx server error
- Whose side
- The server, but as a limitation rather than a fault
- Fix difficulty
- Moderate
- Common cause
- The server does not support the required functionality
How did you find out this time?
Pulsetic is website uptime monitoring. It checks your URL from outside your network as often as every 30 seconds, confirms any failure from another region, then emails you.
10 monitors free, email alerts on failure and recovery. No credit card.
What does 501 Not Implemented mean?
A 501 Not Implemented tells the client that the server does not support the functionality required to fulfil the request. RFC 9110 gives it a specific role: it is the appropriate response when the server does not recognise the request method and cannot support it for any resource. That word "any" is what separates it from the neighbouring 405, which is per-resource. A 405 means the method exists on this server but not on this URL, and the response must name the methods that are allowed. A 501 makes a broader statement about the server's capabilities.
It also behaves unlike its neighbours in the 5xx range. Most server errors describe something that went wrong and might not go wrong next time, which is why retrying with backoff is the standard response to a 500, 502, 503, or 504. A 501 describes a permanent limitation, so retrying achieves nothing. RFC 9110 goes further and makes 501 heuristically cacheable by default, on the same logic. That is worth remembering when you implement the missing feature, because intermediaries may keep serving the cached 501 after the capability exists.
- 501
- HTTP status code
- 5xx
- Server-side error class, though this one describes a limitation rather than a failure
- Cacheable
- The only common 5xx that RFC 9110 makes heuristically cacheable by default
How the 501 Not Implemented error appears
The wording changes depending on your browser, device, or server. Here is how this error commonly shows up:
501
Not Implemented
The server does not support the functionality required.
501 Not ImplementedHTTP Error 501Error 501HTTP 501501 Not Implemented nginxThe server does not support the functionality required to fulfill the request
501 vs 405, 500 and 502
These are easy to conflate because all four come back when a request cannot be completed, but only one of them is about capability.
| Code | What it means | Who fixes it |
|---|---|---|
| 501 Not Implemented | The server does not support this functionality anywhere, for any resource. A permanent limitation, not a fault. | The website owner, by implementing it, or the caller, by using something supported. |
| 405 Method Not Allowed | The method is supported by the server but not permitted on this URL. The response lists what is. | The caller, by using an allowed method, or the owner, by adding it to the route. |
| 500 Internal Server Error | Something broke while handling the request. Transient in principle, so retrying is reasonable. | The website owner, by fixing the underlying fault. |
| 502 Bad Gateway | A proxy reached an upstream server which returned an invalid response. | The website owner, by fixing the upstream service. |
The 5xx codes, and which are worth retrying
They share a class but not a meaning, and the retry behaviour differs sharply between them.
| Code | What it means | Retry? |
|---|---|---|
500 Internal Server Error | Something broke while handling the request | Yes, with backoff |
501 Not Implemented | The server does not support this functionality | No, nothing will change |
502 Bad Gateway | An upstream server returned an invalid response | Yes, with backoff |
503 Service Unavailable | Temporarily unavailable, often deliberately | Yes, honour Retry-After |
504 Gateway Timeout | An upstream server did not answer in time | Yes, with backoff |
What causes 501 Not Implemented?
- A request method the server does not implement at all, such as
PATCHon an older stack or a WebDAV verb on a plain web server. - A reverse proxy, CDN, or corporate gateway that only forwards methods it recognises, rejecting the request before your application sees it.
- A
Transfer-Encodingthe server does not support, which produces a 501 even for an otherwise ordinary request. - An
Expectheader carrying a value the server does not recognise, most often100-continueagainst a server that does not implement it. - A stubbed handler: an endpoint present in routing whose implementation was generated as a placeholder and never written.
- A feature disabled at build or configuration time, so the code path exists but reports itself as unavailable.
- A misused status code, where the developer meant "not allowed on this resource" and should have returned 405 with an
Allowheader.
How to find the cause fast
- Send the same request to the origin, bypassing any CDN or proxy. A 501 that vanishes was generated at the edge rather than by your application.
- Try a simple
GETto the same URL. If that succeeds, the method is the problem; if it also returns 501, look at headers and framing instead. - Check the response body and server logs for which component answered, since proxies and applications phrase the error differently.
- Search the codebase for handlers that return 501 as a placeholder, which is a common pattern in generated or scaffolded code.
How 501 Not Implemented looks from the outside
A 501 is a normal HTTP response, so the connection opens, TLS completes, and an answer comes back promptly. An up-or-down check will report the service healthy while a whole category of requests is being refused. It is also asymmetric in a way that hides it: the GET a basic monitor sends is usually implemented perfectly well, so nothing looks wrong from the outside while writes or unusual methods fail. Because a 501 can be cached, the effect can also outlive its cause, continuing to be served after the capability was added. Checking the methods that matter, and asserting the status you expect, is what surfaces both.
To confirm the exact code a URL returns, or to re-test several at once after a fix, run them through the free bulk URL status checker.
How to fix 501 Not Implemented
If you are calling an API
- Use a method the server implements. If you need
PATCHand it is unsupported, aPUTwith the full representation is the usual alternative. - Do not retry the request unchanged. Unlike other 5xx codes, a 501 will not resolve itself, and retry loops only add load.
- Check whether an intermediary is responsible by sending the request directly to the origin if you can reach it.
- Look at your headers as well as your method, since an unsupported
Transfer-EncodingorExpectvalue produces a 501 on an otherwise ordinary request. - Consult the API documentation for which methods the endpoint actually supports, rather than assuming a full REST verb set.
If you run the website
- Return 405 with an
Allowheader when you mean "not allowed on this resource". Reserve 501 for functionality the server genuinely does not implement. - Check whether your proxy or CDN forwards the methods your API needs, since the edge commonly rejects
PATCHand less usual verbs by default. - Implement the missing capability, or document clearly that it is unsupported so callers stop attempting it.
- Remember the caching behaviour. After implementing a feature that previously returned 501, add explicit cache headers or expect intermediaries to keep serving the old response.
- Audit generated or scaffolded code for placeholder handlers that still return 501 in production.
- Log which component produced the response, so a 501 from the edge is distinguishable from one your application chose to return.
Still not fixed? Next steps
- Determine which layer answered. Bypass the CDN or reverse proxy and send the same request to the origin: a 501 that disappears was produced at the edge.
- Check whether the method is the problem at all. A 501 on an ordinary
GETusually points at a header the server cannot handle, such as an unsupportedTransfer-EncodingorExpect. - Look for stubbed handlers. Frameworks and generated code often return 501 as a placeholder for an endpoint that was routed but never implemented.
- Remember the caching behaviour when you fix one. A 501 can be cached by intermediaries, so a corrected endpoint may keep returning the old answer until caches expire.
- If you meant to say "not allowed here", return 405 with an
Allowheader instead. Using 501 for a per-resource restriction misleads every client that reads it.
Code & configuration
Copy-paste starting points. Replace example.com and the paths with your own, and test changes on staging before production.
Find out which layer answered
# through the edge
curl -i -X PATCH https://example.com/api/items/7
# HTTP/1.1 501 Not Implemented
# straight to the origin
curl -i -X PATCH http://10.0.0.5:8080/api/items/7
# 200 OK -> the proxy rejected it, not your application
Say "not here" with 405, not "not at all" with 501
// wrong: implies the server supports PATCH nowhere
http_response_code(501);
// right: this URL does not accept it, and here is what does
http_response_code(405);
header("Allow: GET, HEAD, PUT");
A cached 501 outlives the fix
# 501 is heuristically cacheable under RFC 9110, so send explicit
# headers if the answer is expected to change
Cache-Control: no-store
How to prevent 501 Not Implemented
A 501 answers quickly and cleanly, which is exactly why it hides: the server looks healthy, an ordinary GET still works, and only the requests that use the missing capability fail. Because the response can be cached by intermediaries, it can also keep being served after you have implemented the feature. Pulsetic checks your website and endpoints from multiple locations every 30 seconds and alerts you by email, SMS, voice call, Slack, Discord, Telegram, or webhook when a URL stops returning the status code you expect, so a category of requests failing silently becomes something you are told about.
Learn how Pulsetic's uptime monitoring detects this from the outside, across 15+ locations.
Sources and further reading
The specifications and vendor documentation this guide is written from, plus deeper reading on the parts it only summarises.
Frequently asked questions
-
What does 501 Not Implemented mean?
It means the server does not support the functionality required to fulfil your request. Most often that is the HTTP method: the server does not implement it for any resource, not merely for the URL you asked for. Nothing crashed and no dependency failed. The server is describing a limitation in what it can do, which is unusual for a 5xx code and changes how you should respond to it.
-
What is the difference between 501 and 405?
Scope. A 405 Method Not Allowed means the server supports the method but will not accept it on this particular URL, and the response is required to include an
Allowheader naming what the URL does accept. A 501 says the server does not implement the method anywhere at all. If you are the one returning the status, using 501 for a per-resource restriction misleads every client that reads it. -
Should I retry a 501 error?
No. It is the exception to the usual rule about 5xx codes. A 500, 502, 503, or 504 describes something that went wrong and might succeed on a second attempt, so retrying with backoff is sensible. A 501 describes a capability the server does not have, and it will not have acquired it a moment later. Retry logic should special-case it and change the request instead.
-
Why is a 501 cacheable?
Because RFC 9110 treats it as describing a permanent condition rather than a transient failure, and makes it heuristically cacheable by default. The reasoning is sound: a server that does not implement something will still not implement it on the next request. The practical consequence catches people out, though, since a cached 501 can continue to be served after you implement the feature. Send explicit cache headers if you expect the answer to change.
-
Can a proxy or CDN cause a 501?
Yes, and it is one of the more confusing versions of this error, because your application never sees the request. Reverse proxies, CDNs, and corporate gateways forward only the methods they understand, and
PATCHand WebDAV verbs are the ones most often rejected. Sending the same request directly to the origin, bypassing the edge, identifies the responsible layer in a single test. -
Why do I get a 501 on a normal GET request?
Because the method is not the only thing a server has to implement. A
Transfer-Encodingit does not support, or anExpectheader with a value it does not recognise, will produce a 501 on an otherwise unremarkable request. The other common explanation is a stubbed handler: an endpoint that exists in routing but whose implementation was scaffolded as a placeholder and never written. -
Does a 501 error affect SEO?
Only if it appears on pages you want indexed. Search engines crawl with
GET, which servers implement universally, so a well-configured website should never return 501 to a crawler. If it does, those pages cannot be indexed, and the caching behaviour makes it worse than an ordinary server error because the response may persist in intermediaries after the underlying problem is fixed. -
What is the difference between 501 Not Implemented and 405 Method Not Allowed?
The difference is scope. A 405 means the server knows the method and supports it elsewhere, it just will not accept it on that particular URL, and the response must list what the URL does accept. A 501 is global: the server does not implement that functionality anywhere, for any resource. In practice 405 is what you meet day to day, because it comes out of routing, while 501 tends to appear when an unusual method reaches a server that was never built to handle it.
-
Why is a 501 cacheable when other 5xx errors are not?
Because it describes a permanent limitation rather than a transient failure. RFC 9110 makes 501 heuristically cacheable by default, on the reasoning that a server which does not implement something will still not implement it a moment later, so there is nothing to gain by asking again. That is worth knowing when you fix one: a cached 501 can persist after the feature is implemented, so add explicit cache headers if you expect the answer to change.
-
Can a proxy return 501 for a request my server would have handled?
Yes, and it is a common source of confusing 501s. Reverse proxies, CDNs, and corporate gateways only forward the methods they understand, and an older or restrictively configured one will reject anything unusual before your application sees it.
PATCHand WebDAV verbs are the ones that most often run into this. Bypassing the proxy and hitting the origin directly is the quickest way to find out which layer answered. -
Should a client retry a 501?
No, not unchanged. Despite being a 5xx, a 501 is not transient: the server is stating it does not implement the functionality, and it will not have started implementing it on the retry. Treat it like a client error for retry purposes and change the request instead. This is the exception to the usual rule that 5xx responses are worth retrying with backoff, and retry logic that does not special-case it just generates noise.
-
Why did I get a 501 for a completely ordinary GET request?
Almost always because something other than the method was unsupported. Servers also return 501 when they cannot handle an aspect of how the request was framed, such as a
Transfer-Encodingthey do not implement, or anExpectheader carrying a value they do not recognise. It can also be a placeholder: an endpoint that exists in routing but whose handler was stubbed out and never written.
Trusted by teams at companies around the world
-
Catch the next outage before your visitors do.
2-minute setup · Cancel any time
-
No credit card needed