---
title: "Build ICU skeletons"
method: POST
path: "/icu/skeleton"
tags: ["ICU"]
---

# Build ICU skeletons

`POST /icu/skeleton`

Generates ICU (International Components for Unicode) message format skeletons for a given source string across one or more locales. An ICU skeleton strips the literal text from a pluralized or select message while preserving its structural rules — argument names, plural categories, select cases, and ordinal forms — adjusted to the pluralization rules of each requested locale.

Use this endpoint to normalize translation templates before importing them into locale files, or to validate that a source string carries the plural forms required by a target language.

Either `content` or `id` must be provided — supplying both or neither returns 400. When `id` is used and the referenced translation does not exist, the endpoint returns 404. When the source string is not valid ICU message format syntax, the endpoint returns 422 with an `error` field describing the parse failure.

## Headers

- `X-PhraseApp-OTP` string

## Request body

- union
  - object
    - `content` string, required — Source ICU message string to derive skeletons from. Mutually exclusive with `id`; exactly one of the two must be provided.
    - `id` string — Code of an existing translation to source content from. Mutually exclusive with `content`; exactly one of the two must be provided. Returns 404 when the translation does not exist.
    - `locale_codes` string[] — Locale codes for which to generate skeletons. The pluralization rules of each locale determine which plural forms appear in the output.
    - `keep_content` boolean — When true, preserves the existing translation text in each plural form and adds any missing forms for the locale rather than stripping all literal content.
    - `zero_form_enabled` boolean — When true, includes the zero plural form in the generated skeleton for locales that support it.
    - `cldr_version` string — Pluralization rule set to use when constructing skeletons. Pass `legacy` for pre-CLDR behaviour, or a CLDR version string such as `cldr48`. Defaults to the project's configured version when omitted.
  - object
    - `content` string — Source ICU message string to derive skeletons from. Mutually exclusive with `id`; exactly one of the two must be provided.
    - `id` string, required — Code of an existing translation to source content from. Mutually exclusive with `content`; exactly one of the two must be provided. Returns 404 when the translation does not exist.
    - `locale_codes` string[] — Locale codes for which to generate skeletons. The pluralization rules of each locale determine which plural forms appear in the output.
    - `keep_content` boolean — When true, preserves the existing translation text in each plural form and adds any missing forms for the locale rather than stripping all literal content.
    - `zero_form_enabled` boolean — When true, includes the zero plural form in the generated skeleton for locales that support it.
    - `cldr_version` string — Pluralization rule set to use when constructing skeletons. Pass `legacy` for pre-CLDR behaviour, or a CLDR version string such as `cldr48`. Defaults to the project's configured version when omitted.

## Response `200`

OK

- Icu
  - `locale_code` string — Object keys are dynamic and based on requested locale codes, see example.

## Other responses

- `400` — Bad request. The request could not be parsed or a parameter failed validation. Verify the request body, the content type, and the parameter types, then retry.
- `401` — Unauthorized. Authentication failed because the access token is missing, expired, or invalid. Supply a valid access token and retry.
- `403` — Forbidden. The credentials are valid but not permitted for this request: the access token may lack the required scope, the user may lack permission on the resource, or the account plan may not include the feature. Use a token with the required scope on an account and user that hold the necessary permissions.
- `404` — Not found. The requested resource does not exist or is not visible to the authenticated user. Verify the identifiers in the request path and that the token has access to them, then retry.
- `422` — Unprocessable entity. Returned when the source string is not valid ICU message format syntax. The response body contains an `error` field with a human-readable description of the parse failure. Correct the ICU syntax in the source string and retry.
- `429` — Too many requests. The rate limit has been exceeded. Wait until the time indicated by the `X-Rate-Limit-Reset` response header before retrying.

---

[API](https://skmtc.net/phrase/apis/control-hub-service.md) · [All operations](https://skmtc.net/phrase/apis/control-hub-service/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/phrase/control-hub-service/revisions/98ecac7ba2bf/schema)
