Amazon · English → German

Get started with ListLoco in minutes

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

Step 0 — Try it free, no signup

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.

Using ListLoco from RapidAPI

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

Python (requests)

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())

Node.js (fetch)

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

<?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;

Prerequisites

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)

RapidAPI

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)

Direct

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"
    }
  }'

Request body reference

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"
  }
}

Response

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
}

Understanding violations

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 pricing
Quota

Track 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.

Quality gates

Every response runs six deterministic checks. The same input always returns the same result — no random variation.

Import into Postman

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.

Postman

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

Error reference

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.

Error codes
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.

Next steps

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