---
title: "Put Addon Languages"
method: PUT
path: "/v1/projects/{project_id}/feedback-addon/languages"
tags: ["feedback"]
---

# Put Addon Languages

`PUT /v1/projects/{project_id}/feedback-addon/languages`

## Request

- Base URL: `https://api.sonenta.dev`
- URL: `https://api.sonenta.dev/v1/projects/{project_id}/feedback-addon/languages`
- Auth: none declared

Replace the project's per-locale feedback-addon allowlist (task 837).

Validation:
  (a) the parent org's `feedback_addon.active` must be True — else 403.
  (b) every code must already exist in the project's `languages`
      collection — else 422 with the offending codes.
  (c) Starter SKU caps the list at 3 — else 422. Unlimited is unbounded.

RBAC: ProjectAdmin gate. Org-admin/owner auto-promote to project-admin
via rbac.project_role inheritance, so both pass.

Idempotent: a request whose normalized list equals the stored list
returns 200 with the current state and writes no audit row.

## Path parameters

- `project_id` string, required

## Request body

- FeedbackAddonLanguagesIn
  - `language_codes` string[]

## Response `200`

Successful Response

- FeedbackAddonStateOut: Resolved state of the End-User Eval add-on for ONE project. Composed of (a) the parent org's entitlement (`isActive`, `sku`) and (b) the project's per-locale allowlist (`enabledLanguages`, `languagesLimit`). `enabledLanguages` is the literal string `"all"` when the org has the Unlimited SKU — keeps the FE branch shallow.
  - `isActive` boolean, required
  - `sku` 'feedback_starter' | 'feedback_unlimited', nullable, required
  - `enabledLanguages` union, required
    - string[]
    - 'all'
  - `languagesLimit` integer, nullable, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/sonenta/apis/sonenta-api.md) · [All operations](https://skmtc.dev/sonenta/apis/sonenta-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sonenta/apis/sonenta-api/revisions/f853ea49fb05?raw)
