Error contract
Every error response from the widget’s API carries acode and a detail:
detail is a plain string, with one exception: when the request itself failed validation, detail is an object keyed by the field that failed instead — one array of messages per field, the same shape you’d get from any field-level validation error.
20000 is the only code that carries this shape today — every other code below always answers with a single string message.