code is the string to branch on; message is for humans; fields appears only on invalid_request and names each problem.
RialError: status, code, fields (paths in the camelCase you wrote), hint, and a message that already says what was wrong.
Codes
The SDK adds three of its own, with
status: 0: network_error (could not reach the API), timeout (no answer within timeoutMs) and aborted (you cancelled polling).
Field messages
fields[].path uses the wire names (steps.0.condition_aspects); the SDK reports the camelCase you wrote (steps.0.conditionAspects). Messages read the same everywhere:
is requiredmust be a list, got stringmust be one of: image, text, upload, video, choice, addressmust be at least 60,must have at most 6 items,must not be emptyhas unknown field: "webhook"must be a valid URL, including https://
Retries
Reads (GET) are safe to retry. The SDK retries them on network errors, 429 and 5xx with backoff. Writes are never retried automatically: a retried POST /v1/verifications mints a second verification. Dedupe on your own metadata if you must retry.