# The error simulator answers as each surface does: ?surface=key|api-public

- Date: 2026-11-01
- Type: Non-breaking change
- Surface: Developer portal and CLI
- What you need to do: Nothing.
- Address: https://developers.rivr.io/changelog/2026-11-01-error-simulator-per-surface

`GET /errors/simulate/<code>` now answers the way the chosen surface answers the code, as the code's page shows it: the surface's status, `Content-Type` and body, `Retry-After` with the catalogue's value where the surface sends one, and `Rivr-Should-Retry` on the organisation-key check. Choose the surface with `?surface=key` or `?surface=api-public`; without it, the code's first surface in that order answers, and a surface the code isn't answered on is a `400` `invalid_parameter`. Before, every code answered `application/problem+json` with its own status, and every code that can be sent again unchanged got `Retry-After: 1`, also where the real answer is plain JSON from /api/public, has another status or has another or no `Retry-After`. On the key check, `requestId` and `instance` are your call's own, and so is `traceId` in /api/public's ProblemDetails. `?succeedAfter=N` works on every surface as before.

