---
title: "Add Project"
method: POST
path: "/projects"
tags: ["Projects"]
---

# Add Project

`POST /projects`

## Request

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

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

## Request body

- ProjectCreateForm
  - `name` string, required: Project Name
  - `identifier` string: Project Identifier
  - `type` 0 | 1: Defines the project type. To create a string-based project, `type` should be set to 1.
  - `sourceLanguageId` string, required: Source Language Identifier. Get via [List Supported Languages](#operation/api.languages.getMany)
  - `targetLanguageIds` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
  - `visibility` 'open' | 'private': Defines how users can join the project. Available values: * open – anyone can join the project * private – only invited users can join the project
  - `languageAccessPolicy` 'open' | 'moderate': Defines access to project languages. Available values: * open – each project user can access all project languages * moderate – users should join each project language separately
  - `cname` string: Custom domain name
  - `description` string: Project description
  - `tagsDetection` 0 | 1 | 2: Values available: * 0 - Auto * 1 - Count tags * 2 - Skip tags
  - `isMtAllowed` boolean: Allows machine translations (Microsoft Translator, Google Translate) be visible for translators in the Editor.
  - `taskBasedAccessControl` boolean: Allow project members work with tasks they assigned to, even if they do not have full access to the language.
  - `autoSubstitution` boolean: Allows auto-substitution
  - `autoTranslateDialects` boolean: Automatically fill in regional dialects. If `true`, all untranslated strings in regional dialects (e.g. Argentine Spanish) will automatically include translations completed in the primary language (e.g. Spanish).
  - `publicDownloads` boolean: Allows translators to download source files to their machines and upload translations back into the project. Project owner and managers can always download sources and upload translations.
  - `hiddenStringsProofreadersAccess` boolean: Allows proofreaders to work with hidden strings. Project owner and managers can always access hidden strings
  - `useGlobalTm` boolean: If `true` - machine translations from connected MT engines (e.g. Microsoft Translator, Google Translate) will appear as suggestions in the Editor. __Note:__ If your organization plan is free or opensource - default value of this one will be `true`
  - `showTmSuggestionsDialects` boolean: If `true` - show primary language TM suggestions for dialects if there are no dialect-specific ones.
  - `tmApprovedSuggestionsOnly` boolean: If `true` - only approved suggestions will be saved to the project default TM.
  - `skipUntranslatedStrings` boolean: Defines whether to skip untranslated strings
  - `exportApprovedOnly` boolean: Defines whether to export only approved strings
  - `qaCheckIsActive` boolean: If `true` - QA checks are active
  - `qaCheckCategories` QaCheckCategories
    - `empty` boolean
    - `size` boolean
    - `tags` boolean
    - `spaces` boolean
    - `variables` boolean
    - `punctuation` boolean
    - `symbolRegister` boolean
    - `specialSymbols` boolean
    - `wrongTranslation` boolean
    - `spellcheck` boolean
    - `icu` boolean
    - `terms` boolean
    - `duplicate` boolean
    - `ftl` boolean
    - `android` boolean
    - `numbers` boolean
    - `ai` boolean
    - `outdated` boolean
    - `mdx` boolean
    - `unifiedPlaceholders` boolean
  - `qaChecksIgnorableCategories` QaChecksIgnorableCategories
    - `empty` boolean
    - `size` boolean
    - `tags` boolean
    - `spaces` boolean
    - `variables` boolean
    - `punctuation` boolean
    - `symbolRegister` boolean
    - `specialSymbols` boolean
    - `wrongTranslation` boolean
    - `spellcheck` boolean
    - `icu` boolean
    - `terms` boolean
    - `duplicate` boolean
    - `ftl` boolean
    - `android` boolean
    - `numbers` boolean
    - `ai` boolean
    - `outdated` boolean
    - `mdx` boolean
    - `unifiedPlaceholders` boolean
  - `languageMapping` object: Language Mapping
    - `uk` LanguageMappingUk
      - `name` string
      - `two_letters_code` string
      - `three_letters_code` string
      - `locale` string
      - `locale_with_underscore` string
      - `android_code` string
      - `osx_code` string
      - `osx_locale` string
  - `glossaryAccess` boolean: Allow project members to manage glossary terms. The project owner and managers always can add and edit terms.
  - `glossaryAccessOption` 'readOnly' | 'fullAccess' | 'manageDrafts': Defines how project members will manage glossary terms. The project owner and managers always can add and edit terms.
  - `normalizePlaceholder` boolean: Enable the transformation of the placeholders to the unified format to improve the work with TM suggestions
  - `notificationSettings` object: Notification Settings
    - `translatorNewStrings` boolean: Notify translators about new strings
    - `managerNewStrings` boolean: Notify project managers about new strings
    - `managerLanguageCompleted` boolean: Notify project managers about language translation/validation completion
  - `tmPreTranslate` object
    - `enabled` boolean
    - `autoApproveOption` 'all' | 'perfectMatchOnly' | 'exceptAutoSubstituted' | 'perfectMatchApprovedOnly' | 'none'
    - `minimumMatchRatio` 'perfect' | '100'
  - `mtPreTranslate` object
    - `enabled` boolean
    - `mts` EngineMtPreTranslateProjectSettings[]
      - `mtId` integer
      - `languageIds` string[]: Specify an array of languageIds to use specific languages, or use the string `all` to include all supported languages. Retrieve languageIds via the [List Supported Languages](#operation/api.languages.getMany) endpoint
  - `aiPreTranslate` object
    - `enabled` boolean
    - `aiPrompts` PromptAiPreTranslateProjectSettings[]
      - `aiPromptId` integer: AI Prompt Identifier. Get via [List AI Prompts](#operation/api.ai.prompts.getMany)
      - `languageIds` string[]: Specify an array of languageIds to use specific languages, or use the string `all` to include all supported languages. Retrieve languageIds via the [List Supported Languages](#operation/api.languages.getMany) endpoint
  - `preTranslationAiPromptId` integer: AI Prompt ID to be used as prompt for AI auto-translation as default value
  - `editorSuggestionAiPromptId` integer: AI Prompt ID to be used as prompt for AI Suggestion action in Editor
  - `qaCheckActionAiPromptId` integer: AI Prompt ID to be used as prompt for QA check action
  - `contextReviewAiPromptId` integer: AI Prompt ID to be used as prompt for Advisor string context review
  - `savingsReportSettingsTemplateId` integer: Report Settings Templates Identifier. Get via [List Report Settings Templates](#operation/api.projects.reports.settings-templates.getMany)
  - `defaultTmId` integer: Translation Memory ID. If omitted new translation memory will be created. Get via [List TMs](#operation/api.tms.getMany)
  - `defaultGlossaryId` integer: Glossary ID. If omitted new Glossary will be created. Get via [List Glossaries](#operation/api.glossaries.getMany)
  - `assignedStyleGuides` integer[]: Style Guide IDs to assign to project. Get via [List Style Guides](#operation/api.style-guides.getMany)
  - `inContext` boolean: Enable In-Context translations. __Note:__ Must be used together with `inContextPseudoLanguageId`
  - `inContextProcessHiddenStrings` boolean: Export hidden strings via pseudo-language. __Note:__ If `true` - hidden strings included in the pseudo-language archive will be translatable via In-Context.
  - `inContextPseudoLanguageId` string: In-Context pseudo-language id. __Note:__ Must be different from project source and target languages

## Response `201`

Project was successfully created

- CrowdinStringBasedProjectResource: 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.
  - `data` CrowdinStringBasedProjectSettingsResponse, required
    - `id` integer
    - `type` integer
    - `userId` integer
    - `sourceLanguageId` string
    - `targetLanguageIds` string[]
    - `languageAccessPolicy` string
    - `name` string
    - `cname` string, nullable
    - `identifier` string
    - `description` string
    - `visibility` string
    - `logo` string
    - `publicDownloads` boolean, nullable
    - `createdAt` string, date-time, nullable
    - `updatedAt` string, date-time, nullable
    - `lastActivity` string, date-time, nullable
    - `sourceLanguage` Language: Class LanguageResponseModel
      - `id` string
      - `name` string
      - `editorCode` string: - alias of internal code
      - `twoLettersCode` string: alias of iso6391 code
      - `threeLettersCode` string: alias of iso6393 code
      - `locale` string
      - `androidCode` string
      - `bcp47Code` string
      - `osxCode` string
      - `osxLocale` string
      - `pluralCategoryNames` string[]: plural category names
      - `pluralRules` string: string with plural rules
      - `pluralExamples` string[]: plural examples array
      - `textDirection` 'ltr' | 'rtl'
      - `dialectOf` string, nullable
    - `targetLanguages` Language[]
      - `id` string
      - `name` string
      - `editorCode` string: - alias of internal code
      - `twoLettersCode` string: alias of iso6391 code
      - `threeLettersCode` string: alias of iso6393 code
      - `locale` string
      - `androidCode` string
      - `bcp47Code` string
      - `osxCode` string
      - `osxLocale` string
      - `pluralCategoryNames` string[]: plural category names
      - `pluralRules` string: string with plural rules
      - `pluralExamples` string[]: plural examples array
      - `textDirection` 'ltr' | 'rtl'
      - `dialectOf` string, nullable
    - `webUrl` string
    - `savingsReportSettingsTemplateId` integer
    - `translateDuplicates` integer
    - `tagsDetection` integer
    - `glossaryAccess` boolean
    - `glossaryAccessOption` 'readOnly' | 'fullAccess' | 'manageDrafts'
    - `isMtAllowed` boolean
    - `taskBasedAccessControl` boolean
    - `hiddenStringsProofreadersAccess` boolean
    - `autoSubstitution` boolean
    - `exportTranslatedOnly` boolean
    - `skipUntranslatedStrings` boolean
    - `exportApprovedOnly` boolean
    - `autoTranslateDialects` boolean
    - `useGlobalTm` boolean
    - `showTmSuggestionsDialects` boolean
    - `tmApprovedSuggestionsOnly` boolean
    - `isSuspended` boolean
    - `qaCheckIsActive` boolean
    - `qaCheckCategories` QaCheckCategories
      - `empty` boolean
      - `size` boolean
      - `tags` boolean
      - `spaces` boolean
      - `variables` boolean
      - `punctuation` boolean
      - `symbolRegister` boolean
      - `specialSymbols` boolean
      - `wrongTranslation` boolean
      - `spellcheck` boolean
      - `icu` boolean
      - `terms` boolean
      - `duplicate` boolean
      - `ftl` boolean
      - `android` boolean
      - `numbers` boolean
      - `ai` boolean
      - `outdated` boolean
      - `mdx` boolean
      - `unifiedPlaceholders` boolean
    - `qaChecksIgnorableCategories` QaChecksIgnorableCategories
      - `empty` boolean
      - `size` boolean
      - `tags` boolean
      - `spaces` boolean
      - `variables` boolean
      - `punctuation` boolean
      - `symbolRegister` boolean
      - `specialSymbols` boolean
      - `wrongTranslation` boolean
      - `spellcheck` boolean
      - `icu` boolean
      - `terms` boolean
      - `duplicate` boolean
      - `ftl` boolean
      - `android` boolean
      - `numbers` boolean
      - `ai` boolean
      - `outdated` boolean
      - `mdx` boolean
      - `unifiedPlaceholders` boolean
    - `languageMapping` object
      - `uk` LanguageMappingUk
        - `name` string
        - `two_letters_code` string
        - `three_letters_code` string
        - `locale` string
        - `locale_with_underscore` string
        - `android_code` string
        - `osx_code` string
        - `osx_locale` string
    - `notificationSettings` object
      - `translatorNewStrings` boolean: Notify translators about new strings
      - `managerNewStrings` boolean: Notify project managers about new strings
      - `managerLanguageCompleted` boolean: Notify project managers about language translation/validation completion
    - `defaultTmId` integer
    - `defaultGlossaryId` integer
    - `assignedTms` object
      - `1` AssignedTm
        - `priority` integer
    - `assignedGlossaries` integer[]
    - `assignedStyleGuides` integer[]
    - `tmPenalties` object
      - `autoSubstitution` integer
      - `tmPriority` object
        - `priority` integer
        - `penalty` integer
      - `multipleTranslations` integer
      - `timeSinceLastUsage` object
        - `months` integer
        - `penalty` integer
      - `timeSinceLastModified` object
        - `months` integer
        - `penalty` integer
    - `normalizePlaceholder` boolean
    - `tmPreTranslate` TmPreTranslateProjectSettings: Translates only new strings. Changing this setting or adding a target language does not translate existing strings; use [Apply Auto-Translation](#operation/api.projects.pre-translations.post) for them.
      - `enabled` boolean
      - `autoApproveOption` 'all' | 'perfectMatchOnly' | 'exceptAutoSubstituted' | 'perfectMatchApprovedOnly' | 'none'
      - `minimumMatchRatio` 'perfect' | '100'
    - `mtPreTranslate` MtPreTranslateProjectSettings: Translates only new strings. Changing this setting or adding a target language does not translate existing strings; use [Apply Auto-Translation](#operation/api.projects.pre-translations.post) for them.
      - `enabled` boolean
      - `mts` EngineMtPreTranslateProjectSettings[]
        - `mtId` integer
        - `languageIds` string[]: Specify an array of languageIds to use specific languages, or use the string `all` to include all supported languages. Retrieve languageIds via the [List Supported Languages](#operation/api.languages.getMany) endpoint
    - `aiPreTranslate` AiPreTranslateProjectSettings: Translates only new strings. Changing this setting or adding a target language does not translate existing strings; use [Apply Auto-Translation](#operation/api.projects.pre-translations.post) for them.
      - `enabled` boolean
      - `aiPrompts` PromptAiPreTranslateProjectSettings[]
        - `aiPromptId` integer: AI Prompt Identifier. Get via [List AI Prompts](#operation/api.ai.prompts.getMany)
        - `languageIds` string[]: Specify an array of languageIds to use specific languages, or use the string `all` to include all supported languages. Retrieve languageIds via the [List Supported Languages](#operation/api.languages.getMany) endpoint
    - `preTranslationAiPromptId` integer, nullable
    - `editorSuggestionAiPromptId` integer, nullable
    - `qaCheckActionAiPromptId` integer, nullable
    - `contextReviewAiPromptId` integer, nullable
    - `inContext` boolean
    - `inContextProcessHiddenStrings` boolean
    - `inContextPseudoLanguageId` string, nullable
    - `inContextPseudoLanguage` LanguageUk
      - `id` string
      - `name` string
      - `editorCode` string
      - `twoLettersCode` string
      - `threeLettersCode` string
      - `locale` string
      - `androidCode` string
      - `osxCode` string
      - `osxLocale` string
      - `pluralCategoryNames` string[]
      - `pluralRules` string
      - `pluralExamples` string[]
      - `textDirection` string
      - `dialectOf` string, nullable

## Other responses

- `400`: Invalid Request Parameters
- `401`: Unauthorized
- `403`: Forbidden
- `405`: Method Not Allowed

---

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