Zum Inhalt springen

API Reference

Base URL

https://enricha.dev/v1

Alle Endpoints sind unter dem /v1-Prefix erreichbar. Die OpenAPI-Spezifikation ist maschinenlesbar verfuegbar:

OpenAPI Spec (JSON)


Authentifizierung

Die API nutzt Bearer Token Authentication. Sende deinen API Key im Authorization-Header:

Authorization: Bearer enr_dein_api_key

API Keys werden mit POST /v1/auth/keys erstellt. Kein Account, kein Passwort noetig.


Endpoints

POST /v1/auth/keys

Erstellt einen neuen API Key und Customer-Account.

Rate Limit: 5 pro Stunde pro IP-Adresse.

Request Body (alle Felder optional):

FeldTypBeschreibung
emailstring | nullE-Mail fuer Account-Recovery (optional)
namestring | nullName (optional)

Response 200:

{
"api_key": "enr_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"key_prefix": "enr_a1b2c3d4",
"message": "Save this key now — it will not be shown again."
}

Der vollstaendige API Key wird nur einmal angezeigt.


POST /v1/enrich

Enrichment-Pipeline: GPC-Klassifikation + GDM-Attributgenerierung + DQX-Validierung.

Auth: Bearer Token erforderlich. Kosten: 1 Enrichment pro Call (Cache-Hits sind kostenlos). Rate Limit: 60 Requests/Minute pro API Key (konfigurierbar).

Request Body:

FeldTypPflichtBeschreibung
product_namestringJaProduktname (1-500 Zeichen)
descriptionstringNeinProduktbeschreibung (max 2000)
brandstringNeinMarkenname (max 255)
net_contentstringNeinNettofuellmenge, z.B. “750ml”
ingredientsstringNeinZutatenliste (max 5000)
category_hintstringNeinKategorie-Hinweis, z.B. “Wein”
eanstringNeinEAN/GTIN Barcode (max 20)
target_marketstringNeinISO 3166-1 numerisch (Default: “276” = Deutschland)
market_stagestringNein”list_order”, “move_store” oder “sell” (Default: “sell”)

Response 200:

{
"enrichment_id": "550e8400-e29b-41d4-a716-446655440000",
"gpc": {
  "brick_code": "10000266",
  "brick_name": "Wein - Still",
  "hierarchy": [
    {"code": "50000000", "name": "Food/Beverage/Tobacco"},
    {"code": "50200000", "name": "Getraenke"},
    {"code": "50202200", "name": "Wein"},
    {"code": "10000266", "name": "Wein - Still"}
  ],
  "confidence": 0.94,
  "alternatives": [
    {"brick_code": "10000268", "brick_name": "Schaumwein", "confidence": 0.05}
  ],
  "strategy": "two_pass"
},
"attributes": {
  "mandatory": [
    {
      "attribute_name": "descriptionShort",
      "display_name": "Trade Item Description",
      "value": "Riesling Spaetlese 2024",
      "data_type": "text",
      "source": "input_mapped",
      "confidence": 1.0,
      "requirement": "mandatory"
    }
  ],
  "optional": []
},
"dqx": {
  "score": 85,
  "passed": true,
  "errors": [],
  "warnings": [
    {
      "rule_id": "ENR-004",
      "message": "Recommended optional attribute missing",
      "severity": "warning",
      "attribute": "countryOfOrigin"
    }
  ],
  "gdsn_rules_applied": 22
},
"metadata": {
  "enrichments_used": 1,
  "enrichments_remaining": 99,
  "processing_time_ms": 2340,
  "model_version": "mistral-small-latest",
  "tokens_used": 1240,
  "reference_data_version": "2026-Q1",
  "gdm_version": "2.16",
  "gdsn_version": "3.1.35",
  "cache_hit": false
}
}

Attribute Sources:

SourceBeschreibungConfidence
input_mappedDeterministisch aus Input extrahiert1.0
ai_inferredVom LLM generiert0.0 - 1.0

Hinweis: Der DQX-Score ist enrichas Qualitaetsindikator auf Basis einer Teilmenge offizieller GDSN-Regeln — kein offizielles GS1-DQX-Assessment.

DQX Rule IDs:

PrefixBeschreibung
ENR-001Pflichtattribut fehlt
ENR-002Pflichtattribut leer
ENR-003Wert nicht in Code-Liste
ENR-004Empfohlenes optionales Attribut fehlt
ENR-005Niedrige Confidence (Hinweis, kein Abzug)
ENR-006Cross-Attribut-Inkonsistenz
GDSN-*Offizielle GS1 GDSN-Validierungsregel

GET /v1/enrichments

Aktueller Enrichment-Saldo und Kaufhistorie.

Auth: Bearer Token erforderlich.

Response 200:

{
"balance": 95,
"total_used": 5,
"total_purchased": 100,
"last_purchase": "2026-04-01T14:30:00Z"
}

GET /v1/usage

Enrichment-Nutzungsstatistiken nach Zeitraum.

Auth: Bearer Token erforderlich.

Response 200:

{
"today": {"enrichments_count": 12, "enrichments_used": 12},
"week": {"enrichments_count": 45, "enrichments_used": 45},
"month": {"enrichments_count": 180, "enrichments_used": 180},
"all_time": {"enrichments_count": 320, "enrichments_used": 320},
"avg_dqx_score": 82.5
}

GET /v1/health

System-Status (keine Authentifizierung noetig).

Response 200:

{
"status": "healthy",
"checks": {
  "database": "ok",
  "reference_data": {
    "version": "2026-Q1",
    "gpc_count": 6450,
    "gdm_count": 10100,
    "code_list_count": 20591
  },
  "llm_provider": {
    "status": "configured",
    "adapter": "OpenAICompatAdapter"
  }
}
}

POST /v1/webhooks/lemonsqueezy

Lemon Squeezy Payment-Webhook (intern). Verifiziert via HMAC-SHA256.


Rate Limiting

Alle authentifizierten Endpoints sind rate-limited (Standard: 60 Requests/Minute pro API Key).

Response Headers:

HeaderBeschreibung
X-RateLimit-LimitErlaubte Requests pro Minute
X-RateLimit-RemainingVerbleibende Requests
X-RateLimit-ResetSekunden bis Reset
Retry-AfterSekunden bis Retry (nur bei 429)

Allgemeine Response Headers

HeaderBeschreibung
X-Request-IDEindeutige Request-ID (UUID) fuer Debugging

Fehlerformat

Alle Fehler folgen einem einheitlichen Format. Details unter Error Codes.