Yes, as long as you respect the class — that is, 2xx for success, 4xx for Client error, etc. So you can return custom 4XX error codes (preferably those that are unassigned) for your own application’s error conditions.
To quote from [RFC 2616][1]:
“HTTP status codes are extensible. HTTP applications are not required
to understand the meaning of all registered status codes, though such
understanding is obviously desirable. However, applications MUST
understand the class of any status code, as indicated by the first
digit, and treat any unrecognized response as being equivalent to the
x00 status code of that class, with the exception that an
unrecognized response MUST NOT be cached. For example, if an
unrecognized status code of 431 is received by the client, it can
safely assume that there was something wrong with its request and
treat the response as if it had received a 400 status code.”
Class’
1xx: Informational – Request received, continuing process
2xx: Success – The action was successfully received,
understood, and accepted3xx: Redirection – Further action must be taken in order to
complete the request4xx: Client Error – The request contains bad syntax or cannot
be fulfilled5xx: Server Error – The server failed to fulfill an apparently
valid request [1]: