---
title: "Project System Placeholder Batch Operations"
method: PATCH
path: "/projects/{projectId}/system-placeholders"
tags: ["Placeholders"]
---

# Project System Placeholder Batch Operations

`PATCH /projects/{projectId}/system-placeholders`

## Request

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

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

Turns system placeholders on and off — one row or a whole screen of them in one request. Each operation names its own row, so the change costs one call, one re-validation of the `Placeholders` check and one write, and the response carries the rows it changed, in catalogue order.

__Note:__ A `test` operation asserts the state of a row without writing it, so a document of `test` operations alone changes nothing

## Path parameters

- `projectId` integer, required

## Request body

- ProjectSystemPlaceholderMassOperation[]: A JSON Patch document as defined by <a href="https://tools.ietf.org/html/rfc6902#section-3" target="_blank">RFC 6902</a>
  - `op` 'replace' | 'test', required: Patch operation to perform
  - `path` '/wrappedAmpersand/isEnabled' | '/appleStringsdictPlural/isEnabled' | '/dollarInsideBraces/isEnabled' | '/dollarOutsideBraces/isEnabled' | '/wrappedColon/isEnabled' | '/wrappedDollar/isEnabled' | '/dollarParentheses/isEnabled' | '/i18nextNesting/isEnabled' | '/i18nextLegacy/isEnabled' | '/rubyInterpolation/isEnabled' | '/mailchimpMergeTag/isEnabled' | '/swiftInterpolation/isEnabled' | '/bracesTriple/isEnabled' | '/bracesDouble/isEnabled' | '/bracesSingle/isEnabled' | '/bracesDoubleFormatted/isEnabled' | '/dateTimePattern/isEnabled' | '/appleStringCatalogNamed/isEnabled' | '/printfSpecifier/isEnabled' | '/pythonPercentFormat/isEnabled' | '/railsI18n/isEnabled' | '/javaMessageFormat/isEnabled' | '/dotNetCompositeFormat/isEnabled' | '/twig/isEnabled' | '/phpInterpolation/isEnabled' | '/freemarkerDirective/isEnabled' | '/wrappedPercent/isEnabled' | '/dateTimeSpecifier/isEnabled', json-pointer, required: A JSON Pointer as defined by <a href="https://tools.ietf.org/html/rfc6901" target="_blank">RFC 6901</a>. The first segment is the key of the system placeholder, and `/isEnabled` is the only property it accepts. See [Placeholders](#tag/Placeholders) for what each key matches.
  - `value` boolean, required: Whether Crowdin recognizes the placeholder in this project

## Response `200`

Project system placeholders were successfully updated

- ProjectSystemPlaceholderUpdatedCollectionResource: Project System Placeholder Updated Collection Resource
  - `data` ProjectSystemPlaceholderResource[], required: The rows one batch touched. No pagination: a batch answers with what it changed, not with a page of the project's placeholders.
    - `data` ProjectSystemPlaceholderResponse, required: A placeholder Crowdin ships, turned on or off per project
      - `id` 'wrappedAmpersand' | 'appleStringsdictPlural' | 'dollarInsideBraces' | 'dollarOutsideBraces' | 'wrappedColon' | 'wrappedDollar' | 'dollarParentheses' | 'i18nextNesting' | 'i18nextLegacy' | 'rubyInterpolation' | 'mailchimpMergeTag' | 'swiftInterpolation' | 'bracesTriple' | 'bracesDouble' | 'bracesSingle' | 'bracesDoubleFormatted' | 'dateTimePattern' | 'appleStringCatalogNamed' | 'printfSpecifier' | 'pythonPercentFormat' | 'railsI18n' | 'javaMessageFormat' | 'dotNetCompositeFormat' | 'twig' | 'phpInterpolation' | 'freemarkerDirective' | 'wrappedPercent' | 'dateTimeSpecifier', required: Key of the system placeholder. Name it in the `path` of a batch operation to turn the placeholder on or off
      - `isEnabled` boolean, required: If `false`, this project stops recognizing the placeholder in the QA checks and in the Editor. The Editor keeps highlighting a construct another enabled placeholder still claims __Note:__ A construct that a blocking custom placeholder also matches is reported under that placeholder once this one is off, so its mismatch becomes non-ignorable
      - `label` string, required: Name of the placeholder, in the language of the request. Carries no syntax example — `examples` does
      - `examples` string[], required: Constructs the placeholder matches, written out. Never localized, so they can be rendered as code. A placeholder that merges several patterns lists all of them
      - `description` string, required: One line saying where the construct comes from, in the language of the request. Carries no syntax example — `examples` does, and it repeats neither that nor `label`

## Other responses

- `400`: Invalid Request Parameters. A malformed operation is reported as `ErrorCollectionResource`, with the operation index in `key`; a well-formed operation that cannot be applied is reported as `ErrorPatchCollectionResource`, with it in `index`
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Project 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)
