curl --request POST \
--url https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"term": "Sign in",
"doNotTranslate": false,
"caseSensitive": false,
"usageStatus": "preferred",
"notes": "Use the verb form; never capitalize mid-sentence.",
"translations": {
"fr": "Se connecter",
"de": "Anmelden"
}
}
'import requests
url = "https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms"
payload = {
"term": "Sign in",
"doNotTranslate": False,
"caseSensitive": False,
"usageStatus": "preferred",
"notes": "Use the verb form; never capitalize mid-sentence.",
"translations": {
"fr": "Se connecter",
"de": "Anmelden"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
term: 'Sign in',
doNotTranslate: false,
caseSensitive: false,
usageStatus: 'preferred',
notes: 'Use the verb form; never capitalize mid-sentence.',
translations: {fr: 'Se connecter', de: 'Anmelden'}
})
};
fetch('https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms', 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.textsetu.com/api/v1/glossaries/{glossaryId}/terms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'term' => 'Sign in',
'doNotTranslate' => false,
'caseSensitive' => false,
'usageStatus' => 'preferred',
'notes' => 'Use the verb form; never capitalize mid-sentence.',
'translations' => [
'fr' => 'Se connecter',
'de' => 'Anmelden'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.textsetu.com/api/v1/glossaries/{glossaryId}/terms"
payload := strings.NewReader("{\n \"term\": \"Sign in\",\n \"doNotTranslate\": false,\n \"caseSensitive\": false,\n \"usageStatus\": \"preferred\",\n \"notes\": \"Use the verb form; never capitalize mid-sentence.\",\n \"translations\": {\n \"fr\": \"Se connecter\",\n \"de\": \"Anmelden\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.textsetu.com/api/v1/glossaries/{glossaryId}/terms")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"term\": \"Sign in\",\n \"doNotTranslate\": false,\n \"caseSensitive\": false,\n \"usageStatus\": \"preferred\",\n \"notes\": \"Use the verb form; never capitalize mid-sentence.\",\n \"translations\": {\n \"fr\": \"Se connecter\",\n \"de\": \"Anmelden\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"term\": \"Sign in\",\n \"doNotTranslate\": false,\n \"caseSensitive\": false,\n \"usageStatus\": \"preferred\",\n \"notes\": \"Use the verb form; never capitalize mid-sentence.\",\n \"translations\": {\n \"fr\": \"Se connecter\",\n \"de\": \"Anmelden\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"term": {
"id": "a1b2c3d4-0000-4000-8000-000000000020",
"glossaryId": "a1b2c3d4-0000-4000-8000-000000000010",
"term": "Sign in",
"doNotTranslate": false,
"caseSensitive": false,
"usageStatus": "preferred",
"notes": "Use the verb form; never capitalize mid-sentence.",
"createdAt": "2026-01-15T09:24:00.000Z",
"updatedAt": "2026-02-02T14:05:00.000Z",
"translations": [
{
"languageCode": "fr",
"value": "Se connecter",
"status": "approved",
"approvedAt": "2026-01-16T11:00:00.000Z",
"proposedValue": null
}
]
}
}
}Create a term
Add a term to the glossary. Optionally supply translations as a languageCode -> value map. When the glossary requires approval, values you cannot approve are recorded as proposals — see the glossary guide.
Constraints:
- Creating a term whose text already exists in the glossary returns 409.
curl --request POST \
--url https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"term": "Sign in",
"doNotTranslate": false,
"caseSensitive": false,
"usageStatus": "preferred",
"notes": "Use the verb form; never capitalize mid-sentence.",
"translations": {
"fr": "Se connecter",
"de": "Anmelden"
}
}
'import requests
url = "https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms"
payload = {
"term": "Sign in",
"doNotTranslate": False,
"caseSensitive": False,
"usageStatus": "preferred",
"notes": "Use the verb form; never capitalize mid-sentence.",
"translations": {
"fr": "Se connecter",
"de": "Anmelden"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
term: 'Sign in',
doNotTranslate: false,
caseSensitive: false,
usageStatus: 'preferred',
notes: 'Use the verb form; never capitalize mid-sentence.',
translations: {fr: 'Se connecter', de: 'Anmelden'}
})
};
fetch('https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms', 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.textsetu.com/api/v1/glossaries/{glossaryId}/terms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'term' => 'Sign in',
'doNotTranslate' => false,
'caseSensitive' => false,
'usageStatus' => 'preferred',
'notes' => 'Use the verb form; never capitalize mid-sentence.',
'translations' => [
'fr' => 'Se connecter',
'de' => 'Anmelden'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.textsetu.com/api/v1/glossaries/{glossaryId}/terms"
payload := strings.NewReader("{\n \"term\": \"Sign in\",\n \"doNotTranslate\": false,\n \"caseSensitive\": false,\n \"usageStatus\": \"preferred\",\n \"notes\": \"Use the verb form; never capitalize mid-sentence.\",\n \"translations\": {\n \"fr\": \"Se connecter\",\n \"de\": \"Anmelden\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.textsetu.com/api/v1/glossaries/{glossaryId}/terms")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"term\": \"Sign in\",\n \"doNotTranslate\": false,\n \"caseSensitive\": false,\n \"usageStatus\": \"preferred\",\n \"notes\": \"Use the verb form; never capitalize mid-sentence.\",\n \"translations\": {\n \"fr\": \"Se connecter\",\n \"de\": \"Anmelden\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.textsetu.com/api/v1/glossaries/{glossaryId}/terms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"term\": \"Sign in\",\n \"doNotTranslate\": false,\n \"caseSensitive\": false,\n \"usageStatus\": \"preferred\",\n \"notes\": \"Use the verb form; never capitalize mid-sentence.\",\n \"translations\": {\n \"fr\": \"Se connecter\",\n \"de\": \"Anmelden\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"term": {
"id": "a1b2c3d4-0000-4000-8000-000000000020",
"glossaryId": "a1b2c3d4-0000-4000-8000-000000000010",
"term": "Sign in",
"doNotTranslate": false,
"caseSensitive": false,
"usageStatus": "preferred",
"notes": "Use the verb form; never capitalize mid-sentence.",
"createdAt": "2026-01-15T09:24:00.000Z",
"updatedAt": "2026-02-02T14:05:00.000Z",
"translations": [
{
"languageCode": "fr",
"value": "Se connecter",
"status": "approved",
"approvedAt": "2026-01-16T11:00:00.000Z",
"proposedValue": null
}
]
}
}
}Authorizations
API token: tsu_pat_… (PAT) or tsu_proj_… (project token). The token's granted RBAC permissions determine access; see each operation's x-permission.
Path Parameters
Glossary id (UUID) or id-embedded path slug.
Body
The source-language term this entry defines.
1 - 500"Sign in"
When true, the term must be left untranslated (brand names, product names).
false
When true, matching and QA checks respect the term's exact casing.
false
Whether the term is preferred, deprecated, or forbidden. Defaults to preferred.
preferred, deprecated, forbidden "preferred"
Optional guidance for translators on how to use the term.
2000"Use the verb form; never capitalize mid-sentence."
Optional seed translations as a languageCode -> value map.
Show child attributes
Show child attributes
{ "fr": "Se connecter", "de": "Anmelden" }

