Zolltarifliche Einreihung für EU und China
Verbinden Sie Ihr System, starten Sie eine EU- oder China-Einreihung und rufen Sie Code, Quellen und angewandte Tarifversion ab.
Diese API reiht ein Produkt in die Nomenklatur der gewählten Rechtsordnung ein:
| Rechtsordnung | Ergebnis | Route |
|---|---|---|
| Europäische Union | 8-stellige KN und 10-stelliger TARIC | /v1/classify |
| China | 10-stelliger GACC-Warencode und 3-stelliger CIQ-Zusatz | /v1/classify-china |
Die Verarbeitung ist asynchron: Erstellen Sie einen Job, fragen Sie seinen Status ab und lesen Sie nach Abschluss result.
Amtliche Referenzen für 2026
| Rechtsraum | Amtliche Referenz | Anwendung |
|---|---|---|
| Europäische Union | Durchführungsverordnung (EU) 2025/1926, KN 2026 | Seit 1. Januar 2026 |
| China | Tarifanpassungsplan 2026, Bekanntmachung Nr. 11 von 2025 | Seit 1. Januar 2026 |
| China | Tarifabfrage der chinesischen Generalzollverwaltung | Operative Prüfung von Codes und Sätzen |
Die Antwort ist der technische Nachweis für den jeweiligen Vorgang. Lesen Sie immer provenance.applied_tariff_date, provenance.tariff_date_basis und provenance.corpus_versions. latest_available_snapshot bedeutet, dass während eines Tarifwechsels der neueste verfügbare Stand angewandt wurde.
Einstieg mit 3 Aufrufen
1. Schlüssel konfigurieren
Öffnen Sie Ihre Organisation im Organisationsbereich, erstellen Sie unter Entwickler einen Schlüssel und weisen Sie den erforderlichen Scope zu:
| Route | Erforderlicher Scope |
|---|---|
/v1/classify/... | classify |
/v1/classify-china/... | classify_china |
Bewahren Sie den Schlüssel auf Ihrem Server auf. Stellen Sie ihn niemals in einem Browser oder einer mobilen Anwendung bereit.
export TTH_API_KEY="th_live_ihr_api_schluessel"2. Job erstellen
curl -sS -X POST "https://api.thetradehub.eu/v1/classify/jobs" \
-H "X-API-Key: $TTH_API_KEY" \
-H "Idempotency-Key: produkt-4821-eu-20260910" \
-H "Content-Type: application/json" \
-d '{
"content": "Kabelloser Bluetooth-Kopfhörer mit aktiver Geräuschunterdrückung und USB-C-Ladeanschluss",
"analysis_mode": "operational",
"locale": "de",
"classification_date": "2026-09-10"
}'Eine neue Anfrage gibt 202 Accepted zurück. Eine Wiederholung mit demselben Idempotency-Key gibt den bestehenden Job mit 200 OK zurück.
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "pending",
"analysis_mode": "operational",
"created_at": "2026-09-10T10:30:00Z",
"updated_at": "2026-09-10T10:30:00Z"
}3. Ergebnis abrufen
Verwenden Sie dieselbe Routenfamilie, mit der der Job erstellt wurde.
curl -sS "https://api.thetradehub.eu/v1/classify/jobs/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "X-API-Key: $TTH_API_KEY"Fragen Sie den Job nach 1, 2, 4 und danach alle 5 Sekunden ab, bis der Status completed oder failed lautet.
Vollständiges Beispiel
import os
import time
import uuid
import httpx
BASE_URL = "https://api.thetradehub.eu"
API_KEY = os.environ["TTH_API_KEY"]
ROUTES = {"eu": "classify", "china": "classify-china"}
def classify_product(
content: str,
jurisdiction: str = "eu",
analysis_mode: str = "operational",
classification_date: str | None = None,
) -> dict:
route = ROUTES[jurisdiction]
timeout_seconds = 12 * 60 if analysis_mode == "operational" else 18 * 60
headers = {
"X-API-Key": API_KEY,
"Idempotency-Key": str(uuid.uuid4()),
}
payload = {
"content": content,
"analysis_mode": analysis_mode,
"locale": "de",
}
if classification_date:
payload["classification_date"] = classification_date
with httpx.Client(base_url=BASE_URL, headers=headers, timeout=30) as client:
response = client.post(f"/v1/{route}/jobs", json=payload)
response.raise_for_status()
job_id = response.json()["id"]
deadline = time.monotonic() + timeout_seconds
delay = 1
while time.monotonic() < deadline:
response = client.get(f"/v1/{route}/jobs/{job_id}")
response.raise_for_status()
job = response.json()
if job["status"] == "completed":
return job["result"]
if job["status"] == "failed":
raise RuntimeError(job.get("error", "Classification failed"))
time.sleep(delay)
delay = min(delay * 2, 5)
raise TimeoutError(f"Job {job_id} wird noch verarbeitet")
result = classify_product(
"Kreiselpumpe aus Edelstahl für Flüssiglebensmittel",
jurisdiction="china",
classification_date="2026-09-10",
)
decision = result["classification"]
china = result.get("china") or decision.get("china")
print(china.get("code13") or china["code10"])
print(decision["provenance"]["applied_tariff_date"])Datenpfade
| Wert | EU | China |
|---|---|---|
| Empfohlener Code | result.classification.recommended_code | result.china.code13 oder result.china.code10 |
| Gemeinsamer HS-Code | Erste 6 Stellen | result.china.hs6 |
| Konfidenz | result.classification.candidates[0].confidence | result.china.confidence |
| Begründung | result.classification.candidates[0].legal_position | result.china.justification |
| Rechtlicher Status | result.classification.status | gleicher Pfad |
| Angewandtes Tarifdatum | result.classification.provenance.applied_tariff_date | gleicher Pfad |
| Korpusversionen | result.classification.provenance.corpus_versions | gleicher Pfad |
| Dossier-ID | result.session_id | result.session_id |
Wenn result.classification.status den Wert review_required hat, wurde eine verwertbare Einreihung geliefert, die vor einer Zollanmeldung menschlich geprüft werden muss.
Struktur eines EU-Ergebnisses
{
"status": "completed",
"result": {
"session_id": "run_abc123",
"classification": {
"jurisdiction": "eu",
"status": "completed",
"recommended_code": "8518300090",
"candidates": [
{
"rank": 1,
"code": "8518300090",
"description": "Kopf- und Ohrhörer",
"confidence": 0.94,
"legal_position": "Einreihung nach den anwendbaren AV und Anmerkungen"
}
],
"provenance": {
"applied_tariff_date": "2026-09-10T00:00:00Z",
"tariff_date_basis": "request",
"corpus_versions": {}
}
}
}
}Struktur eines China-Ergebnisses
{
"status": "completed",
"result": {
"session_id": "run_def456",
"classification": {
"jurisdiction": "china",
"status": "completed",
"recommended_code": "8413709990999",
"provenance": {
"applied_tariff_date": "2026-09-10T00:00:00Z",
"tariff_date_basis": "request",
"corpus_versions": {}
}
},
"china": {
"code10": "8413709990",
"code13": "8413709990999",
"hs6": "841370",
"description_zh": "离心泵",
"confidence": 0.91,
"justification": "Einreihung nach dem chinesischen Zolltarif und den nationalen Anmerkungen",
"ciq_candidates": [],
"selected_ciq": "999",
"declaration_elements": [],
"supervision_codes": [],
"quarantine_categories": [],
"units": "",
"mfn_rate": "",
"vat_rate": "",
"validated": true,
"verification_status": "operational",
"warnings": []
}
}
}Die Werte zeigen nur die Antwortstruktur und sind keine Einreihungsauskunft für die beschriebenen Waren.
Akzeptierte Felder
| Feld | Typ | Erforderlich | Verwendung |
|---|---|---|---|
content | string | Bedingt | Ausführliche Beschreibung, Produktblatt oder strukturierte Daten |
image_urls | string[] | Bedingt | Bis zu 5 HTTPS-Bilder |
image_base64 | string | Bedingt | Base64-codiertes Bild |
image_media_type | string | Mit image_base64 | MIME-Typ |
analysis_mode | operational oder legal_deep | Nein | Standard: operational |
locale | fr, en, es oder de | Nein | Sprache der Antwort |
classification_date | ISO-Datum YYYY-MM-DD | Nein | Anzuwendendes Tarifdatum |
product_identity | object | Nein | Hersteller, Name, Modell und Referenz |
technical_facts | object[] | Nein | Technische Fakten mit Quellen |
transaction_context | object | Nein | Bestimmung, Endnutzer und bekannte Verwendung |
taric_code | string | Nur China | Optionaler Vergleichshinweis, niemals automatische Umrechnung |
Mindestens content, image_urls oder image_base64 muss vorhanden sein.
Status und Zeitlimits
| Ebene | Werte |
|---|---|
| Job | pending, processing, completed, failed |
| Entscheidung | completed, review_required |
| Batch-Element | completed, failed, timeout |
Das Gateway erlaubt bis zu 11 Minuten für operational und 17 Minuten für legal_deep. Konfigurieren Sie clientseitig 12 beziehungsweise 18 Minuten. 202 bedeutet, dass der Job angenommen, aber noch nicht abgeschlossen wurde.
Batch, Historie und Quellen
Verwenden Sie /v1/classify/batch für die EU oder /v1/classify-china/batch für China. Fragen Sie danach GET /v1/{route}/batch/{batch_id} ab.
Jede Anfrage enthält 1 bis 1.000 Zeilen und gibt eine einzige übergeordnete Batch-ID zurück. Der Dienst teilt die Verarbeitung in dauerhafte Teil-Batches zu je 100 auf und führt höchstens 32 Einreihungen gleichzeitig aus. Eine Datei mit 500 Zeilen erzeugt 5 interne Teil-Batches, eine Datei mit 1.000 Zeilen erzeugt 10. Verwenden Sie pro Zeile eine stabile id. Senden Sie nach einem Teilfehler nur die fehlgeschlagenen Zeilen mit einem neuen Batch-Idempotency-Key erneut.
Ersetzen Sie {route} durch classify oder classify-china.
| Bedarf | Anfrage |
|---|---|
| Historie auflisten | GET /v1/{route}/history?page=1&per_page=20 |
| Einreihung lesen | GET /v1/{route}/history/{log_id} |
| CSV exportieren | GET /v1/{route}/history/export?from=2026-09-01&to=2026-09-30 |
| Eingefrorene Quellen auflisten | GET /v1/{route}/runs/{run_id}/sources |
| Quelle lesen | GET /v1/{route}/runs/{run_id}/source?source_id={source_id} |
Fehler und Wiederholungen
{
"error": "eindeutige Fehlerbeschreibung"
}| HTTP | Maßnahme |
|---|---|
400 | Anfrage korrigieren und nicht unverändert wiederholen |
401 | X-API-Key prüfen |
403 | Erforderlichen Scope hinzufügen oder Modul aktivieren |
404 | ID und besitzende Organisation prüfen |
429 | Retry-After beachten und denselben Idempotency-Key verwenden |
502, 503, 504 | Mit Backoff und demselben Idempotency-Key wiederholen |
Protokollieren Sie niemals den API-Schlüssel, Base64-Bilder oder vertrauliche Geschäftsdaten.
Last updated on