type– A URI that identifies the error in the Lerian error catalog, built ashttps://errors.lerian.studio/v1/<code>. This URI repeatscode, so it does not separate two statuses that share one code.title– The HTTP status text (for example,Not Found).status– The HTTP status code.detail– A human-readable explanation for this occurrence. A500, aSILOC-0023, and aSILOC-0024replace the text withinternal error, so the internal cause stays inside the rail. The text varies per occurrence, and a403can carry the message the authorization service reported. Do not branch on it.code– The stable, machine-readable code (SILOC-NNNN). Dispatch on the pair ofstatusandcode, not oncodealone. One code can appear under more than one status, and each status needs a different action. For example,SILOC-0001is a 503 from the authorization gate and a 422 from a card operation. A request that fails schema validation carriesSILOC-0022, anderrorsnames the fields at fault.errors– An optional list of field-level details, each with thelocationit read, amessage, and thevaluefound there. A refusal from the authorization or idempotency gate carries an emptyviolationslist instead.
400, 413, 415: Request body refused
401: Unidentified caller
403: Refused caller
404: Not found
409: Conflicts
422: Validation errors
500: Server errors
503: Rail cannot answer
A 503 that carries
SILOC-0002 does not tell you the command was rejected. The rail answers with it both before the command runs and after it commits, so the command may already have taken effect. Reconcile the original request first. When you do retry, send the same X-Idempotency, and never retry under a new one.
