# Versioning

The major version is in the path. Within `/v2` Lelemon only adds endpoints, optional fields, event types and error codes. Ignore what you do not know.

Webhook endpoints also carry an `apiVersion` (currently `2026-10-29`) that fixes the shape of the events they receive.

## Strict bodies

A request body with a field the route does not document is rejected with `400 unknown_field`, and `param` names the first unknown field; the detail lists up to ten. Free-form maps such as `metadata` keep accepting any key. Responses and events never reject anything: keep ignoring what you do not know there. A rejected body is not stored in the request log. Bodies over 1 MB answer `413 payload_too_large`. A body or a query string that nests objects or arrays more than 32 levels deep answers `400 invalid_request` with `param` set to `body` or `query`.

## Model ids

A model is named by a public id, `author/name`, such as `anthropic/claude-sonnet-4.6`. Read the list with `GET /v2/models` and send the id in `llmConfig.model` and `llmConfig.fallback.model`. Responses, usage, turns and events return the same id.

There is no `provider` field: it comes from the id, and sending it is a `400 unknown_field`. A model id that is not in `GET /v2/models`, such as an AWS id, answers `422 model_not_supported` and `param` names the field.

## Deprecations

Nothing in `/v2` is deprecated. When something is, the change is announced in the [changelog](/changelog) first, and until the date it takes effect the routes concerned answer with a `Lelemon-Warning` header that says what will change and when. Read that header in your logs to find the calls that need work before the date arrives.

v1 is deprecated. See [Moving from v1](/guides/migrate) and the [changelog](/changelog).
