Developer API

REST-Schnittstelle zur Anbindung externer Shop-Systeme an ElsenPlant. Bestellungen aus xt:Commerce, Gambio oder anderen Systemen automatisch importieren und den Bearbeitungsstatus in Echtzeit abfragen.

1. Authentifizierung

Alle API-Endpunkte erfordern ein gültiges JWT-Token im Authorization-Header. Tokens werden über den Wave API-Key-Mechanismus ausgestellt.

Token abrufen
curl -X POST https://www.elsenplant.com/api/token?key=YOUR_API_KEY

Das erhaltene Token bei allen weiteren Requests als Bearer-Token mitsenden:

Authorization: Bearer eyJ0eXAiOiJKV1Qi...

2. API-Endpunkte

Methode Endpunkt Beschreibung
POST /api/v1/imports/orders Bestellungen importieren
GET /api/v1/imports/orders Import-Liste (paginiert)
GET /api/v1/imports/orders/{ext_nr} Import-Status abfragen
GET /api/v1/orders/{ext_ref}/status Auftragsstatus abfragen

2.1 Bestellungen importieren

POST /api/v1/imports/orders

Überträgt eine oder mehrere Bestellungen aus dem externen Shop an ElsenPlant.

Request-Body

POST /api/v1/imports/orders
{
  "orders": [
    {
      "order_number": "XTC-20260220-4711",
      "source": "xtcommerce",
      "customer": {
        "external_id": "CUST-1234",
        "email": "max@example.com",
        "first_name": "Max",
        "last_name": "Mustermann",
        "company": "Garten GmbH",
        "phone": "+49 170 1234567",
        "address": "Gartenweg 42",
        "city": "München",
        "postal_code": "80331",
        "country": "Deutschland"
      },
      "items": [
        {
          "external_product_id": "ART-5001",
          "sku": "TAX-OFF-120",
          "name": "Taxus baccata",
          "quantity": 10,
          "unit_price_net": 45.50,
          "tax_rate": 7,
          "size_1": "100",
          "size_2": "120",
          "quality_1": "Sol",
          "quality_2": "3xv"
        }
      ],
      "totals": {
        "net": 455.00,
        "tax": 31.85,
        "gross": 486.85
      },
      "payment_method": "Vorkasse",
      "payment_status": "paid",
      "shipping_type": "spedition",
      "customer_note": "Bitte Lieferung ab April",
      "metadata": {
        "tracking_id": "XT-TRACK-4711",
        "campaign": "fruehling2026"
      }
    }
  ]
}

Pflichtfelder

Feld Typ Beschreibung
order_numberstringEindeutige Bestellnummer im Quellsystem
customer.emailstringE-Mail-Adresse des Kunden
customer.first_namestringVorname
customer.last_namestringNachname
customer.addressstringStraße und Hausnummer
customer.citystringStadt
customer.postal_codestringPostleitzahl
items[].namestringProduktname
items[].quantityintegerMenge (min. 1)
items[].unit_price_netfloatNetto-Einzelpreis

Optionale Felder

Feld Standard Beschreibung
sourcextcommerceQuellsystem-Kennung
customer.external_idKunden-ID im Quellsystem
customer.companyFirmenname
customer.phoneTelefonnummer
customer.countryDeutschlandLand
customer.is_critical NEUnullKunde als kritisch markieren (boolean)
has_shipping_address NEUfalseAbweichende Versandadresse vorhanden
shipping_first_name NEUVersand: Vorname
shipping_last_name NEUVersand: Nachname
shipping_company NEUVersand: Firma
shipping_address NEUVersand: Straße und Hausnummer
shipping_apartment NEUVersand: Adresszusatz
shipping_city NEUVersand: Stadt
shipping_postal_code NEUVersand: PLZ
shipping_country NEUVersand: Land
shipping_phone NEUVersand: Telefon
has_billing_address NEUfalseAbweichende Rechnungsadresse vorhanden
billing_first_name NEURechnung: Vorname
billing_last_name NEURechnung: Nachname
billing_company NEURechnung: Firma
billing_email NEURechnung: E-Mail
billing_address NEURechnung: Straße und Hausnummer
billing_apartment NEURechnung: Adresszusatz
billing_city NEURechnung: Stadt
billing_postal_code NEURechnung: PLZ
billing_country NEURechnung: Land
billing_phone NEURechnung: Telefon
items[].skuArtikelnummer
items[].tax_rate7MwSt.-Satz (ganze Zahl: 7 oder 19)
items[].size_1 / size_2Sortiermaß (Höhe von/bis in cm)
items[].quality_1 / quality_2Qualitätsmerkmale (z.B. Sol, 3xv, mDb)
totalsSummen (net, tax, gross)
payment_methodZahlungsart
is_paidfalseBezahlstatus
shipping_typeVersandart: selbstabholung, eigenes_fahrzeug oder spedition
customer_noteKundennotiz
metadata NEUnullBeliebige Zusatzdaten als JSON-Objekt (Tracking-IDs, externe Referenzen, Custom-Felder)

Validierungsregeln

Feld Typ Max Pflicht
ordersarray50 EinträgeJa
orders[].itemsarray100 EinträgeJa
customer.first_namestring255Ja
customer.last_namestring255Ja
customer.addressstring500Ja
customer.citystring255Ja
customer.postal_codestring20Ja
customer.companystring255Nein
customer.phonestring50Nein
customer.countrystring100Nein
customer.is_critical NEUbooleanNein
has_shipping_address NEUbooleanNein
shipping_first_name NEUstring255Nein
shipping_last_name NEUstring255Nein
shipping_company NEUstring255Nein
shipping_address NEUstring255Nein
shipping_apartment NEUstring255Nein
shipping_city NEUstring255Nein
shipping_postal_code NEUstring20Nein
shipping_country NEUstring255Nein
shipping_phone NEUstring50Nein
has_billing_address NEUbooleanNein
billing_first_name NEUstring255Nein
billing_last_name NEUstring255Nein
billing_company NEUstring255Nein
billing_email NEUemail255Nein
billing_address NEUstring255Nein
billing_apartment NEUstring255Nein
billing_city NEUstring255Nein
billing_postal_code NEUstring20Nein
billing_country NEUstring255Nein
billing_phone NEUstring50Nein
items[].namestring500Ja
items[].quantityinteger99.999Ja
items[].unit_price_netnumeric999.999,99Ja
items[].tax_rateinteger100Nein
items[].skustring100Nein
items[].descriptionstring2.000Nein
items[].notestring1.000Nein
totals.net / tax / grossnumeric9.999.999,99Nein
payment_methodstring100Nein
shipping_typestringin: selbstabholung, eigenes_fahrzeug, speditionNein
customer_notestring5.000Nein
metadata NEUobjectNein

Limits pro Request: Maximal 50 Bestellungen mit je maximal 100 Positionen.

Adresslogik NEU

Standardmäßig gilt: Kundenadresse = Versandadresse = Rechnungsadresse. Nur wenn has_shipping_address: true werden die shipping_*-Felder als abweichende Versandadresse verwendet. Nur wenn has_billing_address: true werden die billing_*-Felder als abweichende Rechnungsadresse verwendet.

Abwärtskompatibilität: Die bisherigen Felder has_delivery_address, delivery_name, delivery_address, delivery_city, delivery_postal_code und delivery_country werden weiterhin akzeptiert und automatisch auf die neuen shipping_*-Felder gemappt. delivery_name wird in shipping_first_name + shipping_last_name aufgeteilt.

Tax-Rate-Normalisierung: Wird tax_rate als Dezimalwert (z.B. 0.07) übergeben, wird automatisch auf Ganzzahl normalisiert (7).

Response (201 Created)

{
  "success": true,
  "imported": [
    {
      "id": 42,
      "external_order_number": "XTC-20260220-4711",
      "status": "new",
      "received_at": "2026-02-20T15:10:00+00:00"
    }
  ],
  "duplicates": [],
  "errors": []
}

Duplikat-Erkennung: Bestellungen mit identischer Kombination aus source + order_number werden als Duplikate erkannt und nicht erneut importiert. Sie erscheinen im duplicates-Array der Response.

2.2 Import-Liste abrufen

GET /api/v1/imports/orders

Paginierte Liste der eigenen Importe. Optional filterbar nach Status.

Parameter Beschreibung
statusFilter: new, processing, completed, failed, duplicate
pageSeite (Standard: 1, 25 Einträge pro Seite)

2.3 Import-Status abfragen

GET /api/v1/imports/orders/{external_order_number}

Gibt den vollständigen Import inkl. Items anhand der externen Bestellnummer zurück.

2.4 Auftragsstatus abfragen

GET /api/v1/orders/{external_reference}/status

Aktuellen Bearbeitungsstatus eines übernommenen Auftrags abfragen.

Response (200)
{
  "external_reference": "XTC-20260220-4711",
  "order_status": "Bestätigt",
  "order_status_id": 3
}

Auftragsstatus-Werte

ID Name Beschreibung
1AnfrageKundenanfrage eingegangen
2BearbeitungAuftrag wird bearbeitet
3Angebot erstelltAngebot wurde dem Kunden gesendet
4BestätigtKunde hat bestätigt
5VersendetWare wurde versendet
6AbholbereitWare steht zur Abholung bereit
7StorniertAuftrag wurde storniert

3. Datenmodell & Feldmappings

Mapping der Felder zwischen xt:Commerce und ElsenPlant:

xt:Commerce Import API ElsenPlant Order
orders_idorder_numberexternal_reference
customers_idcustomer.external_id
customers_email_addresscustomer.emailemail
customers_firstnamecustomer.first_namefirst_name
customers_lastnamecustomer.last_namelast_name
customers_companycustomer.companycompany
customer.is_critical NEUcustomers.is_critical
products_nameitems[].nameorder_items[].display
products_modelitems[].sku
products_quantityitems[].quantityorder_items[].quantity
products_priceitems[].unit_price_netorder_items[].unit_price_net
products_taxitems[].tax_rateorder_items[].tax_rate
metadata NEUmetadata

4. Fehlercodes

HTTP Status Bedeutung
200Erfolg (nur Duplikate oder GET-Anfrage)
201Import(e) erfolgreich erstellt
401Nicht authentifiziert (Token fehlt oder ungültig)
403Keine Berechtigung (Zugriff auf fremde Ressource)
404Ressource nicht gefunden
422Validierungsfehler
429Rate Limit (max. 60 Requests/Minute)

5. Workflow-Beispiel

Kompletter Ablauf zur Anbindung eines xt:Commerce-Shops:

Schritt 1: Token abrufen
TOKEN=$(curl -s -X POST https://www.elsenplant.com/api/token?key=YOUR_KEY | jq -r .token)
Schritt 2: Bestellungen importieren
curl -X POST https://www.elsenplant.com/api/v1/imports/orders \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "orders": [{
      "order_number": "XTC-20260220-4711",
      "customer": {
        "email": "max@example.com",
        "first_name": "Max",
        "last_name": "Mustermann",
        "address": "Gartenweg 42",
        "city": "München",
        "postal_code": "80331"
      },
      "items": [{
        "name": "Taxus baccata",
        "quantity": 10,
        "unit_price_net": 45.50
      }]
    }]
  }'
Schritt 3: Auftragsstatus abfragen
curl https://www.elsenplant.com/api/v1/orders/XTC-20260220-4711/status \
  -H "Authorization: Bearer $TOKEN"

Datenfluss

Alter Shop POST /api/v1/imports/orders ElsenPlant

Import-Staging (Status: new)

Admin prüft im Import-Dashboard

Kunde zuordnen/anlegen

Als Order übernehmen (Status: completed)

Weiter im bestehenden Workflow:

Preisanfrage → Abruf → Angebot → Versand

Alter Shop GET /api/v1/orders/{'{ref}'}/status Aktuellen Status abfragen

6. Demo-Shop

Testen Sie die API interaktiv mit unserem Demo-Shop. Die Seite simuliert eine fiktive „Online Baumschule“ mit 10 vordefinierten Bestellungen, die Sie per Klick an ElsenPlant senden und deren Status in Echtzeit abfragen können.

Hinweise

  • Jeder API-Key ist an einen Benutzer gebunden. Importe und Statusabfragen sind auf den eigenen Account beschränkt.
  • Die API ist auf 60 Requests pro Minute pro API-Key begrenzt.
  • Pro Request maximal 50 Bestellungen mit je 100 Positionen.
  • MwSt.-Sätze werden als Ganzzahl erwartet (7, 19). Dezimalwerte werden automatisch normalisiert.
  • Bestellungen werden nicht sofort als Auftrag übernommen, sondern landen im Import-Staging zur manuellen Prüfung.
  • Duplikate (gleiche source + order_number) werden erkannt und nicht erneut importiert.

Fragen zur API-Integration? Kontakt aufnehmen