---
title: "Propose Translations Bulk"
method: POST
path: "/v1/mcp/projects/{project_id}/translations/bulk"
tags: ["mcp"]
---

# Propose Translations Bulk

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

## Request

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

Batch translation upserts — idempotent, best-effort per-item, with
write-through key auto-create. Batches the writes only; the values come
from the caller (NO server-side translation).

Per-item `results` (status ok|unchanged|error) + `summary`. An item whose
value AND status already match the stored row returns status `unchanged`
(no version bump, no history). `reviewed`/`approved` are rejected per item.
Unknown namespace/language and intra-batch duplicates error per item. No
plan-cap gate here: the write-through auto-create mirrors the single
propose path (the cap gap on that path is scoped separately).

## Path parameters

- `project_id` string, required

## Request body

- ProposeTranslationsBulkIn
  - `items` TranslationBulkItem[], required
    - `namespace` string, required
    - `key` string, required
    - `language_code` string, required
    - `value` string
    - `plural_forms` object, nullable
    - `status` 'missing' | 'draft' | 'translated' | 'reviewed' | 'approved' | 'rejected', nullable
    - `confidence` string, nullable

## Response `200`

Successful Response

- ProposeTranslationsBulkOut
  - `results` TranslationBulkResult[], required
    - `index` integer, required
    - `status` string, required
    - `translation_uuid` string, nullable
    - `key_uuid` string, nullable
    - `language_uuid` string, nullable
    - `version` integer, nullable
    - `key_created` boolean, nullable
    - `error` BulkItemError
      - `code` string, required
      - `message` string, required
    - `glossary_violations` AppServicesGlossaryMatchGlossaryViolation[], nullable
      - `rule_type` 'translation' | 'do_not_translate' | 'forbidden', required
      - `term` string, required
      - `matched_text` string, nullable
      - `message` string, required
    - `variable_warnings` object, nullable
    - `placeholder_mismatch` object, nullable
    - `plural_mismatch` object, nullable
  - `summary` BulkSummary, required
    - `total` integer, required
    - `ok` integer, required
    - `errors` integer, required
    - `created` integer
    - `updated` integer
    - `unchanged` integer
  - `glossary_violation_count` integer
  - `placeholder_mismatch_count` 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)
