---
title: "Service Approve Translations"
method: POST
path: "/v1/mcp/projects/{project_id}/translations/approve"
tags: ["mcp"]
---

# Service Approve Translations

`POST /v1/mcp/projects/{project_id}/translations/approve`

## Request

- Base URL: `https://api.sonenta.dev`
- URL: `https://api.sonenta.dev/v1/mcp/projects/{project_id}/translations/approve`
- Auth: none declared

MCP approval twin (task 755 → 1631): an agent flips translated/reviewed ->
approved over the `mcp:*` scope (metered write, like the a11y-variant tools),
so the review agent can "approve the good ones" in the SAME key it uses to
propose. The HUMAN dashboard approve (`review_router` in translations.py)
stays JWT-only.

Every approval is AUDITED (translation.status_changed, approval_kind=service,
actor_api_key_uuid) — non-bypassable + distinguishable from human approvals —
and now emits an enriched observability event via the meter (status_before ->
approved, per key). Metered write but NOT separately billed (units=0: a
status/governance change; the content was already billed at propose/update).
Addressed by namespace/key/language_code (AI-native, no uuids). Idempotent:
already-approved rows return unchanged; rows without an approvable value
(missing/draft) error per item.

## Path parameters

- `project_id` string, required

## Request body

- ServiceApproveIn
  - `items` ServiceApproveItem[], required
    - `namespace` string, required
    - `key` string, required
    - `language_code` string, required

## Response `200`

Successful Response

- ServiceApproveOut
  - `results` ServiceApproveResult[], required
    - `namespace` string, required
    - `key` string, required
    - `language_code` string, required
    - `status` string, required
    - `translation_uuid` string, nullable
    - `version` integer, nullable
    - `error` BulkItemError
      - `code` string, required
      - `message` string, required
  - `summary` BulkSummary, required
    - `total` integer, required
    - `ok` integer, required
    - `errors` integer, required
    - `created` integer
    - `updated` integer
    - `unchanged` integer

## 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)
