Two curl commands — one per auth method — are all you need to localize an English product listing for Amazon Germany, apply the marketplace rule template, and return a quality-gated JSON result.
Subscribe on RapidAPI See request body See response Check a listing free
Before subscribing, test with the free POST /try endpoint — no API key required.
Send any listing and get a gate-verified result back in seconds.
curl -X POST https://listloco.hayasaka.app/try \
-H "Content-Type: application/json" \
-d '{"listing":{"title":"Cordless drill AB-1200","brand":"Bosch"}}'
The free trial is rate-limited. For full EN→DE localization and higher quota, subscribe on RapidAPI. See listloco.hayasaka.app/try for details.
Subscribe on RapidAPI to get your X-RapidAPI-Key, then paste
it in place of <YOUR_RAPIDAPI_KEY> in the snippet for
your language. All three examples call
https://listloco.p.rapidapi.com/localize and return the same
gate-verified JSON — choose whichever runtime fits your stack.
Subscribe on RapidAPI See full request body
import requests
payload = {
"marketplace": "amazon",
"sourceLang": "en",
"targetLang": "de",
"listing": {
"title": "Cordless drill AB-1200 with 8.5 kg battery and 2 m cable",
"description": "Cordless drill AB-1200 with a 8.5 kg battery and a 2 m cable.",
"brand": "Bosch",
"material": "Metall",
"size": "M",
"color": "blue",
"quantity": 1
},
"dictionary": {
"cordless": "kabellos",
"drill": "Bohrmaschine",
"with": "mit",
"and": "und",
"a": "ein",
"battery": "Akku",
"cable": "Kabel",
"blue": "blau"
}
}
response = requests.post(
"https://listloco.p.rapidapi.com/localize",
json=payload,
headers={
"X-RapidAPI-Key": "<YOUR_RAPIDAPI_KEY>",
"X-RapidAPI-Host": "listloco.p.rapidapi.com",
"Content-Type": "application/json"
}
)
print(response.json())
const body = {
marketplace: "amazon",
sourceLang: "en",
targetLang: "de",
listing: {
title: "Cordless drill AB-1200 with 8.5 kg battery and 2 m cable",
description: "Cordless drill AB-1200 with a 8.5 kg battery and a 2 m cable.",
brand: "Bosch",
material: "Metall",
size: "M",
color: "blue",
quantity: 1
},
dictionary: {
cordless: "kabellos",
drill: "Bohrmaschine",
with: "mit",
and: "und",
a: "ein",
battery: "Akku",
cable: "Kabel",
blue: "blau"
}
};
const response = await fetch("https://listloco.p.rapidapi.com/localize", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-RapidAPI-Key": "<YOUR_RAPIDAPI_KEY>",
"X-RapidAPI-Host": "listloco.p.rapidapi.com"
},
body: JSON.stringify(body)
});
const result = await response.json();
console.log(result);
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://listloco.p.rapidapi.com/localize",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-RapidAPI-Key: <YOUR_RAPIDAPI_KEY>",
"X-RapidAPI-Host: listloco.p.rapidapi.com"
],
CURLOPT_POSTFIELDS => json_encode([
"marketplace" => "amazon",
"sourceLang" => "en",
"targetLang" => "de",
"listing" => [
"title" => "Cordless drill AB-1200 with 8.5 kg battery and 2 m cable",
"description" => "Cordless drill AB-1200 with a 8.5 kg battery and a 2 m cable.",
"brand" => "Bosch",
"material" => "Metall",
"size" => "M",
"color" => "blue",
"quantity" => 1
],
"dictionary" => [
"cordless" => "kabellos",
"drill" => "Bohrmaschine",
"with" => "mit",
"and" => "und",
"a" => "ein",
"battery" => "Akku",
"cable" => "Kabel",
"blue" => "blau"
]
])
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
ListLoco is distributed via RapidAPI. Subscribe to the free or paid plan on RapidAPI and copy your X-RapidAPI-Key from the dashboard. No separate backend credential is needed for the RapidAPI path.
Use case: an English-language listing for Amazon.com that you want to publish on Amazon DE. The API enforces Amazon Germany's title character limit, banned keyword list, required attributes, and number/model-number preservation in a single deterministic pass — the same rules that cause suppressed listings when violated. The output is English to German localized copy that is ready to verify before submission.
1 Via RapidAPI (recommended)
Replace <YOUR_RAPIDAPI_KEY> with the key from your
RapidAPI dashboard. The host listloco.p.rapidapi.com is
fixed — copy it exactly.
curl -s -X POST "https://listloco.p.rapidapi.com/localize" \
-H "Content-Type: application/json" \
-H "X-RapidAPI-Key: <YOUR_RAPIDAPI_KEY>" \
-H "X-RapidAPI-Host: listloco.p.rapidapi.com" \
--data '{
"marketplace": "amazon",
"sourceLang": "en",
"targetLang": "de",
"listing": {
"title": "Cordless drill AB-1200 with 8.5 kg battery and 2 m cable",
"description": "Cordless drill AB-1200 with a 8.5 kg battery and a 2 m cable.",
"brand": "Bosch",
"material": "Metall",
"size": "M",
"color": "blue",
"quantity": 1
},
"glossary": { "preserve": ["Bosch"] },
"dictionary": {
"cordless": "kabellos",
"drill": "Bohrmaschine",
"with": "mit",
"and": "und",
"a": "ein",
"battery": "Akku",
"cable": "Kabel",
"blue": "blau"
}
}'
2 Direct API (self-hosted / local dev)
For local development or self-hosted deployments where
LISTLOCO_API_KEYS is configured. Pass the backend key via
x-api-key or Authorization: Bearer. This
path is not available through the public RapidAPI
gateway.
curl -s -X POST https://listloco.hayasaka.app/localize \
-H "Content-Type: application/json" \
-H "x-api-key: <YOUR_API_KEY>" \
--data '{
"marketplace": "amazon",
"sourceLang": "en",
"targetLang": "de",
"listing": {
"title": "Cordless drill AB-1200 with 8.5 kg battery and 2 m cable",
"description": "Cordless drill AB-1200 with a 8.5 kg battery and a 2 m cable.",
"brand": "Bosch",
"material": "Metall",
"size": "M",
"color": "blue",
"quantity": 1
},
"glossary": { "preserve": ["Bosch"] },
"dictionary": {
"cordless": "kabellos",
"drill": "Bohrmaschine",
"with": "mit",
"and": "und",
"a": "ein",
"battery": "Akku",
"cable": "Kabel",
"blue": "blau"
}
}'
All fields are required unless marked optional. The marketplace,
sourceLang, and targetLang select the rule template —
currently only "amazon" / "en" / "de"
is supported. The glossary.preserve array locks brand names and
model numbers so they survive translation and the
preservation gate does not flag them as corrupted.
The dictionary map provides known word translations and
is the primary mechanism for consistent Amazon DE listing localization
from English to German.
{
"marketplace": "amazon", // required — rule template selector
"sourceLang": "en", // required — source language code
"targetLang": "de", // required — target language code
"listing": {
"title": "...", // required — plain-text title
"description": "...", // required — plain-text description
"brand": "...", // required — brand name
"material": "...", // required — material
"size": "...", // required — size
"color": "...", // required — color
"quantity": 1 // required — integer quantity
},
"glossary": {
"preserve": ["Bosch", "AB-1200"] // optional — strings never altered by translation
},
"dictionary": { // optional — source→target word map
"cordless": "kabellos",
"drill": "Bohrmaschine"
}
}
A successful request returns HTTP 200 with a JSON body containing
the localized listing fields, gate results for all six quality checks,
a violations array (empty when all gates pass), and a
top-level pass boolean. A pass: false result
means at least one gate failed — check violations for the
exact field and reason. Common causes: title exceeds Amazon Germany's
character limit, a banned keyword appeared in the
German copy, a model number or unit was altered during translation
(preservation gate), or the back-translation divergence score exceeded
the threshold.
{
"localized": {
"title": "Kabellose Bohrmaschine AB-1200 mit 8,5-kg-Akku und 2-m-Kabel",
"description": "Kabellose Bohrmaschine AB-1200 mit einem 8,5-kg-Akku und einem 2-m-Kabel.",
"brand": "Bosch",
"material": "Metall",
"size": "M",
"color": "blau",
"quantity": 1
},
"gates": {
"titleLength": { "pass": true, "length": 67, "limit": 200 },
"bannedWords": { "pass": true },
"requiredAttributes": { "pass": true },
"preservation": { "pass": true },
"glossary": { "pass": true },
"backTranslation": { "pass": true, "score": 0.12, "threshold": 0.25 }
},
"violations": [],
"pass": true
}
When a gate fails, the response contains pass: false and a
violations array. Each violation includes a message
explaining what failed and a hint telling you exactly what to
fix. Here is a real failing response for a listing that contains a banned
word and a missing required attribute:
{
"localized": {
"title": "Kabellose Bohrmaschine AB-1200 garantiert top",
"description": "Kabellose Bohrmaschine AB-1200 mit ein Akku und ein Kabel.",
"brand": "Bosch",
"material": "Metall",
"color": "blau",
"quantity": 1
},
"gates": {
"titleLength": { "pass": true, "violations": [] },
"bannedWords": { "pass": false, "violations": [
{
"type": "banned_word",
"word": "garantiert",
"message": "The term 'garantiert' is not permitted in this marketplace.",
"hint": "Remove this term."
}
]},
"requiredAttributes": { "pass": false, "violations": [
{
"type": "missing_attribute",
"attribute": "size",
"message": "Required attribute 'size' is absent or empty.",
"hint": "Add the missing attribute."
}
]},
"preservation": { "pass": true, "violations": [] },
"glossary": { "pass": true, "violations": [] },
"backTranslation": { "pass": true, "score": 0.18, "threshold": 0.25, "enforced": true }
},
"violations": [
{
"gate": "bannedWords",
"type": "banned_word",
"word": "garantiert",
"message": "The term 'garantiert' is not permitted in this marketplace.",
"hint": "Remove this term."
},
{
"gate": "requiredAttributes",
"type": "missing_attribute",
"attribute": "size",
"message": "Required attribute 'size' is absent or empty.",
"hint": "Add the missing attribute."
}
],
"pass": false
}
Read each violation's message to understand what rule was
broken, then follow its hint to fix it. The gate
field tells you which quality check raised the violation.
After fixing all violations, re-submit until pass: true.
Ready to localize your Amazon DE listings?
The Free plan on RapidAPI includes 100 listings/month — no credit card required. Paid plans unlock higher quotas and overage billing.
Subscribe on RapidAPI — Free plan available See plans and pricingTrack your monthly usage in every response
Every successful (HTTP 200) response includes three headers that show your current billing period usage, so you can see how many listings remain before you reach your plan's monthly allowance.
X-Quota-Limit: 100
X-Quota-Used: 12
X-Quota-Remaining: 88
Check X-Quota-Remaining before sending a large batch. When it reaches
zero on the Free plan, the next request returns HTTP 402 (QUOTA_EXCEEDED).
Upgrade your plan on RapidAPI to continue without interruption.
Every response runs six deterministic checks. The same input always returns the same result — no random variation.
glossary.preserve appears verbatim in the localized output.Download the ready-made Postman collection to explore both endpoints without writing any code. Open Postman, choose Import → Link, and paste the URL below — or click the button to download the file directly.
Collection variables: base_url is pre-set to
https://listloco.hayasaka.app.
Set rapidapi_key to your RapidAPI subscription key before
sending the Localize a listing request.
Download collection Get your RapidAPI key
Collection URL (for Import → Link):
https://listloco.hayasaka.app/listloco.postman_collection.json
Every non-2xx response from POST /localize includes three fields:
error (human-readable message), code (stable
machine-readable identifier), and docs (URL to this section).
Switch on code in your client — the exact wording of
error may change, but code values are frozen.
| HTTP | Code | Meaning | How to fix |
|---|---|---|---|
| 400 | EMPTY_BODY |
Request body is empty. | Send a JSON body (see request reference). |
| 400 | INVALID_JSON |
Body could not be parsed as JSON. | Verify the body is valid JSON and Content-Type: application/json is set. |
| 400 | INVALID_BODY |
Body is valid JSON but not a JSON object. | Send a JSON object, not an array or scalar. |
| 413 | BODY_TOO_LARGE |
Request body exceeds the 1 MiB limit. | Reduce the body size. A single listing should be well under 1 KiB. |
| 401 | AUTH_REQUIRED |
Missing or invalid API key. | Add Authorization: Bearer <key> or x-api-key: <key>. |
| 401 | RAPIDAPI_GATEWAY_REQUIRED |
Request did not arrive through the RapidAPI gateway. | Use https://listloco.p.rapidapi.com/localize with your RapidAPI key, not the direct URL. |
| 429 | RATE_LIMITED |
Too many requests in the current window. | Wait retryAfterMs milliseconds (also in Retry-After header) before retrying. |
| 402 | QUOTA_EXCEEDED |
Monthly listing quota exhausted. The response body includes upgrade_url — the RapidAPI subscription page — so you can navigate directly to a paid plan from your API client. |
Read response.upgrade_url and open it to subscribe to a higher plan, or wait for the next billing cycle. |
| 422 | PIPELINE_ERROR |
Body is valid JSON but structurally invalid for the pipeline. | Ensure listing is a non-null JSON object. Check the request reference for required fields. |
| 500 | INTERNAL_ERROR |
Unexpected server error. | Retry once. If it persists, contact support via the privacy page email. |
Subscribe to a plan on RapidAPI and paste your key into the curl command above. The OpenAPI spec documents every field and error code. The blog covers common Amazon DE localization problems — suppressed listings, banned keywords, and model-number preservation — with worked examples.
Subscribe on RapidAPI See plans and pricing OpenAPI spec Read the blog