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

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

- EnterpriseProjectCreateForm
  - `name` string, required: Project name
  - `sourceLanguageId` string, required: Source Language Identifier. Get via [List Supported Languages](#operation/api.languages.getMany)
  - `templateId` integer: Workflow Template Identifier. Get via [List Workflow Templates](#operation/api.workflow-templates.getMany)
  - `steps` union[]: Workflow Template Steps Configuration. __Note:__ Must be used together with `templateId` __Note:__ Can't be used with `vendorId`, `mtEngineId` in same request
    - union
      - object
        - `id` integer, required: Workflow Template Step Identifier. Get via [Get Workflow Template](#operation/api.workflow-templates.get)
        - `languages` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
        - `assignees` integer[]: Use `config` instead
        - `config` object: __Note:__ Use only with `Translation` and `Proofreading` step types
          - `assignees` object: Keys are the Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany), Values are the User Identifiers. Get via [List Users](#operation/api.users.getMany)
          - `assignedTeams` object: Keys are the Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany), Values are the Team Identifiers. Get via [List Teams](#operation/api.teams.getMany)
      - object
        - `id` integer, required: Workflow Template Step Identifier. Get via [Get Workflow Template](#operation/api.workflow-templates.get)
        - `languages` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
        - `vendorId` integer: Vendor Identifier. Get via [List Vendors](#operation/api.vendors.getMany)
      - object
        - `id` integer, required: Workflow Template Step Identifier. Get via [Get Workflow Template](#operation/api.workflow-templates.get)
        - `languages` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
        - `config` object: __Note:__ Use only if TM Auto-translation is part of your Workflow Template __Note:__ If `autoSubstitution` is not set, the value from the project settings will be used
          - `minRelevant` integer: Minimum match for TM suggestions
          - `autoSubstitution` boolean: Improves TM suggestions
          - `autoApproveOption` 'all' | 'perfectMatchOnly' | 'exceptAutoSubstituted' | 'perfectMatchApprovedOnly' | 'none': Approve added translations
      - object
        - `id` integer, required: Workflow Template Step Identifier. Get via [Get Workflow Template](#operation/api.workflow-templates.get)
        - `languages` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
        - `mtId` integer: MT Engine Identifier. Get via [List MTs](#operation/api.mts.getMany)
      - object
        - `id` integer, required: Workflow Template Step Identifier. Get via [Get Workflow Template](#operation/api.workflow-templates.get)
        - `languages` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
        - `promptId` integer: Auto-Translation Prompt Identifier (a prompt with the `pre_translate` action). Get via [List Prompts](#operation/api.ai.prompts.getMany)
  - `groupId` integer: Group Identifier. Get via [List Groups](#operation/api.groups.getMany)
  - `targetLanguageIds` string[]: Target Languages Identifiers. Get via [List Supported Languages](#operation/api.languages.getMany)
  - `vendorId` integer: Specify Vendor Identifier, if no Vendor is assigned to Workflow step yet. Get via [List Vendors](#operation/api.vendors.getMany) __Note:__ Use only if Vendor is part of your Workflow Template __Note:__ Can't be used with `steps` in same request
  - `mtEngineId` integer: Specify Machine Translation engine Identifier, if no MT engine is assigned to Workflow step yet. Get via [List MTs](#operation/api.mts.getMany) __Note:__ Use only if MT is part of your Workflow Template __Note:__ Can't be used with `steps` in same request
  - `description` string: Project description is visible to project members
  - `translateDuplicates` 0 | 1 | 2 | 3 | 4 | 5: Values available: * 0 - Show – translators will translate each instance separately, * 1 - Hide (regular detection) – all duplicates will share the same translation * 2 - Show, but auto-translate them, * 3 - Show within a version branch (regular detection) - duplicates will be hidden only between versions branches * 4 - Hide (strict detection) – all duplicates will share the same translation * 5 - Show within a version branch (strict detection) - duplicates will be hidden only between versions branches
  - `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.
  - `taskReviewerIds` integer[]: Array of manager user ids.
  - `autoSubstitution` boolean: Allows auto-substitution
  - `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.
  - `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
  - `delayedWorkflowStart` boolean: Delay workflow start after project creation
  - `skipUntranslatedStrings` boolean: Defines whether to skip untranslated strings
  - `exportWithMinApprovalsCount` integer: Defines whether to export only approved strings __Note:__ value greater than `0` can't be used with `exportStringsThatPassedWorkflow=true` in same request
  - `exportStringsThatPassedWorkflow` boolean: Defines whether to export only strings that passed workflow __Note:__ `true` value can't be used with `exportWithMinApprovalsCount>0` in same request or in projects without an assigned workflow
  - `normalizePlaceholder` boolean: Enable the transformation of the placeholders to the unified format to improve the work with TM suggestions
  - `qaCheckIsActive` boolean: If `true` - QA checks are active
  - `qaApprovalsCount` integer: Clear QA checks for translations with specific number of approvals
  - `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
  - `customQaCheckIds` integer[]
  - `externalQaCheckIds` integer[]
  - `externalQaChecksIgnorable` object: External QA check IDs mapped to whether a failure of the check can be ignored. `false` blocks saving a translation when the check fails, and only a synchronous check can be `false`. A check without an entry can be ignored. The entry is kept while the check is not enabled in `externalQaCheckIds`
  - `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.
  - `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
  - `savingsReportSettingsTemplateId` integer: Report Settings Templates Identifier. Get via [List Report Settings Templates](#operation/api.reports.settings-templates.getMany)
  - `fields` EnterpriseAdditionalFields: Fields. Keys get via [List Fields](#operation/api.fields.getMany)
  - `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
  - `alignmentActionAiPromptId` integer: AI Prompt ID to be used as prompt for Alignment action __Note:__ Available for the business plan only
  - `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
  - `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
  - `saveMetaInfoInSource` boolean: Context and max.length added in Crowdin will be visible in the downloaded files
  - `type` 0 | 1: Defines the project type. To create a file-based project, `type` should be set to 0.
  - `skipUntranslatedFiles` boolean: Defines whether to export only translated file
  - `tmContextType` 'segmentContext' | 'auto' | 'prevAndNextSegment': TM perfect match searching mode. Available values: * segmentContext - searching by context * auto - context search for key-value formats and segment search for others * prevAndNextSegment - search by previous and next segment

## Response `201`

Project was successfully created

- EnterpriseFileBasedProjectResource: 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` EnterpriseFileBasedProjectResponse, required
    - `id` integer
    - `groupId` integer
    - `type` integer
    - `userId` integer
    - `sourceLanguageId` string
    - `targetLanguageIds` string[]
    - `name` string
    - `identifier` string
    - `description` string
    - `logo` string
    - `background` string, nullable
    - `isExternal` boolean
    - `externalType` 'proofread' | 'translate', nullable
    - `externalProjectId` integer, nullable
    - `externalOrganizationId` integer, nullable
    - `workflowId` integer
    - `hasCrowdsourcing` boolean
    - `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
    - `publicUrl` string, nullable: Specify the URL to a crowdsourcing project
    - `savingsReportSettingsTemplateId` integer
    - `fields` EnterpriseAdditionalFields: Fields. Keys get via [List Fields](#operation/api.fields.getMany)
    - `clientOrganizationId` integer
    - `translateDuplicates` integer
    - `tagsDetection` integer
    - `glossaryAccess` boolean
    - `glossaryAccessOption` 'readOnly' | 'fullAccess' | 'manageDrafts'
    - `isMtAllowed` boolean
    - `taskBasedAccessControl` boolean
    - `taskReviewerIds` integer[]
    - `hiddenStringsProofreadersAccess` boolean
    - `autoSubstitution` boolean
    - `showTmSuggestionsDialects` boolean
    - `tmApprovedSuggestionsOnly` boolean
    - `exportTranslatedOnly` boolean
    - `skipUntranslatedStrings` boolean
    - `exportWithMinApprovalsCount` integer
    - `exportStringsThatPassedWorkflow` boolean
    - `autoTranslateDialects` boolean
    - `normalizePlaceholder` boolean
    - `isSuspended` boolean
    - `qaCheckIsActive` boolean
    - `qaApprovalsCount` integer
    - `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
    - `customQaCheckIds` integer[]
    - `externalQaCheckIds` integer[]
    - `externalQaChecksIgnorable` object: External QA check IDs mapped to whether a failure of the check can be ignored. `false` blocks saving a translation when the check fails, and only a synchronous check can be `false`. A check without an entry can be ignored. The entry is kept while the check is not enabled in `externalQaCheckIds`
    - `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
    - `delayedWorkflowStart` boolean
    - `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
    - `preTranslationAiPromptId` integer, nullable
    - `editorSuggestionAiPromptId` integer, nullable
    - `alignmentActionAiPromptId` 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
    - `saveMetaInfoInSource` boolean
    - `skipUntranslatedFiles` boolean
    - `tmContextType` string

## Other responses

- `400`: Invalid Request Parameters
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Group, language, template, vendor, or MT engine with specified id was not found
- `405`: Method Not Allowed

---

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