# General Translation Platform: Téléverser des traductions
URL: https://generaltranslation.com/fr/docs/platform/openapi/reference/files/upload-translations.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Téléversez les traductions de 1 à 100 fichiers sources existants. Nécessite project:files:write.

{/* Ce fichier a été généré par Fumadocs. Ne modifiez pas ce fichier directement. Toute modification doit être apportée en relançant la commande de génération. */}

## Endpoint

`POST https://api.gtx.dev/v2/projects/{projectId}/files/translations`

**Operation ID:** `uploadTranslations`

**Tags:** `Files`

**Summary:** Upload translations

Upload translations of 1–100 existing source files. Requires `project:files:write`.

Authentication: required. Send an API key in the `Authorization: Bearer <key>` header when authenticating.

### Parameters

- `projectId` (path, string, required)
- `gt-api-version` (header, "2026-10-08.v1", required): API contract version. Must be `2026-10-08.v1` or later; requests without it or with an older version return 400.

### Request body (required)

Body (`application/json`, object):
- `data` (object[], required): 1–100 source files with their translations; each file and locale may appear once.
  - `source` (object, required)
    - `content` (string, required): Base64-encoded file content.
    - `fileName` (string, required)
    - `fileFormat` ("GTJSON" | "MDX" | "JSON" | "YAML" | "MD" | "TS" | "JS" | "HTML" | "TXT" | "PO" | "POT" | "TWILIO_CONTENT_JSON" | "LOTTIE" | "SVG" | "XCSTRINGS" | "DOT_STRINGS" | "DOT_STRINGSDICT" | "ANDROID_STRINGS" | "SRT" | "RESX", required)
    - `dataFormat` (string)
    - `locale` (string, required)
    - `fileId` (string)
    - `versionId` (string)
    - `branchId` (string)
    - `checkedOutBranchId` (string)
    - `incomingBranchId` (string)
    - `formatMetadata` (object)
      - `<key>` (object, dynamic key)
  - `translations` (object[], required)
    - `content` (string, required): Base64-encoded translation content.
    - `fileName` (string, required)
    - `fileFormat` ("GTJSON" | "MDX" | "JSON" | "YAML" | "MD" | "TS" | "JS" | "HTML" | "TXT" | "PO" | "POT" | "TWILIO_CONTENT_JSON" | "LOTTIE" | "SVG" | "XCSTRINGS" | "DOT_STRINGS" | "DOT_STRINGSDICT" | "ANDROID_STRINGS" | "SRT" | "RESX", required)
    - `dataFormat` (string)
    - `locale` (string, required)
    - `transformFormat` ("GTJSON" | "MDX" | "JSON" | "YAML" | "MD" | "TS" | "JS" | "HTML" | "TXT" | "PO" | "POT" | "TWILIO_CONTENT_JSON" | "LOTTIE" | "SVG" | "XCSTRINGS" | "DOT_STRINGS" | "DOT_STRINGSDICT" | "ANDROID_STRINGS" | "SRT" | "RESX")

### Responses

**200**: Upload result for each translation, in request order, even when every translation fails to save: a failed translation has `status: "failed"` and an `error` while the others are saved. Retrying with the same content is safe; translations that were already saved are saved again, which can repeat completed webhooks and revisions.
Response body (`application/json`, object):
- `summary` (object, required): Number of `results` in total and by `status`.
  - `total` (integer, required)
  - `succeeded` (integer, required)
  - `failed` (integer, required)
- `results` (object[], required): One result per uploaded translation, in request order.
  - `branchId` (string, required)
  - `fileId` (string, required)
  - `versionId` (string, required)
  - `fileName` (string, required)
  - `fileFormat` ("GTJSON" | "MDX" | "JSON" | "YAML" | "MD" | "TS" | "JS" | "HTML" | "TXT" | "PO" | "POT" | "TWILIO_CONTENT_JSON" | "LOTTIE" | "SVG" | "XCSTRINGS" | "DOT_STRINGS" | "DOT_STRINGSDICT" | "ANDROID_STRINGS" | "SRT" | "RESX", required)
  - `dataFormat` ("JSX" | "ICU" | "I18NEXT" | "STRING")
  - `locale` (string, required)
  - `status` ("succeeded" | "failed", required)
  - `error` (string): Why the item failed.
  - `code` ("invalid_request" | "unauthenticated" | "payment_required" | "permission_denied" | "not_found" | "conflict" | "route_retired" | "payload_too_large" | "unsupported_media_type" | "locked" | "not_ready" | "rate_limited" | "internal_error" | "upstream_error" | "unavailable" | "already_exists" | "api_key_invalid" | "api_version_too_old" | "api_version_unsupported" | "branch_not_found" | "cdn_not_enabled" | "content_empty" | "credits_insufficient" | "cursor_invalid" | "default_branch_conflict" | "drive_access_insufficient" | "drive_account_not_connected" | "file_too_large" | "google_account_not_linked" | "integration_not_connected" | "ip_not_allowed" | "layout_not_supported" | "locale_not_allowed" | "org_integration_required" | "permission_missing" | "permission_not_grantable" | "plan_feature_unavailable" | "project_limit_reached" | "response_too_large" | "source_file_not_found" | "spend_limit_reached" | "sync_required" | "target_inaccessible" | "target_locales_missing" | "translation_not_ready" | "upload_incomplete" | "usage_limit_reached" & object)

**400**: The request is malformed or failed validation, including a translation whose content is not valid base64 or does not parse in its format. Nothing is saved, and the error names each such translation by its index, fileName and locale.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("invalid_request" | "api_version_unsupported" | "api_version_too_old" | "file_too_large", required)

Response body (`text/html`, string):

**401**: Authentication is missing or invalid.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("unauthenticated" | "api_key_invalid", required)

Response body (`text/html`, string):

**403**: The caller is authenticated but not allowed to perform this operation or access the requested resource.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("permission_denied" | "permission_missing" | "target_inaccessible" | "ip_not_allowed", required)

Response body (`text/html`, string):

**404**: A source file does not exist. Nothing is saved.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("not_found" | "source_file_not_found", required)

Response body (`text/html`, string):

**413**: The request, or the data it would return, exceeds a size or item limit.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("payload_too_large", required)

Response body (`text/html`, string):

**415**: The request body's Content-Type is missing or not supported. Send the body as application/json.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("unsupported_media_type", required)

Response body (`text/html`, string):

**429**: Too many requests. The rate limit was exceeded.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("rate_limited", required)

Response body (`text/html`, string):

**500**: An unexpected server error occurred, or translations were saved but the source files' locale list could not be updated; the error then lists saved and failed files.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("internal_error" | "upload_incomplete", required)

Response body (`text/html`, string):

**503**: The server is too busy to process the uploaded files. Retry later.
Response body (`application/json`, object):
- `error` (string, required)
- `code` ("unavailable", required)

Response body (`text/html`, string):

Complete OpenAPI 3.1 specification: https://generaltranslation.com/openapi.yaml

OpenAPI schema: [openapi.json](https://generaltranslation.com/openapi.json)

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
