curl "https://api.phrase.com/v2/projects/:project_id/uploads" \
-u USERNAME_OR_ACCESS_TOKEN \
-X POST \
-F branch=my-feature-branch \
-F file=@/path/to/my/file.json \
-F locale_id=abcd1234cdef1234abcd1234cdef1234 \
-F tags=awesome-feature,needs-proofreading \
-F locale_mapping[en]=2 \
-F format_options[foo]=barphrase uploads create \
--project_id <project_id> \
--branch my-feature-branch \
--file /path/to/my/file.json \
--locale_id abcd1234cdef1234abcd1234cdef1234 \
--tags awesome-feature,needs-proofreading \
--locale_mapping '{"en": "2"}' \
--format_options '{"foo": "bar"}' \
--access_token <token>import requests
url = "https://api.phrase.com/v2/projects/{project_id}/uploads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"file_format": "json",
"locale_id": "abcd1234cdef1234abcd1234cdef1234",
"branch": "my-feature-branch",
"tags": "awesome-feature,needs-proofreading",
"update_translations": "true",
"update_custom_metadata": "true",
"update_translation_keys": "true",
"update_translations_on_source_match": "true",
"source_locale_id": "abcd1234cdef1234abcd1234cdef1234",
"update_descriptions": "true",
"convert_emoji": "true",
"skip_upload_tags": "true",
"skip_unverification": "true",
"file_encoding": "UTF-8",
"locale_mapping": "{\"en\": \"2\"}",
"format_options": "{\"foo\": \"bar\"}",
"autotranslate": "true",
"verify_mentioned_translations": "true",
"mark_reviewed": "true",
"tag_only_affected_keys": "true",
"translation_key_prefix": "prefix_",
"skip_automated_job_creation": "false"
}
headers = {"Authorization": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '/path/to/my/file.json');
form.append('file_format', 'json');
form.append('locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('branch', 'my-feature-branch');
form.append('tags', 'awesome-feature,needs-proofreading');
form.append('update_translations', 'true');
form.append('update_custom_metadata', 'true');
form.append('update_translation_keys', 'true');
form.append('update_translations_on_source_match', 'true');
form.append('source_locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('update_descriptions', 'true');
form.append('convert_emoji', 'true');
form.append('skip_upload_tags', 'true');
form.append('skip_unverification', 'true');
form.append('file_encoding', 'UTF-8');
form.append('locale_mapping', '{"en": "2"}');
form.append('format_options', '{"foo": "bar"}');
form.append('autotranslate', 'true');
form.append('verify_mentioned_translations', 'true');
form.append('mark_reviewed', 'true');
form.append('tag_only_affected_keys', 'true');
form.append('translation_key_prefix', 'prefix_');
form.append('skip_automated_job_creation', 'false');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.phrase.com/v2/projects/{project_id}/uploads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.phrase.com/v2/projects/{project_id}/uploads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.phrase.com/v2/projects/{project_id}/uploads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.phrase.com/v2/projects/{project_id}/uploads")
.header("Authorization", "<api-key>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.phrase.com/v2/projects/{project_id}/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "abcd1234cdef1234abcd1234cdef1234",
"filename": "example.json",
"format": "json",
"state": "success",
"error_message": null,
"tag": "tag",
"summary": {
"locales_created": 2,
"translation_keys_created": 162,
"translation_keys_updated": 10,
"translation_keys_unmentioned": 0,
"translations_created": 291,
"translations_updated": 3,
"tags_created": 2,
"translation_keys_ignored": 0
},
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "johndoe",
"name": "John Doe",
"gravatar_uid": "205e460b479e2e5b48aec07710c08d50"
},
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
}{
"message": "Validation Failed",
"errors": [
{
"resource": "Resource",
"field": "name",
"message": "can't be blank"
}
]
}Upload a new file
Upload a new language file. Creates necessary resources in your project.
The upload is processed asynchronously: this endpoint returns 201 Created once the file has been accepted and enqueued, not once processing has finished. Poll GET /projects/{project_id}/uploads/{id} and check the state field — error means processing failed (for example, an unparseable file or a file_format that doesn’t match the file’s actual content).
Note: be aware of upload limits.
curl "https://api.phrase.com/v2/projects/:project_id/uploads" \
-u USERNAME_OR_ACCESS_TOKEN \
-X POST \
-F branch=my-feature-branch \
-F file=@/path/to/my/file.json \
-F locale_id=abcd1234cdef1234abcd1234cdef1234 \
-F tags=awesome-feature,needs-proofreading \
-F locale_mapping[en]=2 \
-F format_options[foo]=barphrase uploads create \
--project_id <project_id> \
--branch my-feature-branch \
--file /path/to/my/file.json \
--locale_id abcd1234cdef1234abcd1234cdef1234 \
--tags awesome-feature,needs-proofreading \
--locale_mapping '{"en": "2"}' \
--format_options '{"foo": "bar"}' \
--access_token <token>import requests
url = "https://api.phrase.com/v2/projects/{project_id}/uploads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"file_format": "json",
"locale_id": "abcd1234cdef1234abcd1234cdef1234",
"branch": "my-feature-branch",
"tags": "awesome-feature,needs-proofreading",
"update_translations": "true",
"update_custom_metadata": "true",
"update_translation_keys": "true",
"update_translations_on_source_match": "true",
"source_locale_id": "abcd1234cdef1234abcd1234cdef1234",
"update_descriptions": "true",
"convert_emoji": "true",
"skip_upload_tags": "true",
"skip_unverification": "true",
"file_encoding": "UTF-8",
"locale_mapping": "{\"en\": \"2\"}",
"format_options": "{\"foo\": \"bar\"}",
"autotranslate": "true",
"verify_mentioned_translations": "true",
"mark_reviewed": "true",
"tag_only_affected_keys": "true",
"translation_key_prefix": "prefix_",
"skip_automated_job_creation": "false"
}
headers = {"Authorization": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '/path/to/my/file.json');
form.append('file_format', 'json');
form.append('locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('branch', 'my-feature-branch');
form.append('tags', 'awesome-feature,needs-proofreading');
form.append('update_translations', 'true');
form.append('update_custom_metadata', 'true');
form.append('update_translation_keys', 'true');
form.append('update_translations_on_source_match', 'true');
form.append('source_locale_id', 'abcd1234cdef1234abcd1234cdef1234');
form.append('update_descriptions', 'true');
form.append('convert_emoji', 'true');
form.append('skip_upload_tags', 'true');
form.append('skip_unverification', 'true');
form.append('file_encoding', 'UTF-8');
form.append('locale_mapping', '{"en": "2"}');
form.append('format_options', '{"foo": "bar"}');
form.append('autotranslate', 'true');
form.append('verify_mentioned_translations', 'true');
form.append('mark_reviewed', 'true');
form.append('tag_only_affected_keys', 'true');
form.append('translation_key_prefix', 'prefix_');
form.append('skip_automated_job_creation', 'false');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.phrase.com/v2/projects/{project_id}/uploads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.phrase.com/v2/projects/{project_id}/uploads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.phrase.com/v2/projects/{project_id}/uploads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.phrase.com/v2/projects/{project_id}/uploads")
.header("Authorization", "<api-key>")
.header("Content-Type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.phrase.com/v2/projects/{project_id}/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n/path/to/my/file.json\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_format\"\r\n\r\njson\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"branch\"\r\n\r\nmy-feature-branch\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nawesome-feature,needs-proofreading\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_custom_metadata\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translation_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_translations_on_source_match\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"source_locale_id\"\r\n\r\nabcd1234cdef1234abcd1234cdef1234\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"update_descriptions\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"convert_emoji\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_upload_tags\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_unverification\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_encoding\"\r\n\r\nUTF-8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"locale_mapping\"\r\n\r\n{\"en\": \"2\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format_options\"\r\n\r\n{\"foo\": \"bar\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"autotranslate\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"verify_mentioned_translations\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mark_reviewed\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag_only_affected_keys\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"translation_key_prefix\"\r\n\r\nprefix_\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"skip_automated_job_creation\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "abcd1234cdef1234abcd1234cdef1234",
"filename": "example.json",
"format": "json",
"state": "success",
"error_message": null,
"tag": "tag",
"summary": {
"locales_created": 2,
"translation_keys_created": 162,
"translation_keys_updated": 10,
"translation_keys_unmentioned": 0,
"translations_created": 291,
"translations_updated": 3,
"tags_created": 2,
"translation_keys_ignored": 0
},
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "johndoe",
"name": "John Doe",
"gravatar_uid": "205e460b479e2e5b48aec07710c08d50"
},
"created_at": "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
}{
"message": "Validation Failed",
"errors": [
{
"resource": "Resource",
"field": "name",
"message": "can't be blank"
}
]
}Authorizations
Enter your token in the format token TOKEN
Headers
Two-Factor-Authentication token (optional)
Path Parameters
Project ID
Body
File to be imported
File format of the uploaded file, given as a format's api_name. See our Formats API Endpoint for the full list of supported formats.
Optional. When omitted, Phrase tries to auto-detect the format from the file's content. This is not always possible for JSON files, since several JSON-based formats (e.g. json, simple_json, nested_json) share the same structure.
"json"
Locale of the file's content. Can be the name or id of the locale. Preferred is id.
"abcd1234cdef1234abcd1234cdef1234"
specify the branch to use
"my-feature-branch"
List of tags separated by comma to be associated with the new keys contained in the upload.
"awesome-feature,needs-proofreading"
Indicates whether existing translations should be updated with the file content.
true
Determines whether to update custom metadata values when uploading a file. If set to true, existing metadata can be changed or removed. Passing an empty value deletes the corresponding metadata property.
true
Pass false here to prevent new keys from being created and existing keys updated.
true
Update target translations only if the source translations of the uploaded multilingual file match the stored translations.
true
Specifies the source locale for multilingual files. Can be the name or id of the locale. Preferred is id.
"abcd1234cdef1234abcd1234cdef1234"
Existing key descriptions will be updated with the file content. Empty descriptions overwrite existing descriptions.
true
This option is obsolete. Providing the option will cause a bad request error.
true
Indicates whether the upload should not create upload tags.
true
Indicates whether the upload should unverify updated translations.
true
Enforces a specific encoding on the file contents. Valid options are "UTF-8", "UTF-16" and "ISO-8859-1".
"UTF-8"
Mapping between locale names and translation columns. Required in some formats like CSV or XLSX.
"{\"en\": \"2\"}"
Additional options available for specific formats. See our format guide for the complete list.
"{\"foo\": \"bar\"}"
If set, translations for the uploaded language will be fetched automatically.
true
Indicates whether all translations mentioned in the upload should be verified.
true
Indicated whether the imported translations should be marked as reviewed. This setting is available if the review workflow is enabled for the project.
true
Indicates whether only keys affected (created or updated) by the upload should be tagged. The default is false
true
This prefix will be added to all uploaded translation key names to prevent collisions. Use a meaningful prefix related to your project or file to keep key names organized.
"prefix_"
When true, the automation rules for the project will not fire for this upload, so no jobs are created as a side effect of importing this file. Defaults to false.
false
Response
Created
Processing state of the upload: initialized, processing, success, or error. error means processing failed — for example the file could not be parsed, or a provided file_format didn't match the file's actual content. Poll this field until it leaves initialized/processing to get the final outcome.
A user-facing message explaining why the upload failed, or null if the upload did not fail.
This message is intended for display only. Its wording may change at any time and it should not be parsed or relied upon programmatically.
Unique tag of the upload
List of tags that were assigned to the uploaded keys
The URL to the upload in Phrase Strings app.
Show child attributes
Show child attributes
{
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "johndoe",
"name": "John Doe",
"gravatar_uid": "205e460b479e2e5b48aec07710c08d50"
}
Show child attributes
Show child attributes
Was this page helpful?