---
title: "Add Translation"
method: POST
path: "/projects/{projectId}/translations"
tags: ["String Translations"]
---

# Add Translation

`POST /projects/{projectId}/translations`

## Request

- Base URL: `https://api.crowdin.com/api/v2`
- URL: `https://api.crowdin.com/api/v2/projects/{projectId}/translations`
- Auth: none declared
- TypeScript: <https://skmtc.dev/crowdin/apis/crowdin-api-v2/docs/projects/:projectId/translations/post.ts> (a function with typed inputs; its response is checked against the schema)

**Required scopes:** `project.translation` (Read and Write).

## Path parameters

- `projectId` integer, required

## Request body

- TranslationCreateForm
  - `stringId` integer, required: String Identifier. Get via [List Strings](#operation/api.projects.strings.getMany)
  - `languageId` string, required: Language Identifier. Get via [Project Target Languages](#operation/api.projects.get)
  - `text` string, required: Translation text
  - `pluralCategoryName` string: Plural form. Acceptable keys are `zero`, `one`, `two`, `few`, `many`, and `other` __Note:__ Will be saved only if the source string has plurals and `pluralCategoryName` is equal to the one available for the language you add translations to
  - `addToTm` boolean: Defines whether to add translation to TM
  - `provider` 'tm' | 'global_tm' | 'google' | 'microsoft' | 'crowdin' | 'deepl' | 'amazon' | 'google_automl' | 'modernmt' | 'custom_mt' | 'ai', nullable: Translation provider type. Required when providerId or isPreTranslated is specified __Note__: `global_tm` value can't be used with `providerId` in same request
  - `providerId` integer: Provider specific identifier. Get via: * If `provider` is `tm` - [List TMs](#operation/api.tms.getMany) * If `provider` is `ai` - [List AI Prompts](#operation/api.ai.prompts.getMany) * If `provider` is `google`, `microsoft`, `crowdin`, `deepl`, `amazon`, `google_automl`, `modernmt` or `custom_mt` - [List MTs](#operation/api.mts.getMany) __Note__: Can't be used if `provider` value is `global_tm`
  - `isPreTranslated` boolean: Defines whether this is an auto-translated translation

## Response `201`

Translation was successfully added

- TranslationResource: Base schema of resource container. Container is a wrapper object that contains payload in required `data` property and provides space for adding any other metadata.

## Other responses

- `400`: Invalid Request Parameters
- `401`: Unauthorized
- `402`: Payment required
- `403`: Forbidden
- `404`: Project, string, or language with specified id was not found
- `405`: Method Not Allowed
- `503`: Service Unavailable

---

[API](https://skmtc.dev/crowdin/apis/crowdin-api-v2.md) - [All operations](https://skmtc.dev/crowdin/apis/crowdin-api-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/crowdin/apis/crowdin-api-v2/revisions/27aae7751699?raw)
