@StevenFisher es correcto. 409 Conflict es la respuesta correcta.
La solicitud no se pudo completar debido a un conflicto con el estado actual del recurso. Este código solo está permitido en situaciones en las que se espera que el usuario pueda resolver el conflicto y vuelva a enviar la solicitud. El cuerpo de respuesta DEBE incluir suficiente información para que el usuario reconozca el origen del conflicto. Lo ideal sería que la entidad de respuesta incluyera suficiente información para el usuario o agente de usuario para solucionar el problema; sin embargo, es posible que no sea y no es necesario.
Por ejemplo, un GET de encendido/podría decirle a un cliente que pueden crear los usuarios de la siguiente manera
HTTP/1.1 200 OK
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"/>
<password type="password" cardinality="required"/>
</create>
... other hypermedia controls, like search ...
</users>
Tras el control de hipermedia y tratando de crear un usuario con el nombre de usuario "Skylar Saveland" podría resultar en
HTTP/1.1 409 Conflict
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"
error="The username 'Skylar Saveland' is already taken. Please select another username"/>
<password type="password" cardinality="required"/>
</create>
... other hypermedia controls, like search ...
</users>
Del mismo modo, tratando de crear un usuario sin una contraseña podría resultar en
HTTP/1.1 409 Conflict
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"/>
<password type="password" cardinality="required"
error="A password must be specified"/>
</create>
... other hypermedia controls, like search ...
</users>
o puede que tenga varios errores, por ejemplo,
HTTP/1.1 409 Conflict
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"
error="The username 'Skylar Saveland' is already taken. Please select another username"/>
<password type="password" cardinality="required"
error="A password must be specified"/>
</create>
... other hypermedia controls, like search ...
</users>
NOTA: Una adecuada media type will need to be created para ir junto con lo anterior, que explicará la estructura de los controles de hipermedia (incluyendo el error de atributos en los formularios) y definir el significado de los diversos nombres de elementos (por ejemplo, usuarios, nombre de usuario, contraseña, etc.).
Iría con 409, "Conflicto". Pero no voy a afirmar que es la forma "correcta". :) –