curl --request GET \
--url https://api.dittowords.com/v2/components/export \
--header 'Authorization: <api-key>'import requests
url = "https://api.dittowords.com/v2/components/export"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.dittowords.com/v2/components/export', 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.dittowords.com/v2/components/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.dittowords.com/v2/components/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dittowords.com/v2/components/export")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dittowords.com/v2/components/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"@@locale": "en",
"component-item-dev-id": "<em>Some other</em> text",
"component-item-dev-id-2": "Some <strong>base</strong> text",
"@component-item-dev-id-2": {
"placeholders": {
"username": {
"type": "String"
}
}
}
}{
"message": "Variant with id \"<variantId>\" not found"
}Export components
Returns components in your workspace in the provided format.
curl --request GET \
--url https://api.dittowords.com/v2/components/export \
--header 'Authorization: <api-key>'import requests
url = "https://api.dittowords.com/v2/components/export"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.dittowords.com/v2/components/export', 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.dittowords.com/v2/components/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.dittowords.com/v2/components/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dittowords.com/v2/components/export")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dittowords.com/v2/components/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"@@locale": "en",
"component-item-dev-id": "<em>Some other</em> text",
"component-item-dev-id-2": "Some <strong>base</strong> text",
"@component-item-dev-id-2": {
"placeholders": {
"username": {
"type": "String"
}
}
}
}{
"message": "Variant with id \"<variantId>\" not found"
}Authorizations
Query Parameters
Stringified JSON filter object. Supports the following filter fields:
folders: array of objects withid(folder developer ID orrootfor root-level components) and optionalexcludeNestedFolders(boolean)statuses: array of status strings (NONE,WIP,REVIEW,FINAL). These are stored status keys; by default the web app and Figma plugin display them as NONE = "Draft", WIP = "In Progress", REVIEW = "In Review", FINAL = "Final" (a workspace may rename these or replace the set entirely, so none of these keys are guaranteed to exist — read the workspace's actual statuses from GET /v2/statuses or the list_statuses MCP tool rather than assuming this set).tags: object withvalues(array of tag strings) and optionaloperator(ANDorOR, defaults toOR)assignee: email string to match assigned components, ornullfor unassignedintegrated: boolean value to filter by components that are or are not marked as integrated into development
By default, folder filters search for components in that folder and its folder children. To skip searching folder children for a given folder, set excludeNestedFolders to true.
Example: {"folders":[{"id":"folder-id"},{"id":"folder-id-2","excludeNestedFolders":true}], "statuses":["NONE","WIP","FINAL","REVIEW"], "tags":{"values":["tag-1"],"operator":"OR"}, "assignee":"user@example.com", "integrated":true}
When set to html or html_paragraphs, returns HTML-formatted rich text instead of plain text.
html_paragraphswraps all text in<p>tags. Matches legacy behavior.htmlexports without wrapping tags and uses<br />for line breaks.
html, html_paragraphs By default, base text will be returned. Provide a variant parameter to specify which variant of the filtered base text items to return.
Output format for exported components.
json_icu, json_i18next, json_vue_i18n, ios-strings, ios-stringsdict, android, arb Order in which variables are indexed in positional format exports (ios-strings, ios-stringsdict, android). "alphabetical" assigns indices by variable name (a=1, b=2, ...); "default" preserves the existing creation-order assignment.
default, alphabetical When true, omits the __variant-name and __variant-description keys from variant exports in JSON formats (json_i18next, json_vue_i18n, json_icu). Defaults to false. Has no effect on any other formats nor any base text (non-variant) exports, which never include these keys.
true When true, adds a __variables_used key to json_i18next and json_vue_i18n exports: a deduplicated, alphabetical array of the names of the variables used in the exported strings. Defaults to false. Has no effect on other formats.
true Response
Returns components matching the filter criteria in the provided format
For json_icu, json_i18next, json_vue_i18n formats, object keys are developer-ids (strings) and values are text (strings). Variant exports in these formats also include __variant-name and __variant-description keys (strings) unless excludeVariantMetadata=true. When includeVariableSummary=true, json_i18next and json_vue_i18n exports also include a __variables_used key, whose value is an array of variable names. For arb, values are text (strings) except for the optional top-level @@locale key (string) and @<developer-id> metadata keys, which are objects.
The text value for the developer-id key, the __variant-name/__variant-description value for variant exports, or the @@locale value for arb exports