Set or rotate the calling actor's own elevation PIN
Enrols (or rotates) the elevation PIN of the AUTHENTICATED caller. The subject is taken from the bearer token and is not a field you can send, so there is no request that sets somebody else’s PIN — that is the property the whole channel rests on: an elevation must prove who was physically present.
DO NOT CALL THIS AS AN AGENT. A PIN is a human’s second-factor credential for authorising money off a sale; an automated caller that writes one has either invented a secret nobody knows or been handed one it must not hold, and a rotation silently invalidates the PIN the real owner is using at the till. If a manager needs to enrol or rotate, they do it themselves. It is listed here so the surface is described, not so it is driven.
Behaviour, for completeness: the PIN must be at least six digits and not trivial (sequences and repeats are refused); a refusal is a 422 whose message names the RULE that failed (too_short, trivial, …) and NEVER echoes the submitted value. Success is 204 with no body. A rotation also clears any lockout on the account. The route rides the ordinary till scope pos.checkout.operate, which is deliberate and not a hole: a PIN on an account that holds no elevating scope elevates nothing. ERROR-ENVELOPE TRAP: the failure bodies keep the usual { error: { code, message, statusCode } } shape, but code here is a CHANNEL vocabulary, not the kernel ResultCode enum the shared ErrorResponse component lists. Expect values the schema does not enumerate and branch on them as opaque strings. A 429 is also reachable and is NOT in the documented response set.
Authorizations
Authorization: Bearer <token>. Accepts EITHER a Keycloak access token (scopes-in-token) OR an opaque POS session token; both resolve to the same pos.* scope vocabulary the route guards enforce.
Body
Response
The PIN was accepted and stored. No body is returned.
The PIN was accepted and stored. No body is returned.

