# Machine-Readable Errors & Data Retention | Changelog

Source: https://wraps.dev/changelog/machine-readable-errors-and-data-retention

![Wraps Logo](https://wraps.dev/wraps-light-logo.png)![Wraps Logo](https://wraps.dev/wraps-dark-logo.png)

](https://wraps.dev/)

[](https://github.com/wraps-team/wraps)[Log in](https://app.wraps.dev/auth?mode=signin)[Sign up](https://app.wraps.dev/auth?mode=signup)

Toggle menu

[← All changes](https://wraps.dev/changelog)

APIAugust 2026

### Machine-Readable Errors & Data Retention

-   Every 4xx and 5xx body now carries a stable, enumerated `code` and a `requestId` alongside `error`. It comes from one response plugin, so all ~40 routes that return their own error object are covered rather than nearly all of them
-   The OpenAPI spec declares that shape as `ApiError` and attaches it to every operation. The `code` enum is derived from the handler’s own table, so the spec cannot drift from what the API emits
-   Rate-limited responses gain `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` and `RateLimit-Policy` next to the `X-` originals, which are kept. `Reset` is seconds remaining, and the quota headers describe whichever window is closest to exhaustion — the one actually pacing you
-   New `/docs/reference/versioning` states what counts as a breaking change and how a deprecation is announced
-   A nightly retention worker ages out `message_send` and `contact_event` rows against your plan’s visible window, with a 30-day grace period and a one-time owner and admin notification before anything is removed. It ships in dry-run: it reports what it would delete and deletes nothing
-   The unreachable per-org event volume block is retired, and the tracked-events definition is corrected everywhere agents read it: the docs, `llms.txt` and the generated `pricing.md`
-   wraps.dev serves a markdown representation of every page the three ways an agent actually asks for one, and sitemap entries carry a real `lastmod` instead of the current timestamp on every request

API v1.1
