Push a locale file
Upload one locale file.
Upload one locale file. A push of the source locale creates keys and updates source strings; a push of a target locale writes translations into existing keys and never creates keys. A translation you have edited or reviewed is never overwritten: a target value that would replace one is reported in conflicts with reason human-edited. A push never adds a language; push only locales the project already has.
When automatic translation is on, a source push that changes strings starts a translation run, returned in batch. If the run cannot start, the push still applies and quota_exceeded or translation_paused says why.
Push has its own rate limit of 300 requests per minute per token, separate from the general limit, because a repository upload is one request per file.
deployTokenAuthorizationBearer <token>A project deploy token, minted in the console under Settings, Developer, API tokens. Send the whole value, including the numeric prefix before the |. A token carries a set of abilities (push, pull, manage, read, write) and each operation requires one of them. Tokens do not inherit from each other: a manage token cannot read the glossary unless it also has read.
multipart/form-data- body
file*fileThe locale file, at most 10 MB.
binaryformat*FileFormatA file format transglot reads and writes.
"json_flat""json_nested""android_xml""ios_strings""ios_stringsdict""flutter_arb""laravel_php""laravel_json""xliff_12""ios_xcstrings""gettext_po""yaml""csv""xlsx""xliff_20""java_properties""resx""markdown""unity_csv""unreal_po"locale*stringThe locale the file is in. It must already be configured on the project.
length <= 35mode?stringmerge adds and updates. sync_removals also deletes keys that are not in the file; it is allowed only when pushing the source locale.
"merge""merge""sync_removals"metadata?fileOptional JSON sidecar of key descriptions and length limits, at most 1 MiB, sent as a file part. Only on a source push, and only for formats that cannot carry descriptions themselves (for example json_flat and json_nested). Shape: an object keyed by key name, each value an object with optional description (string or null) and max_length (integer or null). An absent field leaves the stored value alone; null clears it.
binaryhold?booleanUpload now and hold the project's first translation run until it is confirmed. Has no effect once the project's first run has been decided.
import?"repo"repo brings existing translations from a repository into keys the source push created. Only with a target-locale push.
"repo"The push was applied.
application/json- response
metadata?Present only when the push carried a metadata sidecar.
keys_created?integerKeys created by a source push.
keys_deleted?integerKeys deleted by a source push with mode=sync_removals.
source_updated?integerSource strings whose value changed.
translations_written?integerTarget values written by a target push.
conflicts?array<>unknown_keys?array<string>Keys in a target file that do not exist in the project. A target push never creates keys.
warnings?array<string>Human-readable warnings for a log.
batch?|The translation run this push started, or null.
quota_exceeded?booleantrue when the push was applied but its translation run was not started because the account has no AI words left or a spend cap applies.
translation_paused?|A code naming any other reason the push's translation run was not started, for example overage-paused or ai-paused; null when nothing stopped it.
hold?stringPresent only when the request sent hold=1. held means a run was due and is waiting for the project's first-run confirmation.
"held""nothing-to-hold"import?Present only when the request sent import=repo.
curl -X POST 'https://api.transglot.ai/v1/push' \ -F 'file=string' \ -F 'format=json_flat' \ -F 'locale=string'{ "keys_created": 14, "keys_deleted": 0, "source_updated": 3, "translations_written": 0, "conflicts": [], "unknown_keys": [], "warnings": [], "batch": { "id": 4822, "status": "processing", "trigger": "push", "total": 34, "completed": 0, "failed": 0, "skipped": 0, "skipped_reasons": null, "tm_served": 0, "language_breakdown": { "fr": 17, "de": 17 }, "started_at": "2026-10-12T09:50:01+00:00", "finished_at": null }, "quota_exceeded": false, "translation_paused": null}